Вопрос или проблема
Я пытаюсь разобраться, как добавить набор новых статусов публикации для пользовательских типов записей в WordPress, так как я хотел бы сделать следующее:
Пользователь входит в систему и использует пользовательский тип записи для заполнения полей информации. После завершения тип записи должен быть установлен в статус “ожидание утверждения” и быть доступным для просмотра, но не редактируемым пользователем. Затем администратор должен иметь возможность установить статус “утверждено” (после установки этого статуса пользователь не может редактировать запись) или “требуется проверка”, после чего пользователь снова может редактировать запись только один раз, так как она должна снова перейти в статус “ожидание утверждения”. Последним статусом является “отклонено”, который останавливает пользователя от редактирования записи и делает ее доступной только для просмотра.
Мне нужно выяснить, возможно ли удалить или изменить параметры по умолчанию в окне публикации, чтобы добавить свой собственный статус и как установить записи в упомянутые выше статусы.
Любая помощь или направление в правильное русло были бы очень полезны, так как я провел много времени в поиске в Google, но не нашел ничего, что показало бы мне способ достичь этого.
Спасибо!
Итак, это код ниже, который я пытаюсь заставить работать. Я настроил его так, что, когда запись изменяется на “опубликовано”, мне должно быть разрешено выполнить wp_update_post, но я получаю следующую ошибку:
Попытка получить свойство невидимого объекта в /Applications/MAMP/htdocs/wordpress/wp-includes/capabilities.php на строке 207
function wpdocs_run_on_publish_only( $new_status, $old_status, $post )
{
if ( ( 'publish' == $new_status && 'publish' !== $old_status )
&& 'cbre_access_form' == $post->post_type)
{
$my_post = array(
'ID' => $post->post_ID,
'post_title' => 'Это новый заголовок записи.',
'post_content' => 'Это новое содержание.',
'post_status' => 'awaiting_review',
);
wp_update_post( $my_post );
}
}
add_action( 'transition_post_status', 'wpdocs_run_on_publish_only', 10, 3 );
Вы читали Пользовательские статусы на codex.wordpress.org/Post_Status?
ВНИМАНИЕ:
Эта функция НЕ добавляет зарегистрированный статус публикации в панель администрирования. Эта функциональность запланирована к реализации в будущем. Пожалуйста, обратитесь к Trac Ticket #12706. Рассмотрите возможность использования hook-действияpost_submitbox_misc_actions
для добавления этого параметра.
Добавление пользовательского статуса в WordPress осуществляется через функцию register_post_status()
. Эта функция позволяет определить статус записи и то, как он будет функционировать в WordPress.
function custom_post_status(){
register_post_status( 'unread', array(
'label' => _x( 'Непрочитано', 'post' ),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Непрочитано <span class="count">(%s)</span>', 'Непрочитано <span class="count">(%s)</span>' ),
) );
}
add_action( 'init', 'custom_post_status' );
Хотя, похоже, пользовательский статус записи пока не поддерживается в админской метабоксе публикаций, возможно, он будет добавлен в будущем патче.
Ответ или решение
Создание и настройка пользовательских статусов для типов записей в WordPress представляет собой интересную задачу, особенно когда необходимо реализовать специфические бизнес-процессы такие как одобрение и рецензирование контента. В вашем случае вы хотите создать несколько пользовательских статусов для постов, которые изменят доступ и возможности редактирования соответствующего содержимого. Мы рассмотрим, как можно добавить такие статусы и настроить их функции в WordPress.
Теория
В стандартной установке WordPress предусмотрены определённые статусы публикации, такие как «Опубликован», «Черновик» и «В ожидании». Однако, когда возникает необходимость в более сложных сценариях управления контентом, становится необходимым вводить пользовательские статусы. Это позволяет гибко настраивать видимость и доступ к записи в зависимости от определенных условий.
Пользовательские статусы добавляются с помощью функции register_post_status()
. Эта функция предоставляет возможности для регистрации статусов, которые могут интегрироваться с основной логикой WordPress, включая наличие в административных списках и возможность поиска.
Пример
Давайте посмотрим, как можно добавить пользовательские статусы для вашего сценария:
- Регистрация пользовательских статусов: Мы можем воспользоваться хуком
init
для регистрации статусов.
function register_custom_post_statuses() {
register_post_status('awaiting_approval', array(
'label' => _x('Awaiting Approval', 'post'),
'public' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Awaiting Approval <span class="count">(%s)</span>', 'Awaiting Approval <span class="count">(%s)</span>'),
));
register_post_status('approved', array(
'label' => _x('Approved', 'post'),
'public' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Approved <span class="count">(%s)</span>', 'Approved <span class="count">(%s)</span>'),
));
register_post_status('review_required', array(
'label' => _x('Review Required', 'post'),
'public' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Review Required <span class="count">(%s)</span>', 'Review Required <span class="count">(%s)</span>'),
));
register_post_status('rejected', array(
'label' => _x('Rejected', 'post'),
'public' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Rejected <span class="count">(%s)</span>', 'Rejected <span class="count">(%s)</span>'),
));
}
add_action('init', 'register_custom_post_statuses');
- Настройка прав доступа и функциональности: После добавления пользовательского статуса важно определить, как пользователи будут взаимодействовать с контентом в каждом из состояний.
Для этого можно воспользоваться различными хук-методами и функциями изменения состоянии контента. Например, можно удостовериться, что только администратор может изменять состояние контента от «Ожидание одобрения» до «Отказано» или «Одобрено».
add_filter('user_has_cap', 'disable_posts_editing', 10, 3);
function disable_posts_editing($allcaps, $cap, $args) {
if (!is_admin()) {
return $allcaps;
}
$post = get_post($args[2]);
if ($post->post_type === 'your_custom_post_type') {
if ($post->post_status === 'approved' || $post->post_status === 'rejected') {
$allcaps['edit_post'] = false;
}
if ($post->post_status === 'review_required' && !in_array('administrator', $args[1])) {
$allcaps['edit_post'] = true;
}
}
return $allcaps;
}
Применение
-
Персонализация интерфейса администратора: Чтобы конечные пользователи и администраторы могли взаимодействовать с новыми статусами, вы можете кастомизировать административный интерфейс с помощью предоставленных WordPress действий и фильтров, а также включить новые статусы в метабоксах административной панели. Это может включать использование
post_submitbox_misc_actions
для добавления метаданных. -
Управление потоком: Используйте
transition_post_status
для выполнения действий при смене состояния поста. Например, уведомление пользователя по электронной почте, когда поста переходит в статус «Одобрено». -
Проверка и отладка: Разработайте систему логирования для ловли ошибок и отслеживания переходов между статусами, что поможет вам обнаруживать возможные неточности в вашей логике.
Создание такой системы позволит вам гибко управлять процессами согласования контента, адаптирующимися под ваши бизнес-потребности. Можете адаптировать работы с текущим кодом, чтобы система гибко интегрировалась с вашей текущей инсталляцией WordPress.