ACF: get_field() возвращает false

6 июн. 2015 г., 23:13:40
Просмотры: 27.1K
Голосов: 5

Я создал пользовательское поле 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?

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

Я заметил, что поля True/False не учитывают значение по умолчанию true за пределами инициализации интерфейса: флажок будет установлен для записей, у которых ещё нет значения, но пока вы фактически не сохраните запись, значение true не сохраняется в БД. Если выполнить get_field() для записи, в которой ничего не сохранено в БД, будет возвращено false (независимо от значения по умолчанию поля). Я бы назвал это ошибкой, но пока не сообщил о ней, ожидая дополнительного исследования.

Mark Mark
23 окт. 2015 г. 20:37:22
Все ответы на вопрос 2
9

Вам необходимо передать 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 вернет массив. 
6 июн. 2015 г. 23:28:06
Комментарии

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

user3574603 user3574603
7 июн. 2015 г. 00:47:04

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

user3574603 user3574603
7 июн. 2015 г. 01:11:36

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

Попробуйте установить поле выбора в редакторе ACF как:

Да : Да Нет : Нет

И посмотрите, какие данные вы получите при следующем запросе поля.

Hybrid Web Dev Hybrid Web Dev
7 июн. 2015 г. 01:44:33

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

user3574603 user3574603
7 июн. 2015 г. 02:04:35

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

Hybrid Web Dev Hybrid Web Dev
7 июн. 2015 г. 08:53:46

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

user3574603 user3574603
7 июн. 2015 г. 23:06:19

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

Hybrid Web Dev Hybrid Web Dev
20 февр. 2016 г. 07:06:52

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

Anatol Bivol Anatol Bivol
12 мар. 2016 г. 21:40:57

У меня была эта проблема, пока я не понял, что передавал ->ID, который соответствовал ID меню страницы, а не ID самой страницы. Вместо этого нужно было использовать ->object_ID. Это было при использовании wp_get_nav_menu_object()

Jack Jack
22 нояб. 2016 г. 12:37:35
Показать остальные 4 комментариев
0
-1

У вас есть несколько вариантов. Самый простой — использовать 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;
}
7 нояб. 2015 г. 06:15:06