Выполнение действия после сохранения записи со всеми связанными post_meta записями (данными)

22 июн. 2015 г., 15:26:15
Просмотры: 29K
Голосов: 6

Мне нужно выполнить пользовательский 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 добавлены?

}

Заранее спасибо!

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

Сохраняются ли метаданные записи в той же функции?

Manny Fleurmond Manny Fleurmond
22 июн. 2015 г. 15:54:38

Хм, не совсем понял ваш вопрос... Пожалуйста, проверьте обновленную часть моего вопроса, часть файла function.php

user198003 user198003
22 июн. 2015 г. 16:11:43
Все ответы на вопрос 4
5

Для НОВОГО типа записи '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 );

В этом случае функция обратного вызова принимает два параметра!

23 июн. 2015 г. 01:12:22
Комментарии

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

user198003 user198003
23 июн. 2015 г. 10:39:51

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

Frank P. Walentynowicz Frank P. Walentynowicz
23 июн. 2015 г. 16:37:38

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

Frank P. Walentynowicz Frank P. Walentynowicz
23 июн. 2015 г. 17:37:25

Будет ли это работать и для товаров WooCommerce?

Amjad Amjad
19 мар. 2019 г. 03:07:29

Товар WooCommerce — это пользовательский тип записи. Приведенное выше решение работает с любыми типами записей.

Frank P. Walentynowicz Frank P. Walentynowicz
19 мар. 2019 г. 05:09:10
0

Довольно глупое решение, но работает:

function afterPostUpdated($meta_id, $post_id, $meta_key='', $meta_value=''){
    if($meta_key=='_edit_lock') {
        if($_GET['message']==1) {
            //
            Ваш код здесь
            // 
        }
    }
}
add_action('updated_post_meta', 'afterPostUpdated', 10, 4);
21 янв. 2016 г. 20:56:27
0

Вы можете использовать это:

function myFunction($post_id, $post, $update ) {
    // ваш код здесь
}

add_action('save_post', 'myFunction');

$update - это булево значение, которое возвращает false, если это новая запись. При обновлении возвращает true.

Вот документация: https://developer.wordpress.org/reference/hooks/save_post/

28 мая 2020 г. 12:59:50
0

Правильный и более простой ответ — использовать действие 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 ); 
   //  ...
}
9 февр. 2022 г. 17:39:42