wp_transition_post_status

Вызывает фильтры для любых изменений статусов записей (с draft на publish, с publish на private и т.д.).

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

Для реальной смены статуса поста, используйте функции: wp_update_post() или wp_publish_post().

Хуки, которые вызывает функция:

  1. Первый хук: transition_post_status:

    do_action('transition_post_status', $new_status, $old_status, $post);

    Если нужно подключиться при любом изменении статуса.

  2. Второй хук: OLDSTATUS_to_NEWSTATUS:

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

    Если нужно подключиться при конкретных изменениях статуса (с одного на другой).

  3. Третий хук: NEWSTATUS_POSTTYPE:

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

    Если у нужно подключится когда у записи указанного типа статус меняется на указанный.

Хуки срабатывающие при изменении статусов записей

Список всех статусов, которые могут применяться в хуках:

  • new – если еще не было установленных никаких статусов;

  • publish – опубликованный пост (страница или тип записи);

  • pending – запись на рассмотрении перед публикацией;

  • draft – черновик записи;

  • auto-draft – только созданный пост, еще без заголовка, контента и другой информации;

  • future – запись запланированная к публикации в будущем;

  • private – запись не доступная не авторизованным пользователям;

  • inherit – ревизия или вложение (revision or attachment). Смотрите get_children();

  • trash – запись находящаяся в корзине. С версии 2.9.
Хуки из функции:
(new_status)_(post_type)
(old_status)_to_(new_status)
transition_post_status
Возвращает

Ничего не возвращает.

Использование

wp_transition_post_status( $new_status, $old_status, $post );
$new_status(строка) (обязательный)
Какой статус поста будет.
По умолчанию: нет
$old_status(строка) (обязательный)
Какой статус поста был.
По умолчанию: нет
$post(объект) (обязательный)
Данные поста. Объект.
По умолчанию: нет

Примеры

#1. Как работает функция

Чтобы посмотреть как работает функция, давайте взглянем на код функции 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 );

	/** This action is documented in wp-includes/post.php */
	do_action( 'edit_post', $post->ID, $post );

	/** This action is documented in wp-includes/post.php */
	do_action( "save_post_{$post->post_type}", $post->ID, $post, true );

	/** This action is documented in wp-includes/post.php */
	do_action( 'save_post', $post->ID, $post, true );

	/** This action is documented in wp-includes/post.php */
	do_action( 'wp_insert_post', $post->ID, $post, true );
}

#2. Использование хука {$old_status}_to_{$new_status}

Добавим действие, которое будет срабатывать при изменении статуса draft на publish (draft_to_publish), т.е. при публикации черновика.

add_action( 'draft_to_publish', 'your_callback' );
function your_callback($post) {
	// ваш код
}

Если нам нужно подключится к моменту одобрения (pending) поста, то нам нужно использовать хук pending_to_publish.

#3. Использование хука transition_post_status

Это общий хук, срабатывает когда нам нужно подключиться в момент смены любого статуса на любой. Хук передает 3 параметра: $new_status, $old_status, $post.
Этот пример показывает как подключаться, когда статус поста меняется с publish на любой другой статус:

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

#3.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 ) {
		// Статус поста изменен
	}
}

#3. Использование хука {$new_status}_{$post->post_type}

Если нам нужно подключиться к смене статуса на указанный у типа записи: конструкция СТАТУС_ТИПЗАПИСИ. То используем этот хук.
Например, нам нужно что-то сделать когда публикуется пост. Наша конструкция будет выглядеть так publish_post:

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

Заметки

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

Код из


wp-includes/post.php

WP 4.7.2

<?php
function wp_transition_post_status( $new_status, $old_status, $post ) {
	/**
	 * Fires when a post is transitioned from one status to another.
	 *
	 * @since 2.3.0
	 *
	 * @param string  $new_status New post status.
	 * @param string  $old_status Old post status.
	 * @param WP_Post $post       Post object.
	 */
	do_action( 'transition_post_status', $new_status, $old_status, $post );

	/**
	 * Fires when a post is transitioned from one status to another.
	 *
	 * The dynamic portions of the hook name, `$new_status` and `$old status`,
	 * refer to the old and new post statuses, respectively.
	 *
	 * @since 2.3.0
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action( "{$old_status}_to_{$new_status}", $post );

	/**
	 * Fires when a post is transitioned from one status to another.
	 *
	 * The dynamic portions of the hook name, `$new_status` and `$post->post_type`,
	 * refer to the new post status and post type, respectively.
	 *
	 * Please note: When this action is hooked using a particular post status (like
	 * 'publish', as `publish_{$post->post_type}`), it will fire both when a post is
	 * first transitioned to that status from something else, as well as upon
	 * subsequent post updates (old and new status are both the same).
	 *
	 * Therefore, if you are looking to only fire a callback when a post is first
	 * transitioned to a status, use the {@see 'transition_post_status'} hook instead.
	 *
	 * @since 2.3.0
	 *
	 * @param int     $post_id Post ID.
	 * @param WP_Post $post    Post object.
	 */
	do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *