ACF: get_field() возвращает false
Я создал пользовательское поле true/false со значением по умолчанию true. Я установил разные значения для разных записей. Однако get_field() всегда возвращает false:
<?php if( have_posts() ): while( have_posts() ): the_post(); ?>
<?php global var_dump(get_field('display_featured_image'));?>
<?php endwhile; endif ?>
Отображаемый результат: (bool)false
Я проверил и перепроверил название поля. Почему оно возвращает false, если значение установлено как true?

Вам необходимо передать ID записи, из которой вы хотите получить поле: Например:
get_field('display_featured_image', $post_id).
В цикле вы можете использовать:
get_field('display_featured_image', get_the_id());
ACF хранит данные полей в meta_fields WordPress, поэтому вы даже можете использовать встроенный обработчик метаданных WordPress для извлечения данных самостоятельно. Например:
get_post_meta( $post_id, 'acf_field_name', true); // Используйте true почти во всех случаях, так как иначе WP вернет массив.

Я пробовал get_field (с ID и без) и get_post_meta — оба варианта внутри цикла — но всё равно ничего не получается.

Я попытался отладить с помощью: print_r(get_post_meta(get_the_id(),'display_featured_image'));
...и теперь я совсем не уверен, что происходит. Когда я проверяю запись, где поле установлено в false, вывод такой: Array ( [0] => 0 )
, но когда я загружаю запись, где поле установлено в true, вывод просто: Array ( )

Возможно, вы устанавливаете поле наоборот? Например, когда вы выбираете "display_featured_image" в редакторе записи, вы устанавливаете его в "true" при выборе и "false" при отмене? Потому что похоже, что поле ПОЛУЧАЕТ данные, просто вы делаете это задом наперёд.
Попробуйте установить поле выбора в редакторе ACF как:
Да : Да Нет : Нет
И посмотрите, какие данные вы получите при следующем запросе поля.

Я понял, в чем дело. Я изменил тип поля на select, но все равно получал те же результаты. Однако, несмотря на то, что у поля есть значение по умолчанию, мне приходится явно устанавливать его в существующих записях, чтобы какое-либо значение сохранилось. Арргх! Похоже, что обойти это никак нельзя, если только вы не знаете какого-то решения?

Нет, судя по вашему вопросу, все должно работать. Сохраняется ли состояние поля в редакторе записи? Например: если вы установите значение 1 или другое, сохраняется ли этот параметр при перезагрузке? Если да, то нет причин, почему это не должно работать.

Да, состояние сохраняется, но я обнаружил, что если я добавляю поле к существующим записям, состояние не будет сохраняться, независимо от того, есть ли у поля значение по умолчанию, пока я явно не установлю это значение. Отсюда и пустой массив.

Стоит отметить, что по какой-то причине программное использование update_field НЕ обновляет поле до тех пор, пока форма не будет сохранена в первый раз. Это связано с тем, как ACF первоначально заполняет данные поля. Вы можете использовать нативную функцию WordPress update_post_meta( $post_id, $key, $value ); чтобы обойти эту проблему. Это упоминается в документации ACF. Я сам столкнулся с этой проблемой во время проекта и потратил несколько часов, прежде чем нашел решение, тщательно изучив документацию ACF :P

Также есть "баг", когда вы вызываете get_field() с именем поля, а затем с ключом поля - возвращаются разные значения

У вас есть несколько вариантов. Самый простой — использовать get_field( $field_key )
(используйте ID поля ACF вместо meta_key). Это позволит выбрать правильное поле независимо от правил расположения, что даст доступ к значению по умолчанию.
Если вам обязательно нужно использовать meta key, в большинстве случаев можно сделать это с помощью фильтров. Не уверен, насколько это эффективно (можно улучшить, используя кэширование через acf-json). Это также предполагает, что ключи ваших полей уникальны (иначе придется фильтровать на основе правил расположения, которые могут быть или не быть доступны).
add_filter( 'acf/load_value', function( $value, $post_id, $field ){
// получаем группы полей
$groups = acf_get_field_groups();
if ( !empty( $groups ) ){
// перебираем каждую группу
foreach ($groups as $group) {
// загружаем поля для этого ключа группы
$fields = acf_get_fields( $group['key'] );
if ( !empty( $fields ) ){
// перебираем возвращенные поля
foreach ( $fields as $this_field ){
// если имя совпадает, устанавливаем значение по умолчанию
if ( $this_field['name'] == $field['name'] ){
return $this_field['default_value'];
}
}
}
}
}
return $value;
}
