Как получить данные из поста wordpress при сохранении?
Всех приветствую!
Есть задача: перехватить данные из создаваемого или обновляемого поста (записи) 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, в другом ответе прокомментировал.
Вопрос в том, как получить актуальные данные?
Из БД.
Ваш КЭП,
Как указал 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, Я рад, хз, чего вы там накрутили, надо код показывать, шаблона вывода и того где функция вызывается, как оно работает - я объяснил, как вы реализовали не угадать
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В обычном хуке
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);
Если нужно сравнить старое и новое значение, старое лучше сохранить до записи ACF на приоритете меньше 10, а новое читать после 10. Ещё вариант — читать данные напрямую из
$_POST['acf'], но там будут ключи полей видаfield_..., поэтому такой код сложнее сопровождать.Также проверьте автосохранения и ревизии. Без этого обработчик может срабатывать лишний раз:
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) { return; }
Итог: для актуальных ACF-значений используйте
acf/save_postс приоритетом 20. Для сравнения старого и нового состояния разделяйте обработчики на “до ACF” и “после ACF”.