Функция wp_transition_post_status()
в WordPress используется для вызова различных событий (хуков) при изменении статуса поста. Эта функция не меняет статус записи, а только запускает действия, которые могут быть полезны разработчикам для обработки переходов между статусами, например, при публикации черновиков, одобрении постов, удалении их в корзину и т.д.
wp_transition_post_status( string $new_status, string $old_status, WP_Post $post )
Параметры
- $new_status (строка, обязательный) — Новый статус поста.
- $old_status (строка, обязательный) — Статус поста перед изменением.
- $post (объект WP_Post, обязательный) — Объект поста с данными записи.
Подробности работы wp_transition_post_status()
с хуками
Функция wp_transition_post_status()
в WordPress вызывает несколько хуков, которые позволяют разработчикам выполнять определенные действия в зависимости от изменения статуса поста. Это может быть полезно для настройки автоматизированных процессов, таких как отправка уведомлений, обновление данных или запись событий в лог.
Хуки, вызванные функцией
1. transition_post_status
Этот хук используется, если нужно отреагировать на любое изменение статуса записи, вне зависимости от того, какие конкретно статусы участвовали в процессе.
do_action( 'transition_post_status', $new_status, $old_status, $post );
Пример использования:
add_action( 'transition_post_status', 'log_post_status_change', 10, 3 );
function log_post_status_change( $new_status, $old_status, $post ) {
if ( $new_status != $old_status ) {
error_log( "Пост {$post->ID} изменил статус с {$old_status} на {$new_status}" );
}
}
Этот код записывает в журнал все изменения статуса постов на сайте.
2. {$old_status}_to_{$new_status}
Используйте этот динамический хук, если вам нужно выполнить действие только при определенном изменении статуса с одного конкретного на другой.
do_action( "{$old_status}_to_{$new_status}", $post );
Пример использования:
Можно использовать этот хук, например, для выполнения действия при переходе поста из статуса черновика (draft
) в статус публикации (publish
):
add_action( 'draft_to_publish', 'notify_user_on_publish' );
function notify_user_on_publish( $post ) {
wp_mail( $post->post_author->user_email, 'Ваш пост опубликован!', 'Ваш пост теперь доступен для просмотра.' );
}
Полезные варианты динамических хуков:
new_to_publish
— срабатывает при первой публикации новой записи, например, при добавлении записи через функциюwp_insert_post()
.
add_action( 'new_to_publish', 'notify_new_post_publish' );
auto-draft_to_publish
— срабатывает при первой публикации записи, созданной через интерфейс WordPress (например, при добавлении записи через админку).
add_action( 'auto-draft_to_publish', 'auto_draft_publish_notification' );
draft_to_publish
— срабатывает при публикации сохраненной черновой записи.future_to_publish
— используется для запланированных постов, когда они автоматически публикуются.
add_action( 'future_to_publish', 'future_post_publish_handler' );
3. {$new_status}_{$post->post_type}
Этот динамический хук срабатывает для конкретного типа поста при его переходе в определенный статус. Например, если нужно выполнить действие при публикации поста типа product
, используется хук publish_product
.
do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );
Пример использования:
add_action( 'publish_product', 'sync_inventory_after_publish', 10, 2 );
function sync_inventory_after_publish( $post_id, $post ) {
// Синхронизируем складские данные после публикации продукта
update_inventory($post_id);
}
Полезные варианты динамических хуков:
publish_post
— запускается, когда пост типаpost
публикуется или обновляется. Это стандартный хук для постов с типомpost
.pending_post
— срабатывает, когда пост меняет статус наpending
(ожидание проверки).draft_post
— срабатывает, когда пост сохраняется в статусе черновика (draft
).trash_post
— срабатывает при перемещении поста в корзину.
Пример всех доступных статусов для хуков:
new
— статус записи, которая еще не была сохранена.publish
— опубликованная запись.pending
— запись, ожидающая одобрения на публикацию.draft
— черновик записи.auto-draft
— черновик, который был создан автоматически, но еще не заполнен.future
— запись, запланированная к публикации в будущем.private
— частная запись, доступная только авторизованным пользователям.inherit
— используется для вложений (например, медиа-файлов).trash
— запись, находящаяся в корзине.
Пример 1: Публикация поста и вызов хука при переходе статуса с черновика на публикацию
При публикации черновика можно настроить код для выполнения определенных действий с помощью хука draft_to_publish
. Этот хук выполняется, когда статус поста меняется с draft
на publish
.
add_action( 'draft_to_publish', 'notify_author_on_publish' );
function notify_author_on_publish( $post ) {
// Отправляем уведомление автору поста о публикации
wp_mail( $post->post_author->user_email, 'Ваш пост опубликован!', 'Поздравляем, ваш пост был опубликован на сайте!' );
}
Здесь, при публикации черновика, автору отправляется уведомление о публикации.
Пример 2: Запуск действий при любом изменении статуса с помощью хука transition_post_status
Иногда требуется выполнение действий при любом изменении статуса, вне зависимости от того, какой конкретно статус был до или после изменения. В таком случае подойдет общий хук transition_post_status
, передающий параметры $new_status
, $old_status
и $post
.
add_action( 'transition_post_status', 'log_status_change', 10, 3 );
function log_status_change( $new_status, $old_status, $post ) {
if ( $new_status != $old_status ) {
error_log( "Статус поста {$post->ID} изменился с {$old_status} на {$new_status}" );
}
}
Этот код будет записывать в журнал каждое изменение статуса любого поста, упрощая отслеживание изменений.
Пример 3: Использование хука для запланированной публикации поста
При публикации запланированного поста (future_to_publish
) можно настроить событие, которое выполнится именно при переходе статуса future
в publish
.
add_action( 'future_to_publish', 'notify_subscribers_on_publish' );
function notify_subscribers_on_publish( $post ) {
// Уведомляем подписчиков о новой публикации
// Здесь можно разместить код отправки уведомлений подписчикам
send_notifications_to_subscribers( $post->ID );
}
Функция send_notifications_to_subscribers()
должна быть реализована для отправки уведомлений подписчикам. Код срабатывает, когда запланированный пост становится опубликованным.
Пример 4: Обработка изменений статуса записи, связанной с конкретным типом записи
Если требуется отследить изменение статуса для определенного типа записи, например, product
, можно использовать конструкцию {$new_status}_{$post->post_type}
.
add_action( 'publish_product', 'update_product_inventory', 10, 2 );
function update_product_inventory( $post_id, $post ) {
// Обновляем количество на складе для опубликованного продукта
update_inventory_data( $post_id );
}
Этот код будет выполняться, когда запись типа product
публикуется или обновляется с сохранением статуса publish
.
Пример 5: Обработка изменения статуса поста на «корзину»
Когда пост перемещается в корзину, вызывается хук publish_to_trash
. Это удобно, если нужно удалить связанные данные или записать событие в журнал.
add_action( 'publish_to_trash', 'log_post_deletion' );
function log_post_deletion( $post ) {
// Записываем удаление поста в журнал
error_log( "Пост {$post->ID} перемещен в корзину." );
}
Теперь при перемещении поста со статусом publish
в trash
, запись об этом появится в журнале.
Пример 6: Полная реализация обработки изменений статусов
add_action( 'transition_post_status', 'handle_post_status_transition', 10, 3 );
add_action( 'draft_to_publish', 'handle_draft_to_publish' );
add_action( 'publish_to_trash', 'log_post_trash' );
function handle_post_status_transition( $new_status, $old_status, $post ) {
if ( $new_status == 'publish' && $old_status != 'publish' ) {
// Пост опубликован
notify_author($post);
}
}
function handle_draft_to_publish( $post ) {
// Действие при публикации черновика
update_post_meta( $post->ID, '_published_date', current_time( 'mysql' ) );
}
function log_post_trash( $post ) {
// Логируем удаление поста
error_log( "Пост {$post->ID} перемещен в корзину" );
}
function notify_author( $post ) {
wp_mail( $post->post_author->user_email, 'Ваш пост опубликован', 'Пост теперь доступен на сайте' );
}
Заключение
Функция wp_transition_post_status()
предоставляет множество хуков, которые упрощают работу с изменениями статусов в WordPress. Она полезна для разработчиков тем и плагинов, позволяя выполнять задачи при любых изменениях статусов постов.