Обзор
Поле «клон» позволяет выбрать и отобразить существующие поля. Он не дублирует поля в БД, вместо этого он загружает и отображает выбранные поля во время выполнения.
Вы также можете выбрать одну (или несколько) групп полей и сгруппировать их. Хороший пример использования клона показан в видео ниже. Мы создаем группу полей для кнопки один раз и можем реиспользовать эту группу в разных частях нашего сайта.
Клон может отображать поля одним из двух способов. Сгруппировать их в один блок или показывать их отдельно, тем самым показав, что они не взаимосвязаны.
Демо
История изменений
- Добавлено в 5.4.0
Настройки
Имя | Описание |
---|---|
Поля | Поля для вывода. Может быть массивом полей или группой. |
Способ отображения | Указывает, как отображать выбранные поля:
|
Блок | Изменяет стиль отображения:
|
Префикс для ярлыков полей | Этот параметр изменяет все метки выбранных полей и добавляет префикс к текущей метке поля клона. Очень полезно при использовании отдельного способа отображения. Вы можете назвать свое поле клона, скажем, «Герой» и добавить к нему префикс для всех выбранных полей, таких как «Текст кнопки героя», «URL кнопки героя» и т. Д. |
Префикс для названий полей | Аналогично параметру выше, но изменит имя поля. Имя используется для сохранения / загрузки значений. Очень полезно при использовании группировки. Вы можете клонировать группу несколько раз на одном экране редактирования, но они будут сохранять данные под разными именами. Например, «hero_button_text», «welcome_button_text» и т. д. |
Использование в шаблоне
Получение значений поля клон аналогично обычному полю. При использовании настройки отображения «группа» вы можете получить все значения в виде массива, получив лишь само поле «клон».
В некоторых из следующих примеров используется поле клона с именем «main_button», которое клонирует группу полей с именем «Button». Группа полей «Button» содержит 2 поля, которые называются «text» и «url».
Базовый
В этом примере показано, как получить значение поля клонирования с настройками по умолчанию. Обратите внимание, что эти настройки по существу заменяют поле клона выбранными полями:
- Название: main_button
- Способ отображения: отдельно
- Префикс для названий полей: нет
- Поля: группа полей под названием «Button», описанная выше
<?php
$text = get_field('text');
$url = get_field('url');
?>
Префикс для названий полей
В этом примере показано, как получить значение поля клонирования для группированных значений. Обратите внимание, что эти настройки будут отображать поля «button» в группе и добавлять префиксы к названиям полей. Все значения будут сохранены / загружены с префиксом «main_button_»
- Название: main_button
- Способ отображения: группа
- Префикс для названий полей: да
- Поля: группа полей под названием «Button», описанная выше
<?php
$text = get_field('main_button_text');
$url = get_field('main_button_url');
?>
Так как мы выбрали способ отображения «группа», то это позволяет ACF получить значения полей клонов в виде массива, подобного такому, без префиксов.
<?php
$button = get_field('main_button');
$text = $button['text'];
$url = $button['url'];
?>
Вложенные поля
Поле клон также может использоваться в повторителе или гибком содержании (это отдельные типы полей ACF). В этом примере показано знакомое нам поле клона main_button (из предыдущего примера). Мы будем использовать его в повторителе.
<?php
if( have_rows('slides') ) {
while( have_rows('slides') ) {
the_row();
$button = get_sub_field('button');
// ...
}
}
?>
Ограничения
Для данного типа поля существует ряд ограничений.
1. Несколько одинаковых клонов для вложенных полей
Если используется несколько одинаковых полей клона в рамках одного поля с вложенными полями (повторитель, гибкое содержание), то они будут перезаписывать друг друга и работать не корректно. Например, представьте поле повторителя (с именем «string»). В нем содержится 2 поля клона. Они клонируют одинаковое поле с именем «сell». Даже если в обоих полях клонирования используется параметр «Префикс для названий полей», чтобы каждая «сell» имела уникальное имя, они оба используют один и тот же ключ field_key, поэтому они будут переопределять друг друга во время сохранения.
2. have_rows() для вложенного клона
Функция have_rows() вернет false при загрузке клонированного подполя с использованием параметра «Блок = Блок». Обратите внимание, что использование параметра отображения «Отдельно» позволит циклам sub have_rows() работать должным образом.
Примечание
Структура данных
Поле клона не меняет структуру данных при сохранении значений в БД. Единственное изменение происходит при включении настройки «Префикс для названий полей». Значения не сохраняются как массив, но сохраняются как обычные значения отдельных полей. Это означает, что мета-запросы будут работать как обычно.
Конфликт данных
Возможно создать конфликт данных путем клонирования поля с именем, уже используемым в группе. Это та же проблема, что и при создании 2 полей с одинаковыми именами. Пожалуйста, используйте настройку «Префикс для названий полей», чтобы избежать этого.
Хорошее правило — использовать настройку «Префикс для названий полей» при выборе настройки отображения «Группа» и не использовать при использовании настройке «Отдельно».
Отключенные группы полей
Можно клонировать группу полей, для даже, если она не активна. Пример. Сделайте группу полей неактивной (чтобы она не отображалась на странице) и выводите ее с помощью клона в нужных местах.
Клонирование клона
Можно клонировать поле клона. На первый взгляд эта идея может показаться опасной и даже экстремальной, но в ряде случаем данная возможность может пригодиться. Например, вы, создаете конструктор страниц с помощью гибкого содержания и обнаруживаете, что каждый макет содержит одинаковые поля для «настроек». Вместо дублирования этих полей в каждом блоке гибкого содержания (и головной боли, связанной с сохранением и синхронизацией изменений в этих полях в нескольких блоках), вы можете определить все поля «настроек» только в первом блоке. Второй блок может использовать поле клонирования для «настроек» из первого блока. Третий макет может использовать поле клонирования для клонированного поля, определенного во втором блоке.
Вы можете подумать, а зачем мне клонировать клон, когда я могу сделать отдельный клон и убрать лишнюю вложенность? Преимущество этого состоит в том, что, если вы добавляете новый «параметр» в первый блок, вам нужно только обновить поле клона во втором блоке. Все остальные поля клонирования (в блоках 3, 4 и т. д.) Будут наследовать поведение клона во 2 блоке и отображать уже обновленное поле «настройки». Очень удобно!