какой правильный способ хука при обновлении поста
я пытаюсь использовать хук при обновлении поста, но все хуки, которые я пробую, не срабатывают, кроме 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
@lowtechsun Как сказано в ответе, хуки срабатывают каждый раз, когда запись обновляется, то есть сохраняется в БД. Когда вы нажимаете "Добавить новое", почти сразу после загрузки страницы WP создает черновик записи, сохраняемый в БД, поэтому хуки срабатывают.
gmazzap
Спасибо за ответ. Вчера только узнал об этом и считаю концепцию запутанной. То есть сначала я открываю страницу для добавления новой записи. На этом этапе я думал, что запись еще не создана. Только после нажатия на Публиковать, по моему мнению, должна создаваться новая запись. Продолжая эту мысль, надеюсь, что WP удаляет авто-черновик записи, если я нажал Добавить новое, но ушел со страницы без нажатия Публиковать?
lowtechsun
Почему бы не использовать хук 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