Рабочий процесс для вложений в Wordpress


Я искал способ включить/использовать рабочий процесс для загруженных файлов (в моем случае изображений). Пользователи с определенными ролями/возможностями должны иметь возможность загружать файлы, подключенные к публикации. В публикации также есть настраиваемое поле, содержащее массив, используемый в качестве галереи в представлении публикации.

Чего я хочу, так это:
1. Пользователь загружает файл
2. Сообщение о вложении создается с помощью media_handle_upload
3. Вложение получает "ожидающий" статус post_status
4. Идентификатор добавляется в массив
5. Администратору нужно только изменить post_status, и картинка будет видна

В этом случае было бы легко показывать только вложения с помощью post_status != "pending". Насколько я вижу, это невозможно с Wordpress.

Моими двумя решениями на данный момент были бы:
1. Позвольте администратору добавить файл в массив, когда изображение будет в порядке
2. Используйте мета-поле для записи вложения, чтобы получить рабочий процесс

Есть ли способ, который я не вижу в данный момент, или мне следует использовать один из моих двух решения?

Я использую Wordpress 4.9.8

Author: Michael N., 2018-10-09

1 answers

Вот как я реализовал простой рабочий процесс мультимедиа. Проверка безопасности и дезинфекция - дело каждого.

На основе версии 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 показывает только записи с личным или унаследованным статусом 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
Author: Michael N., 2018-10-24 14:17:03