Многие темы специально отображают особые записи, страницы и рубрики, обычно на основе идентификаторов, например раздел записей «Избранные» на главной странице или выделенные рубрики.

В некоторых случаях эти идентификаторы жестко заданы в PHP темы, а в других – пользователь выбирает их на экране настроек темы.

Для правильного отображения темы необходимо выбрать идентификаторы для каждого языка. В WPML идентификаторы записей, страниц, рубрик и тегов меняются при смене языка, поэтому тема должна использовать правильные идентификаторы активного языка.

Для этого в WPML предусмотрено два варианта.

Можно либо включить автоматическую корректировку идентификаторов или вручную использовать wpml_object_id в вашей теме.

Какой вариант выбрать?

Автоматическая корректировка идентификаторов не требует изменений в коде. Ее можно использовать с любой темой, и все «просто работает». Недостатком использования является незначительное увеличение времени обработки и доступа к БД, поскольку WPML подключается ко многим функциям и проверяет правильность вывода на активном языке.

Ручная корректировка идентификатора с помощью функции wpml_object_id позволит достичь тех же результатов и может быть более эффективной с точки зрения обработки. Но она требует значительных изменений в коде темы.

Если вы создаете тему с нуля, вам следует использовать wpml_object_id для выполнения этого вручную. Если вы начинаете с использованием существующей темы, взлом и изменение темы могут быть невозможны, и автоматическая корректировка идентификатора может оказаться единственным вариантом.

В любом случае, использование любого плагина кеширования сведет влияние этой операции на производительность к нулю. Кеширование всегда рекомендуется для сайтов любого размера. WPML отлично работает с WP Super Cache и W3 Total Cache (который мы также используем на различных сайтах).

1) Автоматическая корректировка идентификаторов

WPML может подключаться к API-функциям WordPress, определять время загрузки определенных элементов и корректировать идентификаторы, чтобы результаты были настроены под активный язык.

Эта функция включена по умолчанию и доступна через WPML->Языки:

Скорректировать идентификаторы для многоязычной функциональности

Все идентификаторы будут откорректированы автоматически и это можно использовать в любой теме WordPress, которая правильно использует API (почти любая тема, которую можно найти).

2) Вручную, используя функцию wpml_object_id

Как вариант, если автоматическая корректировка идентификатора отключена, можно использовать функцию wpml_object_id для достижения того же вручную.

apply_filters( ‘wpml_object_id’, int $element_id, string $element_type, bool $return_original_if_missing, mixed $ulanguage_code )

В случае версий WPML >= 3.2 используйте перехватчик фильтра wpml_object_id. После WPML 3.3 функция icl_object_id отмечена как устаревшая и была полностью удалена в версии 3.3

Пример использования

echo apply_filters( 'wpml_object_id', 4, 'category', TRUE  );

Возврат идентификатора рубрики на текущем языке для идентификатора рубрики 4. Если перевод отсутствует, он вернет исходник (здесь: идентификатор рубрики 4).

Посетите нашу страницу API, чтобы увидеть другие примеры и найти более подробную информацию об использовании

Перевод массивов идентификаторов

Очень часто приходится конвертировать целые массивы идентификаторов объектов (чаще всего это идентификаторы рубрик). Для этого можно использовать следующую функцию:

function lang_object_ids($object_id, $type) {

    if( is_array( $object_id ) ){

        $translated_object_ids = array();

        foreach ( $object_id as $id ) {

            $translated_object_ids[] = apply_filters( 'wpml_object_id', $id, $type, true, $current_language );

        }

        return $translated_object_ids;

    } else {

  return apply_filters( 'wpml_object_id', $object_id, $type, true, $current_language );

 }

}

Эта функция также принимает тип объекта в качестве аргумента.

Например, чтобы получить массив идентификаторов для рубрик 1.3 и 6, мы будем вызывать:

lang_object_ids(array(1,3,6),'category')

Отображение элементов страницы на разных языках

Дополнительный параметр ulanguage_code позволяет сочетать элементы страницы на разных языках.

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

  1. Получите идентификатор страницы на языке, на котором существует галерея.
  2. Зациклите изображения этой страницы и отобразите их.