Функция WP_TRANSITION_POST_STATUS() в WordPress: хуки, примеры использования

## WP_TRANSITION_POST_STATUS() │ WP 2.3.0

Функция WP_TRANSITION_POST_STATUS() отвечает за обработку изменения статуса поста в WordPress. Например, когда пост переходит из черновика в опубликованный статус или из опубликованного в закрытый. 

Важно отметить, что эта функция **не меняет статус поста сама по себе**, а только вызывает три хуки. Она используется другими функциями после изменения статуса, чтобы уведомить плагины, темы и основные функции о том, что статус поста изменился. Для реального изменения статуса поста используйте функции wp_update_post() или wp_publish_post().

### Хуки функции

- **transition_post_status**  
  Используется, когда нужно реагировать на любое изменение статуса поста.
  ```php
  do_action( 'transition_post_status', $new_status, $old_status, $post );
  • (old_status)_to_(new_status)
    Используется для отслеживания конкретных изменений статуса поста.

    do_action( "{$old_status}_to_{$new_status}", $post );

    Некоторые полезные варианты:

    • new_to_publish - когда вы впервые публикуете новый пост, например, добавленный через wp_insert_post().
    • auto-draft_to_publish - когда вы впервые публикуете новый пост из админ-панели WP.
    • draft_to_publish - когда вы публикуете сохранённый черновик.
    • future_to_publish - когда вы публикуете запланированный пост.
  • (new_status)_(post_type)
    Используется для выполнения действий в зависимости от статуса и типа поста.

    do_action("{$new_status}_{$post->post_type}", $post->ID, $post);

    Полезные варианты:

    • publish_post - срабатывает каждый раз, когда вы обновляете/создаете пост со статусом «опубликован».
    • pending_post - срабатывает каждый раз, когда вы обновляете/создаете пост со статусом «ожидание».
    • draft_post - срабатывает каждый раз, когда вы обновляете/создаете пост со статусом «черновик».

Список всех статусов, которые могут использоваться в хуках выше

  • new - если статус ещё не установлен.
  • publish - опубликованный пост (страница, пост или другой тип поста).
  • pending - пост на проверке перед публикацией.
  • draft - черновик поста.
  • auto-draft - только созданный пост без заголовка и контента.
  • future - пост запланирован к публикации в будущем.
  • private - пост недоступен неавторизованным пользователям.
  • inherit - ревизия или вложение.
  • trash - пост в корзине.

Эта функция уже используется там, где она нужна в основных возможностях WordPress. Нет необходимости вызывать её при изменении статуса поста через wp_update_post() или wp_insert_post().

Пример использования

wp_transition_post_status( $new_status, $old_status, $post );

Параметры функции

  • $new_status (string, обязательный) - новый статус поста.
  • $old_status (string, обязательный) - предыдущий статус поста.
  • $post (WP_Post, обязательный) - данные поста.

Примеры использования

Пример 1: Хук при любом изменении статуса

add_action( 'transition_post_status', 'intercept_all_status_changes', 10, 3 );
function intercept_all_status_changes( $new_status, $old_status, $post ) {
    if ( $new_status != $old_status ) {
        // Статус поста изменился
    }
}

Пример 2: Как работает функция

Посмотрим на код функции wp_publish_post():

function wp_publish_post( $post ) {
    global $wpdb;

    if ( ! $post = get_post( $post ) )
        return;

    if ( 'publish' == $post->post_status )
        return;

    $wpdb->update( $wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $post->ID ) );

    clean_post_cache( $post->ID );

    $old_status = $post->post_status;
    $post->post_status = 'publish';

    // Теперь, когда статус поста изменился, вызываем хуки, 
    // которые могут использовать другие плагины, темы и функции.
    wp_transition_post_status( 'publish', $old_status, $post );

    do_action( 'edit_post', $post->ID, $post );
    do_action( "save_post_{$post->post_type}", $post->ID, $post, true );
    do_action( 'save_post', $post->ID, $post, true );
    do_action( 'wp_insert_post', $post->ID, $post, true );
}

Пример 3: Использование хука transition_post_status

add_action( 'transition_post_status', 'post_unpublished', 10, 3 );
function post_unpublished( $new_status, $old_status, $post ) {
    if ( $old_status == 'publish' && $new_status != 'publish' ) {
        // Пост убран из публикации
    }
}

Пример 4: Использование хука draft_to_publish

add_action( 'draft_to_publish', function( $post ){
    // Ваш код для обработки публикации черновика
} );

Пример 5: Использование хуков по типу поста

Если вы хотите выполнить действие, когда пост со статусом «опубликован» публикуется или обновляется:

add_action( 'publish_post', 'publish_post_action', 10, 2 );
function publish_post_action($post_id, $post){
    // Действие при публикации поста
}

Изменения с версии 2.3.0

Функция была введена в версии 2.3.0. Она продолжает активно использоваться в WordPress и позволяет гибко управлять изменениями статусов постов и выполнять соответствующие действия.

Заключение

Функция wp_transition_post_status() - это мощный инструмент для работы со статусами постов в WordPress. Она предоставляет разработчикам возможность настраивать и реагировать на изменения статусов, что играет важную роль в процессе управления контентом.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *