В версиях 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, мы по-прежнему будем возвращать данные вместе с этим предупреждением, чтобы избежать ошибок на сайте, пока вы изменяете свой код для совместимости.
Чтобы исправить это, убедитесь, что:
- Группы полей, зарегистрированные через PHP, регистрируются после инициализации ACF, предпочтительно на хуке
acf/init. - Вызовы
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' => 'Page Hero',
'fields' => array (
array (
'key' => 'field_1',
'label' => 'Hero Title',
'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' => 'Page Hero',
'fields' => array (
array (
'key' => 'field_1',
'label' => 'Hero Title',
'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 (через Произвольные поля -> Инструменты -> Сгенерировать PHP) и включить этот PHP в файл functions.php любых тем, используемых подсайтами. Это зарегистрирует поля через PHP и обеспечит их доступность по всей сети мультисайта.