какой правильный способ хука при обновлении поста
я пытаюсь использовать хук при обновлении поста, но все хуки, которые я пробую, не срабатывают, кроме 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 не выводился, или возможно сообщение уже было выведено, но не отображалось из-за отправленных заголовков перенаправления.

При обновлении записи срабатывают следующие хуки:
'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 );
не сделает ничего, потому что действие добавляется после срабатывания хука. В этом примере это очевидно, но в реальном коде не всегда так легко заметить.

Я думаю, что хук '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 Как сказано в ответе, хуки срабатывают каждый раз, когда запись обновляется, то есть сохраняется в БД. Когда вы нажимаете "Добавить новое", почти сразу после загрузки страницы WP создает черновик записи, сохраняемый в БД, поэтому хуки срабатывают.

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

Почему бы не использовать хук 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
