web-dev-qa-db-ja.com

Wordpressの添付ファイルのワークフロー

アップロードしたファイルのワークフローを有効にしたり使用する方法を探していました(私の場合は写真)。特定のロール/機能を持つユーザーは、投稿に関連するファイルをアップロードできるはずです。投稿には、投稿ビューでギャラリーとして使用される配列を保持するカスタムフィールドもあります。

私が欲しいのは:
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を使用しています

1
Michael N.

これが私がいかに簡単なメディアワークフローを実現したかです。セキュリティチェックとサニタイズは誰にでもできます。

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'
      ));
    }
  }
}
0
Michael N.