Обзор
Каждая группа полей содержит набор правил размещения. Эти правила используются для определения того, где показывать группу полей в админке WP. Можно создавать собственные правила размещения или даже изменять существующие с помощью следующих фильтров.
Журнал изменений
- 5.8.0 – Добавлен параметр
$field_groupв фильтр'acf/location/match_rule'. - 5.3.5 – Добавлен фильтр
'acf/location/screen'.
Добавление нового правила
Добавление пользовательского правила размещения состоит из 4 простых шагов. 3 из них нужны для определения настроек правила, а последний — для использования этих настроек, чтобы сопоставить правило с экраном редактирования.
1. Добавление пользовательского типа правила
При редактировании группы полей выпадающий список «types» — это первый список в строке правила размещения.
Обратите внимание, что список разбит на группы. Это важно помнить при редактировании вариантов для этого выпадающего списка. Используйте фильтр «acf/location/rule_types», чтобы настроить этот список. Вот пример добавления «user» в группу «Базовые» в вариантах выпадающего списка:
add_filter('acf/location/rule_types', 'acf_location_rules_types');
function acf_location_rules_types( $choices ) {
$choices['Базовые']['user'] = 'Пользователь';
return $choices;
}- Совет: используйте print_r или var_dump, чтобы лучше понять массив $choices.
2. Добавление пользовательских операторов правила
Этот шаг необязателен и не требуется, чтобы ваше пользовательское правило размещения работало. При редактировании группы полей выпадающий список «operators» — это второй список в строке правила размещения.
По умолчанию в этом списке есть операторы «==» и «!=». Это также можно настроить с помощью фильтра «acf/location/rule_operators». Чтобы добавить операторы «<» и «>», можно использовать такой код:
add_filter('acf/location/rule_operators', 'acf_location_rules_operators');
function acf_location_rules_operators( $choices ) {
$choices['<'] = 'меньше';
$choices['>'] = 'больше';
return $choices;
}3. Добавление пользовательских значений правила
При редактировании группы полей выпадающий список «values» — это третий список в строке правила размещения. Этот список динамически обновляется в зависимости от «type».
В этом списке должен быть хотя бы один вариант для выбора. Чтобы заполнить этот список, используйте фильтр «acf/location/rule_values/$type». Обратите внимание, что переменная $type в названии фильтра должна совпадать со значением «type».
Этот код заполнит список всеми доступными пользователями. Список будет сохранять user_id, но показывать display_name пользователя:
add_filter('acf/location/rule_values/user', 'acf_location_rule_values_user');
function acf_location_rule_values_user( $choices ) {
$users = get_users();
if( $users ) {
foreach( $users as $user ) {
$choices[ $user->data->ID ] = $user->data->display_name;
}
}
return $choices;
}4. Сопоставление правила
После выполнения описанных выше шагов у вас уже должно быть применено пользовательское правило размещения к вашей группе полей. Последний шаг — создать функцию, которая будет сопоставлять это правило с экраном редактирования.
При просмотре экрана редактирования (страница / запись / пользователь / таксономия / вложение / и т. д.) ACF найдет все доступные группы полей и запустит функции сопоставления для правил размещения этой группы. Эти функции сопоставления вернут true или false и определят, будет ли показана группа полей.
Чтобы создать функцию rule_match для вашего пользовательского правила размещения, используйте фильтр «acf/location/rule_match/$type». Обратите внимание, что переменная $type в названии фильтра должна совпадать со значением «type».
Этот фильтр принимает 3 параметра:
- $match — переменная true / false, которую необходимо вернуть
- $rule — текущее правило, с которым выполняется сопоставление. Это массив с ключами «param», «operator», «value».
- $options — массив данных о текущем экране редактирования (post_id, page_template, post_type и т. д). Этот массив также будет включать любые данные, отправленные в ajax-вызове (ajax-вызовы выполняются на записи / странице, когда вы меняете category, page_template и т. д)
Следующий код создаст rule_match для «user», где, если current_user равен выбранному пользователю (в правиле группы полей), группа полей будет показана (если только другое правило не совпало)
add_filter('acf/location/rule_match/user', 'acf_location_rule_match_user', 10, 4);
function acf_location_rule_match_user( $match, $rule, $options, $field_group )
{
$current_user = wp_get_current_user();
$selected_user = (int) $rule['value'];
if($rule['operator'] == "==")
{
$match = ( $current_user->ID == $selected_user );
}
elseif($rule['operator'] == "!=")
{
$match = ( $current_user->ID != $selected_user );
}
return $match;
}Изменение параметров rule_match
У фильтра rule_match, о котором говорилось выше, есть параметр под названием $options. Этот параметр содержит массив сведений о текущем экране редактирования, таких как post_id, post_parent и т. д.
Этот массив можно изменить, подключившись к фильтру acf/location/screen и либо отредактировав, либо добавив данные экрана.
add_filter('acf/location/screen', 'acf_location_screen_options', 10, 1);
function acf_location_screen_options( $options ) {
$options['foo'] = 'bar';
return $options;
}Итоги
Приведенные выше фильтры дают вам возможность создавать пользовательские правила размещения для ваших пользовательских групп полей. Честно говоря, с точки зрения того, что можно сравнивать, возможности безграничны.
Эти фильтры также можно использовать в плагине. Например, для создания правил размещения для плагина post_template!
Обновлено: 01.06.2026


