Хук при перемещении записи в корзину
Я хочу выполнить действие при удалении одного из моих произвольных типов записей. Какой хук мне следует использовать:
wp_trash_mycpt
или
trash_mycpt
Мое действие должно выполняться только когда mycpt
находится в состоянии 'publish', 'draft' или 'future'
и перемещается в состояние 'trash'. Когда запись удаляется из корзины, функция не должна выполняться снова.

Хук wp_trash_post
может быть тем, что вам нужно:
Срабатывает перед перемещением записи в корзину.
Также существует хук trashed_post
:
Срабатывает после перемещения записи в корзину.
Вот пример кода (не тестированный), чтобы вы начали:
function my_wp_trash_post( $post_id ) {
$post_type = get_post_type( $post_id );
$post_status = get_post_status( $post_id );
if ( $post_type == 'mycpt' && in_array(
$post_status, array( 'publish','draft','future' )
)) {
// выполните нужные действия
}
}
add_action( 'wp_trash_post', 'my_wp_trash_post' );

Разве функция wp_trash_post()
не меняет post_status
на trash
перед вызовом хука wp_trash_post
?

Нет, после. Просто посмотрите код.

Хорошо, что это изменили. Помню, когда я смотрел это пару лет назад, дело обстояло иначе!

@dalbaeb До сих пор я использовал хук trash_post, в чем разница между ним и wp_trash_post?

Также, не лучше ли использовать wp_trash_mycpt вместо проверки типа записи внутри функции?

@drtanz Потому что trash_post
устарел. Кроме того, я не смог найти вариативный хук для подобного действия (есть ссылка?), так что wp_trash_post
— действительно лучший вариант из доступных.

Вот связанный тикет: http://core.trac.wordpress.org/ticket/15628
Я фактически использую trash_mycpt в своём плагине, и он работает нормально, поэтому я предположил, что wp_trash_mycpt тоже будет работать.

Запустите вашу функцию при изменении статуса записи с любого из publish
, draft
или future
на trash
.
<?php
function my_function() {
global $post;
if('my_post_type' == $post->post_type) {
// выполните здесь ваши действия
}
}
add_action('publish_to_trash', 'my_function');
add_action('draft_to_trash', 'my_function');
add_action('future_to_trash', 'my_function');
Подробнее: Переходы между статусами записей

Существует действие wp_trash_post
, которое вызывается, но статус записи post_status
изменяется на trash
заранее, что означает, что вы не сможете проверить, была ли запись опубликована и т. д.
ПРАВКА Я был не прав: статус записи post_status
изменяется на trash
ПОСЛЕ вызова действия.
Однако это должно помочь вам начать:
add_action('wp_trash_post', 'my_wp_trash_post')
function my_wp_trash_post(){
if($post->post_type === 'mycpt') :
// Здесь можно выполнить любые необходимые действия
endif;
}
Если это полезно, существует также действие delete_post
. Для получения дополнительной информации см. справочник по действиям для delete_posts
.
