- Статус
- Решено
- Заявлено для
- WPML Multilingual CMS 3.3.6
Обзор проблемы
Дополнение Repeater предоставляет тип поля repeater, который предназначен для содержания других типов полей. Чтобы пользователь мог дублировать контент внутри поля repeater, необходимо добавить сниппет и внимательно добавить имена полей, как описано в разделе «Обходное решение».
В настоящее время эта проблема существует для следующих типов полей:
- изображение
- файл
- галерея
- таксономия
- объект записи
- ссылка на страницу
ПРИМЕЧАНИЕ: Вы можете использовать предоставленный сниппет кода для всех остальных типов полей. Единственное отличие заключается в имени поля. Это означает, что Вы можете использовать этот сниппет для решения проблем с дублированием как типа поля repeater, так и обычных типов полей.
Вы можете найти описание известных проблем для этих типов полей здесь
Обходное решение
Вы можете использовать этот фрагмент кода в Вашем файле functions.php, чтобы дублирование работало правильно:
function wpml_fix_acf_duplication( $value_to_filter, $target_language, $meta_data ) {
// Field names should be placed into following array.
$fields = array(
'taxonomy_field' => 'some_taxonomy_name',
'repeater_field_0_repeater_taxonomy_field' => 'some_other_taxonomy_name',
'repeater_field_1_repeater_taxonomy_field' => 'some_other_taxonomy_name',
'repeater_field_0_repeater_child_0_repeater_child_taxonomy_field' => 'some_other_taxonomy_name',
'repeater_field_0_repeater_child_1_repeater_child_taxonomy_field' => 'some_other_taxonomy_name',
'repeater_field_1_repeater_child_0_repeater_child_taxonomy_field' => 'some_other_taxonomy_name',
'repeater_field_1_repeater_child_1_repeater_child_taxonomy_field' => 'some_other_taxonomy_name'
);
if ( array_key_exists( $meta_data['key'], $fields ) ) {
$value = maybe_unserialize( $value_to_filter );
if ( is_array( $value ) ) {
// If custom field value contain array of IDs to translate, usually used for gallery and taxonomy field types.
$translated_ids = array();
foreach ( $value as $v ) {
$translated_ids[] = apply_filters( 'wpml_object_id', $v, $fields[ $meta_data['key'] ], true, $target_language );
}
return maybe_serialize( $translated_ids );
} else {
// If custom field value contain single ID to translate, usually used for image and file field types.
$translated_id = apply_filters( 'wpml_object_id', $value, $fields[ $meta_data['key'] ], true, $target_language );
return $translated_id;
}
}
return $value_to_filter;
}
add_filter( 'wpml_duplicate_generic_string', 'wpml_fix_acf_duplication', 999, 3 );
Обратите внимание, что Вам следует заменить названия полей (‘taxonomy_field’, ‘repeater_field_0_repeater_taxonomy_field’ и т. д.) на те, которые используются на Вашем сайте. Для этого выполните следующие действия.
В приведенном выше примере в нашей группе полей есть следующее:
— Одно поле таксономии
— Одно поле повторителя с полем таксономии и еще одно «дочернее» поле повторителя со своим собственным полем таксономии.
Это означает, что вложенность выглядит следующим образом:
Taxonomy
Repeater {
Taxonomy
Repeater Child {
Taxonomy
}
}
Это означает, что Вам нужно настроить поля в соответствии с Вашими потребностями, как мы это сделали в примере, показанном на следующем изображении.
Когда Вы редактируете свою запись, страницу или любой другой тип записи, с которым Вы используете произвольные поля, Вы увидите эти поля в действии. На следующем изображении показано, как это выглядит в нашем примере:
ПРИМЕЧАНИЕ: Вам следует заменить пары массива key =>; value на соответствующие значения.
Замените ключи массива:
Если Вы внимательно посмотрите на названия наших полей в качестве ключей, Вы заметите, что поля индексируются с 0.
Это означает, что Ваш первый повторитель имеет индекс 0, второй — 1 и так далее. Эти номера повторителей отделяются символами подчеркивания от других типов дочерних полей с помощью _0_, _1_, _2_…
Например, название поля таксономии внутри нашего первого повторителя — 'repeater_field_0_repeater_taxonomy_field', и именно это название мы поместим в массив фрагмента кода выше. Убедитесь, что Вы обратили внимание на три вещи:
- Внутри массива в качестве ключей укажите каждое используемое Вами поле и убедитесь, что оно относится к одному из типов, перечисленных ниже
- Название поля отформатировано правильно
- Название поля добавляется для каждой строки повторителя отдельно, т. е. если у Вас есть названия для 10 строк повторителя, это будет выглядеть следующим образом: 'repeater_field_0_some_custom_field', 'repeater_field_1_some_custom_field', 'repeater_field_2_some_custom_field' … и так далее до 'repeater_field_9_some_custom_field'.
Соответствующим образом замените значения, такие как: ‘some_taxonomy_name’, ‘some_other_taxonomy_name’ и т. д. Это тип элемента, которому принадлежит ID. Может быть post, page, attachment, {custom post type key}, nav_menu, nav_menu_item, category, post_tag, {custom taxonomy key}
Для получения дополнительной информации ознакомьтесь с нашей документацией по хукам здесь.


