Как получить данные из поста wordpress при сохранении?

Ссылка скопирована
1 ответ

Всех приветствую!

Есть задача: перехватить данные из создаваемого или обновляемого поста (записи) wordpress.

В настоящий момент использую такую конструкцию для записи ID и Start

function get_post_param( $post_id, $post, $update ){  	$file = 'wp-content/themes/storefront/php/test.txt';  	$current = file_get_contents($file); 	$current .=                "ID: ".$post_id"               ." Start: ".$post->nachalo_meropriyatiya                .n";  	file_put_contents($file, $current);  }  add_action( 'save_post', 'get_post_param', 10, 3 );

function get_post_param( $post_id, $post, $update ){ $file = 'wp-content/themes/storefront/php/test.txt'; $current = file_get_contents($file); $current .= "ID: ".$post_id" ." Start: ".$post->nachalo_meropriyatiya .n"; file_put_contents($file, $current); } add_action( 'save_post', 'get_post_param', 10, 3 );

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

Вопрос в том, как получить актуальные данные?

Дополнительные поля реализованы через плагин ACF

Приоритет хука менял, get_post($post_id) и wp_insert_post работают так же.

Спасибо за помощь!

Дополнительно:

Ответы:

add_action( 'post_updated', '...', 10, 3 );
?

  • То же самое - достаёт предыдущее значение, а после записывается новое.
  • EvgenyApMr, вы все 3 аргумента хука проверили?
  • maksam07, не понял вопрос. post_id и post использую в примере, а update будет задействован в конечном варианте функции, для сборки SQL-запроса
  • EvgenyApMr, где вы в хуке post_updated увидели аргументы post_id, post, update ?
  • maksam07, аргументы можно назвать как угодно, я их перечислил в контексте своего примера. даже с одним аргументом на post_id всё работает так же.
    add_action( 'post_updated', 'get_post_param', 99, 1 );

    add_action( 'post_updated', 'get_post_param', 99, 1 );

  • EvgenyApMr, тогда с чего вы взяли, что при:
    add_action( 'post_updated', 'get_post_param', 99, 3 ); // 3 аргумента

    add_action( 'post_updated', 'get_post_param', 99, 3 ); // 3 аргумента

    и аргументах post_id, post, update, в переменной post не будет актуальных данных, если, как указано в доке

    $post_ID; $post_after (post object after the update); $post_before (post object before the update);

    $post_ID; $post_after (post object after the update); $post_before (post object before the update);

    - вторым аргументом идет переменная с уже обновленнми данными поста?

  • maksam07, посмотрите, примерно так должен выглядеть код с этим хуком?
    function get_post_param($post_id, $post_after){  	$file = 'wp-content/themes/storefront/php/test.txt';  	$current = file_get_contents($file);  	$current .= "ID: ".$post_id. 	." Start: ".$post_after->nachalo_meropriyatiya 	."n"; 	 	file_put_contents($file, $current);  }  add_action( 'post_updated', 'get_post_param', 99, 2 );

    function get_post_param($post_id, $post_after){ $file = 'wp-content/themes/storefront/php/test.txt'; $current = file_get_contents($file); $current .= "ID: ".$post_id. ." Start: ".$post_after->nachalo_meropriyatiya ."n"; file_put_contents($file, $current); } add_action( 'post_updated', 'get_post_param', 99, 2 );

    Если "Да", то работает всё так же, как в первом варианте(

  • maksam07, похоже, проблема в плагине ACF. Стандартные поля забирает нормально.

    Нету предположений, как можно решить такую задачу?

  • EvgenyApMr, в другом ответе прокомментировал.

Вопрос в том, как получить актуальные данные?

Из БД.
Ваш КЭП,

Как получить данные из поста wordpress при сохранении?

Как указал maksam07

Юзаать правильный хук

/** 		 * Fires once an existing post has been updated. 		 * 		 * @since 3.0.0 		 * 		 * @param int     $post_id      Post ID. 		 * @param WP_Post $post_after   Post object following the update. 		 * @param WP_Post $post_before  Post object before the update. 		 */ 		do_action( 'post_updated', $post_id, $post_after, $post_before );

/** * Fires once an existing post has been updated. * * @since 3.0.0 * * @param int $post_id Post ID. * @param WP_Post $post_after Post object following the update. * @param WP_Post $post_before Post object before the update. */ do_action( 'post_updated', $post_id, $post_after, $post_before );

Ну или можно достать сырые данные из $_REQUEST

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

    Последний вариант с этим хуком выглядит так:

    function get_post_param($post_id, $post_after){  	$file = 'wp-content/themes/storefront/php/test.txt';    	$current = file_get_contents($file);    	$current .= "ID: ".$post_id. 	." Start: ".$post_after->czena_tura 	."n"; 	 	file_put_contents($file, $current);      }      add_action( 'post_updated', 'get_post_param', 99, 2 );

    function get_post_param($post_id, $post_after){ $file = 'wp-content/themes/storefront/php/test.txt'; $current = file_get_contents($file); $current .= "ID: ".$post_id. ." Start: ".$post_after->czena_tura ."n"; file_put_contents($file, $current); } add_action( 'post_updated', 'get_post_param', 99, 2 );

  • Да, стандартные поля забирает нормально, а ACF не может
  • EvgenyApMr,

    ACF не может

    Вероятнее всего, для ACF придется работать с этим хуком:
    https://www.advancedcustomfields.com/resources/acf...

  • EvgenyApMr, а чем стандартные поля отличаются от ACF?
  • maksam07, приветствую! Сегодня попробовал разные варианты с хуком ACF, все время результат тот же - сохранение той версии, на которой страница загрузилась.

    Посмотрите код, может что-то упускаю?

    function my_acf_save_post( $post_id ) { 	$file = 'wp-content/themes/storefront/php/test.txt';  	$current = file_get_contents($file);  	$current .= get_field('czena_tura', $post_id); 			 	file_put_contents($file, $current); }  function get_post_param( $post_id){  	do_action( 'acf/save_post', $post_id );  }  add_action('acf/save_post', 'my_acf_save_post');  add_action( 'save_post', 'get_post_param', 10, 1 );

    function my_acf_save_post( $post_id ) { $file = 'wp-content/themes/storefront/php/test.txt'; $current = file_get_contents($file); $current .= get_field('czena_tura', $post_id); file_put_contents($file, $current); } function get_post_param( $post_id){ do_action( 'acf/save_post', $post_id ); } add_action('acf/save_post', 'my_acf_save_post'); add_action( 'save_post', 'get_post_param', 10, 1 );

  • WP Panda, чем-то, похоже, отличаются. Стандартные поля, например, заголовок, работают отлично, но ACF никак не поддаётся)

    Смотрите, пока остановился на таком варианте, который привел выше в ответе maksam07. Может будут какие-то идеи, как заставить это работать?

  • EvgenyApMr, надо учит матчасть. AСF это просто надстройка на ядро, которая работает с таблицей post_meta.
    А значит поле czena_tura вполне можно получить через
    get_post_meta($post_id, 'czena_tura', true);   // и использовать hook    add_action( 'post_updated', 'get_post_param', 99, 2 );

    get_post_meta($post_id, 'czena_tura', true); // и использовать hook add_action( 'post_updated', 'get_post_param', 99, 2 );

  • WP Panda, то же самое, забирает значение до сохранения
  • EvgenyApMr, Я рад, хз, чего вы там накрутили, надо код показывать, шаблона вывода и того где функция вызывается, как оно работает - я объяснил, как вы реализовали не угадать
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

В обычном хуке save_post Вы часто видите старые значения ACF не потому, что get_field() работает неправильно, а потому что WordPress и ACF сохраняют данные в разные моменты. Если Ваш код срабатывает раньше сохранения ACF-полей, в базе ещё лежит старое значение.

Для ACF правильнее использовать хук acf/save_post с приоритетом больше 10. Тогда ACF уже успеет записать новые значения, и get_field() вернёт актуальные данные:

add_action('acf/save_post', function ($post_id) {
    if (get_post_type($post_id) !== 'post') {
        return;
    }
 
    $price = get_field('price', $post_id);
    $status = get_field('status', $post_id);
 
    // Здесь уже можно работать с новыми значениями ACF.
    update_post_meta($post_id, '_my_cached_status', sanitize_text_field($status));
}, 20);

add_action('acf/save_post', function ($post_id) { if (get_post_type($post_id) !== 'post') { return; } $price = get_field('price', $post_id); $status = get_field('status', $post_id); // Здесь уже можно работать с новыми значениями ACF. update_post_meta($post_id, '_my_cached_status', sanitize_text_field($status)); }, 20);

Если нужно сравнить старое и новое значение, старое лучше сохранить до записи ACF на приоритете меньше 10, а новое читать после 10. Ещё вариант — читать данные напрямую из $_POST['acf'], но там будут ключи полей вида field_..., поэтому такой код сложнее сопровождать.

Также проверьте автосохранения и ревизии. Без этого обработчик может срабатывать лишний раз:

if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
    return;
}

if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) { return; }

Итог: для актуальных ACF-значений используйте acf/save_post с приоритетом 20. Для сравнения старого и нового состояния разделяйте обработчики на “до ACF” и “после ACF”.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно