Выполнение действия после сохранения записи со всеми связанными post_meta записями (данными)
Мне нужно выполнить пользовательский PHP-код после того, как новая запись сохранена со всеми её метаданными.
Мой вопрос в том, как этого достичь? Пробовал с действием save_post, но оно выполняется до того, как сохраняются мета-записи, поэтому я не могу использовать его в этом случае.
Итак, как я могу запустить свою пользовательскую функцию после того, как запись со всеми связанными данными сохранена в базе данных?
ОБНОВЛЕНО: Я пытался достичь этого следующим кодом в файле functions.php:
add_action( 'save_post', 'wpse41912_save_post' );
function wpse41912_save_post() {
// получаем информацию о последней добавленной записи
$args = array( 'numberposts' => '1', 'post_type' => 'post' );
$recent_posts = wp_get_recent_posts( $args );
$myFunc_latest_id = $recent_posts[0]['ID']; // id последней записи
$myFunc_post_details = get_post($myFunc_latest_id);
print_r($myFunc_post_details);
// как выполнить php код, когда все post meta добавлены?
}
Заранее спасибо!

Для НОВОГО типа записи 'post' используйте хук draft_to_publish
:
function fpw_post_info( $post ) {
if ( 'post' == $post->post_type ) {
// echo '<pre>'; print_r( $post ); echo '<br />';
// $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
// ваш пользовательский код здесь...
}
}
add_action( 'draft_to_publish', 'fpw_post_info', 10, 1 );
В вашей функции обратного вызова $post
- это ваша запись в виде объекта WP_post
. Вы можете получить метаданные записи с помощью функции get_post_meta
.
Для НОВЫХ или ОБНОВЛЕННЫХ записей типа 'post' используйте хук publish_post
:
function fpw_post_info( $id, $post ) {
// echo '<pre>'; print_r( $post ); echo '<br />';
// $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
// ваш пользовательский код здесь...
}
add_action( 'publish_post', 'fpw_post_info', 10, 2 );
В этом случае функция обратного вызова принимает два параметра!

Спасибо, но ничего не происходит при использовании хука publish_post... Я также пробовал использовать хук added_post_meta, но он выполняется после каждого добавления метаданных поста — мне нужен тот, который выполняется после последнего добавленного метаданного.

Что значит "ничего не происходит"? Вы использовали код выше без удаления первых двух комментариев? Покажите мне ваш код? Вы используете его для пользовательского типа записи или просто для 'post'?

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

Вы можете использовать это:
function myFunction($post_id, $post, $update ) {
// ваш код здесь
}
add_action('save_post', 'myFunction');
$update
- это булево значение, которое возвращает false, если это новая запись. При обновлении возвращает true.
Вот документация: https://developer.wordpress.org/reference/hooks/save_post/

Правильный и более простой ответ — использовать действие wp_insert_post
.
https://developer.wordpress.org/reference/hooks/wp_insert_post/
Важное отличие действия wp_insert_post в том, что оно срабатывает после вызова update_post_meta.
Доступны 3 параметра — флаг $update сообщает, является ли это новым или обновлённым постом.
add_action('wp_insert_post', 'run_after_post_updated', 10, 3);
function run_after_post_updated($post_ID, $post = null, $update = true) {
// Несмотря на то, что документация указывает 3 параметра, иногда передаётся только ID поста — поэтому для остальных параметров нужно задать значения по умолчанию
$meta = get_post_meta( $post_ID );
// ...
}
