Skip navigation
Обновлено
7 июня, 2024

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

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

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

WPML включает две опции для достижения этой цели.

Вы можете либо включить автоматическую настройку ID, либо использовать wpml_object_id вручную в Вашей теме.

Какой вариант использовать?

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

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

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

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

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

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

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

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

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

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

В качестве альтернативы, если автоматическая настройка 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  );

Верните ID категории на текущем языке для ID категории 4. Если перевод отсутствует, он вернет оригинал (здесь: ID категории 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. Перейдите к изображениям для этой страницы и отобразите их.