update_post_meta и update_field работают только при сохранении записи

1 нояб. 2013 г., 12:40:03
Просмотры: 24.6K
Голосов: 6

Я использую Advanced Custom Fields (ACF) для хранения данных в произвольном поле. У меня были отдельно сохранены данные широты и долготы, но теперь они должны быть в одном пользовательском поле, поэтому я создал следующую функцию. $query просто делает запрос всех соответствующих записей.

<?php 
$query = query_custom_posts(); if($query->have_posts()): 
while ($query->have_posts()): $query->the_post();
if(get_field('map_lat') && get_field('map_lng')):

$lat = get_field('map_lat');
$long = get_field('map_lng');
$coord = $lat.','.$long;
$post_id = get_the_ID();

update_post_meta($post_id, 'map_coor', $coord);


endif; endwhile; wp_reset_query(); endif;

?>

Функция выше работает. Поле map_coor заполняется значениями широты и долготы, разделенными запятой (я вижу эту информацию в поле).

Странно то, что когда я использую get_field('map_coor') во фронтенде, ничего не отображается. Если я сохраняю соответствующую запись, тогда информация ДЕЙСТВИТЕЛЬНО появляется.

В функции выше я также пробовал использовать функцию update_field (из ACF) таким образом: update_field($post_id, 'map_coor', $coord), но проблема остается.

Итак, мой вопрос: нужно ли мне изменить функцию выше или просто запустить функцию, которая сохранит все записи? Если верен второй вариант, как это сделать? Я нашел хук save_posts, но не уверен, как заставить его обработать все записи.

0
Все ответы на вопрос 1
5
12

Проблема в том, что функция update_field из ACF работает немного иначе, чем update_post_meta. Видите разницу?

update_post_meta( $post_id, $meta_key, $meta_value, $prev_value );
update_field( $field_key, $value, $post_id );

Если вы используете update_post_meta, то, на мой взгляд, следует применять get_post_meta для получения метаданных. Если же вы используете update_field, то правильнее применять the_field или get_field, потому что ACF хранит пары ключ/значение немного по-другому.

1 нояб. 2013 г. 16:47:48
Комментарии

Если вы используете update_field, то должны использовать the_field или get_field, потому что ACF хранит пары ключ/значение немного по-другому — это не совсем верно. Действительно, ACF хранит значения иначе, но вы можете использовать update_field и получать содержимое с помощью get_post_meta без проблем, если правильно используете update_field. Важно помнить, что $field_key и $meta_key — это не одно и то же!

Milo Milo
1 нояб. 2013 г. 17:02:10

Я изменил формулировку на "по моему мнению, следует использовать". То, что вы сказали, абсолютно верно, но именно эта путаница с "именем поля/ссылкой на поле" часто вызывает проблемы.

realloc realloc
1 нояб. 2013 г. 17:06:48

Спасибо. Как я уже описал в своем вопросе, я пробовал update_field. Использовал его в комбинации с get_field. Результат тот же: значение поля сохраняется, но при запросе произвольного поля на фронтенде возвращается пустое значение. Попробую update_post_meta и заменю get_field на get_post_meta.

eskimo eskimo
1 нояб. 2013 г. 19:18:53

Это работает, когда я использую update_post_meta и get_post_meta. Всё равно странно, что update_field и get_field дают разные результаты. Отмечу ответ как принятый, ещё раз спасибо.

eskimo eskimo
1 нояб. 2013 г. 19:35:55

Я использую update_post_meta() и get_field(), и это работает — `update_field() не работал, но я до сих пор не понимаю почему.

Alex Steinberg Alex Steinberg
25 июн. 2018 г. 19:30:43