Рабочий процесс для вложений в Wordpress
Я искал способ включить/использовать рабочий процесс для загруженных файлов (в моем случае изображений). Пользователи с определенными ролями/возможностями должны иметь возможность загружать файлы, подключенные к публикации. В публикации также есть настраиваемое поле, содержащее массив, используемый в качестве галереи в представлении публикации.
Чего я хочу, так это:
1. Пользователь загружает файл
2. Сообщение о вложении создается с помощью media_handle_upload
3. Вложение получает "ожидающий" статус post_status
4. Идентификатор добавляется в массив
5. Администратору нужно только изменить post_status, и картинка будет видна
В этом случае было бы легко показывать только вложения с помощью post_status != "pending"
. Насколько я вижу, это невозможно с Wordpress.
Моими двумя решениями на данный момент были бы:
1. Позвольте администратору добавить файл в массив, когда изображение будет в порядке
2. Используйте мета-поле для записи вложения, чтобы получить рабочий процесс
Есть ли способ, который я не вижу в данный момент, или мне следует использовать один из моих двух решения?
Я использую Wordpress 4.9.8
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'
));
}
}
}