アップロードしたファイルのワークフローを有効にしたり使用する方法を探していました(私の場合は写真)。特定のロール/機能を持つユーザーは、投稿に関連するファイルをアップロードできるはずです。投稿には、投稿ビューでギャラリーとして使用される配列を保持するカスタムフィールドもあります。
私が欲しいのは:
1。ユーザーがファイルをアップロード
2。添付ファイルの投稿はmedia_handle_uploadで生成されます
3。添付ファイルは「保留」になりますpost_status
4。 IDが配列に追加されます
5。管理者のみpost_statusを変更する必要があり、写真が表示されます
この場合、post_status != "pending"
の付いた添付ファイルのみを表示するのが簡単です。私の知る限りでは、これはWordpressでは不可能です。
現時点で私の2つの解決策は以下のとおりです。
1。画像に問題がない場合は、管理者にファイルを配列に追加させてください。
2。添付ファイルの投稿にメタフィールドを使用してワークフローを取得する
現時点では見えないWorpressの方法はありますか、それとも2つの解決策のどちらかを使用する必要がありますか?
Wordpress 4.9.8を使用しています
これが私がいかに簡単なメディアワークフローを実現したかです。セキュリティチェックとサニタイズは誰にでもできます。
Wordpressのバージョンに基づく:4.9.8
if (!empty($_FILES) && isset($_POST['postid'])) {
media_handle_upload("attachments", $_POST['postid']);
}
media_handle_upload
を使用している場合、添付ファイルの投稿ステータス保留はできません。この場合、フィルタを使用する必要があります。このフィルタはmedia_handle_upload
を使用する前に追加する必要があります。
add_filter('wp_insert_attachment_data', 'SetAttachmentStatusPending', '99');
function SetAttachmentStatusPending($data) {
if ($data['post_type'] == 'attachment') {
$data['post_status'] = 'pending';
}
return $data;
}
添付ファイル投稿が保留中のpost_statusで追加されました。
Worpress Media Libraryは、privateまたはinherit post_statusの投稿のみを表示します。保留中の状態の投稿を表示するには、フックしてください
add_action('pre_get_posts', array($this, 'QueryAddPendingMedia'));
function QueryAddPendingMedia($query)
{
// Change query only for admin media page
if (!is_admin() || get_current_screen()->base !== 'upload') {
return;
}
$arr = explode(',', $query->query["post_status"]);
$arr[] = 'pending';
$query->set('post_status', implode(',', $arr));
}
ワークフローを完了するには、保留中のメディアを公開するためのものが必要です。これを行うには、メディアライブラリに(一括)アクションを追加します。
add_filter('bulk_actions-upload', 'BulkActionPublish');
function BulkActionPublish($bulk_actions)
{
$bulk_actions['publish'] = __('Publish');
return $bulk_actions;
}
行アクションへのリンクを追加するために、このコードは役に立ちます
add_filter('media_row_actions', 'AddMediaPublishLink', 10, 3);
function AddMediaPublishLink(array $actions, WP_Post $post, bool $detached)
{
if ($post->post_status === 'pending') {
$link = wp_nonce_url(add_query_arg(array('act' => 'publish', 'itm' => $post->ID), 'upload.php'), 'publish_media_nonce');
$actions['publish'] = sprintf('<a href="%s">%s</a>', $link, __("Publish"));
}
return $actions;
}
add_action('load-upload.php', 'RowActionPublishHandle');
add_filter('handle_bulk_actions-upload', 'BulkActionPublishHandler', 10, 3);
function BulkActionPublishHandler($redirect_to, $doaction, $post_ids)
{
if ($doaction !== 'publish') {
return $redirect_to;
}
foreach ($post_ids as $post_id) {
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'publish'
));
}
return $redirect_to;
}
function RowActionPublishHandle()
{
// Handle publishing only for admin media page
if (!is_admin() || get_current_screen()->base !== 'upload') {
return;
}
if (isset($_GET['_wpnonce']) && wp_verify_nonce($_GET['_wpnonce'], 'publish_media_nonce')) {
if (isset($_GET['act']) && $_GET['act'] === 'publish') {
wp_update_post(array(
'ID' => $_GET['itm'],
'post_status' => 'publish'
));
}
}
}