Клон (Clone)

Обзор

Поле «клон» позволяет выбрать и отобразить существующие поля. Он не дублирует поля в БД, вместо этого он загружает и отображает выбранные поля во время выполнения.

Вы также можете выбрать одну (или несколько) групп полей и сгруппировать их. Хороший пример использования клона показан в видео ниже. Мы создаем группу полей для кнопки один раз и можем реиспользовать эту группу в разных частях нашего сайта.

Клон может отображать поля одним из двух способов. Сгруппировать их в один блок или показывать их отдельно, тем самым показав, что они не взаимосвязаны.

Демо

История изменений

  • Добавлено в 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 блоке и отображать уже обновленное поле «настройки». Очень удобно!