Хук при перемещении записи в корзину

15 мар. 2013 г., 17:31:32
Просмотры: 14.6K
Голосов: 6

Я хочу выполнить действие при удалении одного из моих произвольных типов записей. Какой хук мне следует использовать:

wp_trash_mycpt

или

trash_mycpt

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

0
Все ответы на вопрос 3
8
12

Хук 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' );
15 мар. 2013 г. 17:47:25
Комментарии

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

David Gard David Gard
15 мар. 2013 г. 17:51:27

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

montrealist montrealist
15 мар. 2013 г. 17:59:11

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

David Gard David Gard
15 мар. 2013 г. 18:04:17

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

urok93 urok93
15 мар. 2013 г. 19:12:06

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

urok93 urok93
15 мар. 2013 г. 19:13:48

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

montrealist montrealist
15 мар. 2013 г. 20:44:43

Вот связанный тикет: http://core.trac.wordpress.org/ticket/15628

Я фактически использую trash_mycpt в своём плагине, и он работает нормально, поэтому я предположил, что wp_trash_mycpt тоже будет работать.

urok93 urok93
16 мар. 2013 г. 06:46:39

В ссылке нигде не упоминается trash_mycpt. Хорошо, если всё работает нормально, тогда скажите, в чём был смысл вашего вопроса?

montrealist montrealist
17 мар. 2013 г. 00:20:54
Показать остальные 3 комментариев
1

Запустите вашу функцию при изменении статуса записи с любого из 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');

Подробнее: Переходы между статусами записей

15 мар. 2013 г. 17:48:13
Комментарии

Они полезны, но я думаю, wp_trash_post/trash_post будет достаточно в моем случае, так как мне не нужен такой уровень контроля.

urok93 urok93
15 мар. 2013 г. 19:14:55
1

Существует действие 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.

15 мар. 2013 г. 17:47:50
Комментарии

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

urok93 urok93
15 мар. 2013 г. 19:13:14