Хук при перемещении записи в корзину
Я хочу выполнить действие при удалении одного из моих произвольных типов записей. Какой хук мне следует использовать:
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?
David Gard
Нет, после. Просто посмотрите код.
montrealist
Хорошо, что это изменили. Помню, когда я смотрел это пару лет назад, дело обстояло иначе!
David Gard
@dalbaeb До сих пор я использовал хук trash_post, в чем разница между ним и wp_trash_post?
urok93
Также, не лучше ли использовать wp_trash_mycpt вместо проверки типа записи внутри функции?
urok93
@drtanz Потому что trash_post устарел. Кроме того, я не смог найти вариативный хук для подобного действия (есть ссылка?), так что wp_trash_post — действительно лучший вариант из доступных.
montrealist
Вот связанный тикет: http://core.trac.wordpress.org/ticket/15628
Я фактически использую trash_mycpt в своём плагине, и он работает нормально, поэтому я предположил, что wp_trash_mycpt тоже будет работать.
urok93
Запустите вашу функцию при изменении статуса записи с любого из 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.