WPML
Статус
Решено
Заявлено для
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 
         }
}

Это означает, что Вам нужно настроить поля в соответствии с Вашими потребностями, как мы это сделали в примере, показанном на следующем изображении.

image04

Когда Вы редактируете свою запись, страницу или любой другой тип записи, с которым Вы используете произвольные поля, Вы увидите эти поля в действии. На следующем изображении показано, как это выглядит в нашем примере:

image03

ПРИМЕЧАНИЕ: Вам следует заменить пары массива key =>; value на соответствующие значения.

Замените ключи массива:

Если Вы внимательно посмотрите на названия наших полей в качестве ключей, Вы заметите, что поля индексируются с 0.

Это означает, что Ваш первый повторитель имеет индекс 0, второй — 1 и так далее. Эти номера повторителей отделяются символами подчеркивания от других типов дочерних полей с помощью _0_, _1_, _2_

Например, название поля таксономии внутри нашего первого повторителя — 'repeater_field_0_repeater_taxonomy_field', и именно это название мы поместим в массив фрагмента кода выше. Убедитесь, что Вы обратили внимание на три вещи:


  1. Внутри массива в качестве ключей укажите каждое используемое Вами поле и убедитесь, что оно относится к одному из типов, перечисленных ниже

  2. Название поля отформатировано правильно

  3. Название поля добавляется для каждой строки повторителя отдельно, т. е. если у Вас есть названия для 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'.
Кроме того, Вы можете найти все названия полей, представленные в разделе «Настройка многоязычного контента», если посмотрите под полями Advanced Custom Fields и редактором WYSIWYG после сохранения Вашей записи, как показано на следующем изображении.

image05

Соответствующим образом замените значения, такие как: ‘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}

Для получения дополнительной информации ознакомьтесь с нашей документацией по хукам здесь.

Все известные проблемы →