какой правильный способ хука при обновлении поста

14 февр. 2014 г., 18:23:23
Просмотры: 88.4K
Голосов: 38

я пытаюсь использовать хук при обновлении поста, но все хуки, которые я пробую, не срабатывают, кроме updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'Это ID моего поста: '.$post_id;
}

Я пробовал использовать add_action('save_post', 'my_function');, но ID не выводился, или возможно сообщение уже было выведено, но не отображалось из-за отправленных заголовков перенаправления.

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

у вас есть пробел после save_post, это опечатка здесь или она была в вашем исходном коде? также, включите отладку во время разработки.

Milo Milo
14 февр. 2014 г. 18:31:47

@Milo извините, опечатка, но не в исходном коде

rusly rusly
14 февр. 2014 г. 18:38:03

если это так, то вы должны увидеть ваш вывод в верхнем левом углу экрана при создании нового поста. сохранение существующего поста происходит перед редиректом, поэтому вы ничего не увидите, если у вас не включена отладка.

Milo Milo
14 февр. 2014 г. 18:42:36
Все ответы на вопрос 2
3
102

При обновлении записи срабатывают следующие хуки:

  • 'pre_post_update' — это действие срабатывает непосредственно перед обновлением записи. Передаётся 2 аргумента: $post_ID и $data (массив всех остальных столбцов таблицы posts в базе данных).
  • 'transition_post_status' — хук, срабатывающий при обновлении, принимает 3 аргумента: $new_post_status, $old_post_status и $post (объект записи).
  • Затем срабатывают ещё 2 динамических хука перехода, их названия формируются на основе старого и нового статуса записи: "{$old_status}_to_{$new_status}" и "{$new_status}_{$post->post_type}". Первый передаёт только объект записи, второй — ID записи и сам объект. Документация доступна здесь.
  • 'edit_post' — передаёт 2 аргумента: $post_ID и $post (объект записи).
  • 'post_updated' — передаёт 3 аргумента: $post_ID, $post_after (объект записи после обновления) и $post_before (объект записи до обновления).
  • Ещё один динамический хук: "save_post_{$post->post_type}", название которого зависит от типа записи. Например, для стандартных записей это 'save_post_post', а для страниц — 'save_post_page'. Этот хук передаёт 3 аргумента: $post_ID, $post (объект) и $update (логическое значение true/false, где true означает, что запись обновляется). Этот хук срабатывает как при создании, так и при обновлении записи.
  • 'save_post' — срабатывает как при обновлении, так и при первом сохранении, передаёт те же 3 аргумента, что и предыдущий хук.
  • 'save_post_{$post_type}' — срабатывает как при обновлении, так и при первом сохранении, передаёт первые 2 аргумента из предыдущего хука.
  • Наконец, есть 'wp_insert_post' — срабатывает как при обновлении, так и при первом сохранении, передаёт те же 3 аргумента, что и два предыдущих хука.

Эти хуки срабатывают при каждом обновлении записи — как через административную панель, так и при "ручном" обновлении с помощью функций wp_update_post или wp_insert_post.

Если запись обновляется через административные страницы, срабатывают дополнительные хуки, например 'update_post_redirect' или 'post_updated_messages'. (Примеры использования см. в ответах на WPSE: этот и этот).

Важно: если вы хотите использовать аргумент хука, который не является первым, его нужно явно указать при вызове add_action.

Например, чтобы использовать аргумент '$update' (третий по счёту) хука 'save_post', необходимо добавить 3 в качестве параметра $accepted_args в add_action (см. документацию):

// Если не добавить 3 в качестве 4-го аргумента, это не будет работать как ожидается
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Это обновление? ';
  $msg .= $update ? 'Да.' : 'Нет.';
  wp_die( $msg );
}

Последнее замечание касается времени выполнения: убедитесь, что add_action вызывается до срабатывания хука, иначе он не сработает.

Например, этот код:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

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

14 февр. 2014 г. 19:08:28
Комментарии

Я думаю, что хук 'save_post' также срабатывает при нажатии на "Добавить новое" (Запись, Страница, CPT) в админке. Чтобы убедиться в этом, просто выполните этот код. `function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id );

print ' post : '; var_export( $post );

print ' update : '; var_export( $update );

wp_die( 'Хук save_post срабатывает при клике на Добавить новое..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );` Почему действие 'save_post' выполняется при Добавить новое, а не при Публикации? Полагаю, для создания авто-черновика записи.

lowtechsun lowtechsun
12 нояб. 2018 г. 19:52:37

@lowtechsun Как сказано в ответе, хуки срабатывают каждый раз, когда запись обновляется, то есть сохраняется в БД. Когда вы нажимаете "Добавить новое", почти сразу после загрузки страницы WP создает черновик записи, сохраняемый в БД, поэтому хуки срабатывают.

gmazzap gmazzap
13 нояб. 2018 г. 11:14:52

Спасибо за ответ. Вчера только узнал об этом и считаю концепцию запутанной. То есть сначала я открываю страницу для добавления новой записи. На этом этапе я думал, что запись еще не создана. Только после нажатия на Публиковать, по моему мнению, должна создаваться новая запись. Продолжая эту мысль, надеюсь, что WP удаляет авто-черновик записи, если я нажал Добавить новое, но ушел со страницы без нажатия Публиковать?

lowtechsun lowtechsun
13 нояб. 2018 г. 11:18:21
0

Почему бы не использовать хук post_updated_messages. Таким образом, вы сможете показывать это сообщение так же, как стандартное сообщение WordPress об обновлении записи.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Пример можно найти здесь:

http://codex.wordpress.org/Function_Reference/register_post_type

в разделе post_updated_messages

14 февр. 2014 г. 18:39:03