Обновления функций полей ACF в версии 5.11

Обновления функций полей ACF в версии 5.11

В версиях ACF до 5.11 шорткод ACF , а также функции get_field() и the_field() могли использоваться для получения параметров WordPress или значений метаполей записей, пользователей и терминов, которые не являлись полями ACF. В зависимости от способа использования этих функций это могло создавать проблемы с безопасностью: параметры сайта могли быть случайно раскрыты во внешней части сайта или пользователям без прав администратора. Кроме того, эти функции могли получать значения полей, которые больше не зарегистрированы в ACF, поскольку их метазначения сохраняются в базе данных.

Помимо риска для безопасности, мы не рекомендуем использовать такие функции, как get_field(), для получения чего-либо, кроме поля ACF. Эти функции выполняют дополнительную логику и запросы к базе данных, чтобы найти корректное поле и правильно отформатировать его. Поэтому использование get_field вместо соответствующих основных функций WordPress будет менее производительным.

В ACF 5.11.2 и более новых версиях шорткод ACF получает значения только зарегистрированных полей ACF, а get_field() и the_field() запрещают доступ к параметрам сайта, которые не являются зарегистрированными полями ACF. Для большинства сайтов это не должно стать проблемой, однако в некоторых сценариях требуется уделить этому особое внимание. В этой документации мы рассмотрим такие сценарии и предложим решения.

В ACF 5.11 и 5.11.1 изменения доступа к данным для шорткода ACF также применялись к get_field() и the_field().

Использование функций ACF для получения данных за пределами ACF

Обновление до ACF 5.11.2 означает, что вызов шорткода ACF для параметров или метаданных записи, пользователя либо термина, не относящихся к ACF, вернёт значение null, тогда как раньше могло возвращаться само значение.

Вызовы get_field() или the_field() для параметров WordPress, не относящихся к ACF, также вернут значение null. Однако использование этих функций для получения любых метаданных записи, пользователя или термина вернёт значение независимо от того, является ли это метаполе полем ACF.

Чтобы избежать этого, мы рекомендуем использовать основные функции WordPress для получения данных полей, не относящихся к ACF. Разработчикам следует использовать функцию get_option() функция для получения данных из таблицы wp_options или функцию get_post_meta() функция для получения метаданных из таблицы wp_postmeta.

В ACF 5.12.1 эти ограничения теперь корректно применяются и при использовании ключа поля для доступа к значению параметра, так же как при использовании имени поля.

Регистрация полей через PHP

Все поля, зарегистрированные с помощью PHP-функций acf_add_local_field_group() и acf_add_local_field(), должны быть зарегистрированы до использования get_field(). Мы рекомендуем регистрировать локальные поля на хуке действия acf/init или непосредственно в файле functions.php вашей темы.

Важно отметить, что вызов get_field() или the_field() инициализирует ACF, если этого ещё не произошло. Это означает, что при вызове этих функций до регистрации локальных групп полей ACF не сможет найти такие поля.

Начиная с версии 5.11.1 ACF определяет такую ситуацию и выводит уведомление _doing_it_wrong в журнал ошибок PHP. Начиная с версии 5.11.2 данные по-прежнему возвращаются вместе с этим предупреждением, чтобы избежать ошибок на сайте, пока вы адаптируете код.

Чтобы исправить ситуацию, убедитесь, что:

  1. Группы полей, зарегистрированные через PHP, регистрируются после инициализации ACF, предпочтительно на хуке acf/init.
  2. Вызовы get_field() или the_field() выполняются внутри хука действия или фильтра, который срабатывает после регистрации полей, либо внутри файлов шаблонов вашей темы.

Ниже приведён пример правильной регистрации полей с использованием хука acf/init.

add_action( 'acf/init', 'my_acf_add_local_field_groups' );

function my_acf_add_local_field_groups() {
    acf_add_local_field_group(array(
        'key' => 'group_1',
        'title' => 'Герой страницы',
        'fields' => array (
            array (
                'key' => 'field_1',
                'label' => 'Заголовок героя',
                'name' => hero_title,
                'type' => 'text',
            )
        ),
        'location' => array (
            array (
                array (
                    'param' => 'post_type',
                    'operator' => '==',
                    'value' => page,
                ),
            ),
        ),
    ));
}

Регистрация полей внутри условной логики

При регистрации локальных полей или групп полей внутри условной логики следует соблюдать осторожность, поскольку get_field() и связанные с ней функции могут работать не так, как ожидается.

Например, следующий код регистрирует поле через PHP, но только в административной части WordPress из-за проверки is_admin(). Поэтому вызовы get_field() в коде шаблона внешней части сайта не смогут получить значение этого поля:

if ( is_admin() ) {
    add_action( 'acf/init', 'my_acf_add_local_field_groups' );
}

function my_acf_add_local_field_groups() {
    acf_add_local_field_group(array(
        'key' => 'group_1',
        'title' => 'Герой страницы',
        'fields' => array (
            array (
                'key' => 'field_1',
                'label' => 'Заголовок героя',
                'name' => hero_title,
                'type' => 'text',
            )
        ),
        'location' => array (
            array (
                array (
                    'param' => 'post_type',
                    'operator' => '==',
                    'value' => page,
                ),
            ),
        ),
    ));
}

Условную логику необходимо удалить, чтобы действие ‘acf/init’ вызывалось как в административной, так и во внешней части сайта:

add_action( 'acf/init', 'my_acf_add_local_field_groups' );

Мультсайты, использующие одно и то же поле на нескольких подсайтах

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

Также можно экспортировать группы полей, которые вы хотите использовать повторно, в формате PHP (через Custom Fields -> Tools -> Generate PHP) и добавить этот PHP-код в файл functions.php любой темы, используемой подсайтами. Это зарегистрирует поля через PHP и обеспечит их доступность во всей сети мультсайта.

Обновлено: 30.09.2026