Условная логика управляет тем, какие поля видны в админке в зависимости от значений других полей. Этот раздел объясняет, как настроить условную логику программно.
Структура условной логики
Каждое поле может иметь свойство conditional_logic — массив групп OR, где каждая группа является массивом условий AND.
FIELDFORGE_Field_Groups::instance()->create( [
'title' => 'Event Settings',
'fields' => [
[
'key' => 'field_evt_type',
'label' => 'Event Type',
'name' => 'event_type',
'type' => 'select',
'choices' => [ 'in_person' => 'In Person', 'virtual' => 'Virtual', 'hybrid' => 'Hybrid' ],
],
[
'key' => 'field_evt_venue',
'label' => 'Venue Address',
'name' => 'venue_address',
'type' => 'text',
'conditional_logic' => [
// Show when event_type is 'in_person' OR 'hybrid'
[ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'in_person' ] ],
[ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'hybrid' ] ],
],
],
[
'key' => 'field_evt_url',
'label' => 'Stream URL',
'name' => 'stream_url',
'type' => 'url',
'conditional_logic' => [
// Show when event_type is 'virtual' OR 'hybrid'
[ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'virtual' ] ],
[ [ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'hybrid' ] ],
],
],
[
'key' => 'field_evt_capacity',
'label' => 'Max Capacity',
'name' => 'max_capacity',
'type' => 'number',
'conditional_logic' => [
// Show when in_person AND has a venue address
[
[ 'field' => 'field_evt_type', 'operator' => '==', 'value' => 'in_person' ],
[ 'field' => 'field_evt_venue', 'operator' => '!=empty', 'value' => '' ],
],
],
],
],
'location_rules' => [
[ [ 'param' => 'post_type', 'operator' => '==', 'value' => 'event' ] ],
],
] );Каноническая форма схемы
Выполняющий оценщик читает каноническую форму { enabled: true, rules: [...] }. Field Forge также принимает устаревшую форму ACF в виде голого массива (только внешний массив правил) и нормализует его при сохранении:
'conditional_logic' => [
'enabled' => true,
'rules' => [ // outer = OR
[ // inner = AND
[ 'field' => 'event_type', 'operator' => '==', 'value' => 'in_person' ],
[ 'field' => 'venue', 'operator' => '!=empty', 'value' => '' ],
],
],
]Ключ field внутри каждого условия сопоставляется по имени поля name (не ключу). Используйте то же имя, которое вы передали бы в get_field().
Доступные операторы
Все операторы зеркально отражаются между PHP (FIELDFORGE_Conditional_Logic::compare()) и JS (assets/js/conditional-logic.js). Держите оба списка синхронизированными, если вы форкаете.
| Оператор | Описание | Пример |
|---|---|---|
== | Равно (свободно, строковое приведение; для массивов, истинно, если ожидаемое значение находится в массиве) | 'value' => 'in_person' |
!= | Не равно | 'value' => 'draft' |
==contains | Совпадение подстроки | 'value' => 'admin' |
!=contains | Обратное совпадение подстроки | 'value' => 'spam' |
==pattern | Совпадение по регулярному выражению. Автоматически оборачивается в /.../, если не предоставлены разделители. | 'value' => '/^v\d+/i' |
==empty | Истинно, когда значение равно null, », ‘0’, false или пустому массиву | 'value' => '' |
!=empty | Обратное к ==empty | 'value' => '' |
> < >= <= | Числовое (floatval с обеих сторон) | 'value' => '50' |
Выполняющий оценщик
- Сторона PHP (
FIELDFORGE_Field_Renderer::render_field) выполняет первоначальную серверную оценку, так что поля, правила которых ложны, выводятся сstyle="display:none"— без мигания всех полей при загрузке страницы. - Сторона JS (
assets/js/conditional-logic.js) переоценивает при каждом событииchange/inputвнутри метабокса. Каждый метабокс содержит JSON-картуdata-fieldforge-cond-rules; каждая условная цель содержитdata-fieldforge-cond-target="." - Скрытый триггер короткое замыкание: если триггерное поле само скрыто (по своему собственному условному правилу), условия на нем считаются ложными. Цепочки (A управляет B управляет C) автоматически каскадируются — когда A скрывает B, JS повторно запускается до достижения согласования, так что C также скрывается.
- Обязательный атрибут: когда поле скрывается, любой потомок атрибута
[required]сохраняется какdata-fieldforge-cond-required="1", и атрибутrequiredудаляется, чтобы браузер не блокировал отправку. Он восстанавливается, когда поле снова становится видимым. - Область подполей: v1 оценивает правила только на верхнем уровне полей (непосредственные потомки группы полей). Правила, размещенные на подполях внутри Повторителя / Группы / Гибкого содержимого, сохраняются и проходят через экспорт/импорт, но метабокс всегда отображает их.
Программная оценка
FIELDFORGE_Conditional_Logic::evaluate( $logic, $values ) выставляется как тот же оценщик, который использует рендерер, так что безголовые вызовы могут спрашивать "покажет ли это поле, учитывая эти значения?" без DOM:
$logic = $field['conditional_logic']; // { enabled, rules }
$values = [
'event_type' => 'hybrid',
'venue' => '',
];
$visible = FIELDFORGE_Conditional_Logic::evaluate( $logic, $values );Условная логика в шаблонах
Условная логика — это только проблема пользовательского интерфейса — она не влияет на вывод get_field(). Скрытое поле все еще сохраняет свое значение. Всегда проверяйте на пустые значения в шаблонах:
$venue = get_field( 'venue_address' );
if ( $venue ) {
echo '<p>Venue: ' . esc_html( $venue ) . '</p>';
}---