Многие темы специально отображают особые записи, страницы и рубрики, обычно на основе идентификаторов, например раздел записей «Избранные» на главной странице или выделенные рубрики.
В некоторых случаях эти идентификаторы жестко заданы в 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 )
Пример использования
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 позволяет сочетать элементы страницы на разных языках.
Например, если у вас есть галерея изображений и вы не хотите дублировать изображения на каждом языке, выполните следующие действия:
- Получите идентификатор страницы на языке, на котором существует галерея.
- Зациклите изображения этой страницы и отобразите их.