Пользовательские правила размещения ACF

Обзор

Каждая группа полей содержит набор правил размещения. Эти правила используются для определения того, где показывать группу полей в админке 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 параметра:

  1. $match — переменная true / false, которую необходимо вернуть
  2. $rule — текущее правило, с которым выполняется сопоставление. Это массив с ключами «param», «operator», «value».
  3. $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