WordPress как на ладони
wordpress jino

wp_transition_post_status() WP 2.3

Вызывает фильтры для любых изменений статусов записей (с 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);

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

    Несколько полезных вариантов хука:

    • new_to_publish - при первой публикации новой записи, например если запись добавляется функцией wp_insert_post().
    • auto-draft_to_publish - при первой публикации новой записи из админки WP.
    • draft_to_publish - при публикации, сохраненной записи.
    • future_to_publish - при публикации запланированной записи.
  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.

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

Используется в: wp_publish_post().
Хуки из функции:
Возвращает

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

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

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 );

	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 );
}

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

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

add_action( 'draft_to_publish', function( $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.2 Использование хука {$new_status}_{$post->post_type}

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

Например, если нужно что-то сделать когда пост публикуется или обновляется со статусом publish, то конструкция будет выглядеть так publish_post:

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

Обратите внимание, что этот хук будет срабатывать и при обновлении записи, если при обновлении статут указан publish или если статус не был указан, но при этом до этого он был publish.

Код wp transition post status: wp-includes/post.php VER 4.9.7

<?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 );
}

Cвязанные функции

Из метки: statuses (статус записи коммента юзера)

Еще из раздела: Остальное

Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться