background gradient
s2 - IT photo №27611

Полезные функции для работы с WPML

Если не найдете ответ — пишите комментарий, разберу вашу проблему и добавлю решение!

Сменить текущий язык сайта в коде

$lang = 'en'; 
do_action( 'wpml_switch_language', $lang ); // Меняем язык сайта на тот что в $lang

do_action( 'wpml_switch_language', null ); // Меняем язык сайта на основной

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

Получить текущий активный язык

$lang = apply_filters( 'wpml_current_language', null );
ПолучитьКопировать

Используйте перед изменением текущего языка в циклах, чтобы вернуть его в конце.

Получить оригинальный язык

$default_language = apply_filters( 'wpml_default_language', NULL );

Получить ID основного поста по ID перевода

$original_post_id = apply_filters( 'wpml_object_id', $post_id, $post_type, false, $default_language );

Этот код поможет узнать ИД оригинальной записи по ИД перевода

Изменить язык поста

$type_post = 'news'; // post type
$new_language = 'en'; // new lang
$post_id = 1; // post ID
$original_product_id = $post_id;
$translated_tr_product_id = $post_id;

$get_language_args = array('element_id' => $original_product_id, 'element_type' => $type_post );
$original_post_language_info = apply_filters( 'wpml_element_language_details', null, $get_language_args );
$set_language_args = array(
  'element_id'    => $translated_tr_product_id,
  'element_type'  => 'post_'.$type_post,
  'trid'   => $original_post_language_info->trid,
  'language_code'   => $new_language,
  'source_language_code' => $original_post_language_info->language_code
);

do_action( 'wpml_set_element_language_details', $set_language_args );

Укажите $post_id и $type_post для правильной работы. Этот код изменяет установленный язык записи на указанный в $lang

Изменить язык поста и привязать в виде перевода

        $new_language = 'en';
        $post_id = 1; // post ID
        $post_id_en = 1; // post ID en
        $post_type = 'product';
        // Получаем информацию о языке оригинальной записи
        $get_language_args = array(
            'element_id'   => $post_id,
            'element_type' => 'post_' . $post_type
        );
        $original_post_language_info = apply_filters('wpml_element_language_details', null, $get_language_args);
        
        if ($original_post_language_info) {
          // Привязываем перевод к оригинальной записи
          $set_language_args = array(
            'element_id'           => $post_id_en, // ID переведенной записи
            'element_type'         => 'post_' . $post_type,
            'trid'                 => $original_post_language_info->trid, // ID перевода
            'language_code'        => $new_language, // Код языка перевода
            'source_language_code' => $original_post_language_info->language_code // Код языка оригинала
          );
      
          do_action('wpml_set_element_language_details', $set_language_args);
        }

Этот код особенно полезен когда перевод и оригинальный пост находятся в одном языке, к примеру они оба русские. Укажите ИД оригинального поста и перевода чтобы прикрепить EN перевод к оригинальной записи.

Как в цикле получить записи другого языка

// Установка текущего языка на английский
$lang = 'en';
do_action( 'wpml_switch_language', $lang );

// Аргументы запроса
$args = array(
    'post_type'      => 'post', // Укажите ваш тип записей
    'posts_per_page' => -1, // -1 для вывода всех записей, можно установить любое нужное количество
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
        the_title(); // Ваш код вывода поста
    endwhile;
else :
    echo 'Нет постов на английском языке.';
endif;

wp_reset_postdata(); // Сброс данных запроса
do_action( 'wpml_switch_language', null ); // Восстановление предыдущего языка

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

Получить данные поля из оригинальной записи в переводе

$post_id = get_the_ID();
$youtube_url = get_post_meta( $post_id, '_youtube', true );
if(!$youtube_url){
	$default_language = apply_filters( 'wpml_default_language', NULL );
	$post_type = 'product';
	$original_post_id = apply_filters( 'wpml_object_id', $post_id, $post_type, false, $default_language );
	$youtube_url = get_post_meta( $original_post_id, '_youtube', true );
} 

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

Привязка терминов из оригинала на перевод.

Получаем термины оригинального поста, потом у этих терминов получем переводы и прикрепляю их к посту-переводу. Этот код нужен когда у основного поста есть категории а у переводов нет категорий. Мы смотрим какие категории у оригинального поста и прикрепляем их к переводу.

      // require_once ABSPATH . 'wp-admin/includes/taxonomy.php'; // вдруг потребуется      
      $new_language = 'en';
      $post_id = 1; // post ID
      $post_id_en = 1; // post ID en
      $post_type = 'product';
      if($post_id and $post_id_en){
        $taxonomies = get_object_taxonomies($post_type, 'names');
        do_action( 'wpml_switch_language', $new_language );
        foreach ($taxonomies as $taxonomy) {
          $is_translated = apply_filters( 'wpml_is_translated_taxonomy', NULL,$taxonomy );
          if(!$is_translated) continue;
          $terms = wp_get_post_terms($post_id, $taxonomy);
          if (!empty($terms) and !is_wp_error($terms)) {
            $translated_term_ids = [];
            foreach ($terms as $term) {
              $translated_term_id = apply_filters('wpml_object_id', $term->term_id, $taxonomy, false, $new_language);
              if ($translated_term_id) {
                $translated_term_ids[] = $translated_term_id;
              }
            }
            wp_set_post_terms($post_id_en, $translated_term_ids, $taxonomy);
            // or
            wp_set_object_terms($post_id_en, $translated_term_ids, $taxonomy, false);
          }
        }
        do_action( 'wpml_switch_language', null );
      }

Если что то не работает то проверьте что возвращает функция привязки термина. Если она возвращает ID термина не того языка который вы указали в нее, то ошибка в action wpml_switch_language. Так же попробуйте подключить taxonomy.php, для этого подключите код из первой строки.

Добавить комментарий

Навигация:

Похожие

21437004-cf3d-4d35-aa13-82183efb2955_11zon - IT photo №28678
9 1
02 Окт 2024

В $_GET отсутствуют utm_source, как получить метки в php

Многие сталкиваются с проблемой, когда UTM-метки не передаются полностью через $_GET или $_SERVER. Почему это происходит? Проблема кроется в особенностях парсинга URL. «Не могу получить все UTM-метки из адреса. utm_source и utm_medium обрезаются.» Решения Проверьте URL. Убедитесь, что все параметры правильно закодированы. Используйте parse_str. Эта функция поможет корректно разобрать строку запроса. Проверьте сервер. Некоторые настройки […]

PHPSEO
fatores-de-ranqueamento-seo-2 - IT photo №28386
45 1
14 Апр 2024

PHP регулярка для удаления блока вместе с содержимым

В этой заметке покажу вам PHP код с использованием регулярных выражений для удаления блока вместе с его содержимым. Этот код выполняет следующие действия: preg_replace('/<li class="js-oglav-after js-oglav-psy".*?<\/li>/is', '', $content); — Удаляет все блоки <li> с классом "js-oglav-after js-oglav-psy" вместе со всем их содержимым из переменной $content. preg_replace('/<div style="padding: 30px 0 0 0".*?<\/div>/is', '', $content); — Удаляет […]

PHPSEOWordpress
1713081126_ms_chrome_tKr95u9sMx-min - IT photo №28384
41
14 Апр 2024

Код для удаления emoji в wordpress

WordPress по умолчанию включает поддержку эмодзи, для ускорения сайта их можно удалить. В этой статье мы рассмотрим, как удалить эмодзи в WordPress.   Для удаления эмодзи мы можем использовать несколько хуков и фильтров. Добавьте этот код в файл functions.php вашей темы или в плагина: Что делает код? remove_action('wp_head', 'print_emoji_detection_script', 7); — Удаляет скрипт, который обнаруживает […]

PHPWordpress
1713080563_ms_chrome_pepnRwEuKf-min - IT photo №28380
44
14 Апр 2024

Функция get_gravatar чтобы получить аватарку с gravatar в PHP.

Для вывода картинки с граватара нужно создать функцию, которая будет генерировать URL аватарки на основе email адреса пользователя. Вот пример такой функции: Разберем эту функцию: $email — email адрес пользователя, для которого мы хотим получить аватарку. $size — размер аватарки в пикселях (от 1 до 2048). $default — URL изображения, если не найдена аватарка на […]

PHPWordpress
94429980c63b4c0c8a4fcdbd2969d827-min - IT photo №28368
22 1
08 Апр 2024

Временные зоны в PHP

В этой статье мы рассмотрим полный список временных зон, совместимых с PHP. Мы охватим различные регионы мира, включая Европу, Азию, Африку, Индийский океан, Австралию, Тихий океан, Америку, Антарктику и Арктику. Мы также обсудим, как можно установить временную зону в PHP с помощью различных методов, таких как функция date_default_timezone_set(), редактирование файла php.ini или использование .htaccess или […]

PHP
ms_chrome_WB8ld8arlE - IT photo №28363
22 2
29 Марта 2024

Что делать если не выводится title в WordPress?

Проверьте чтобы в вашей теме, в header.php был вставлен код <?php wp_head(); >  перед закрывающим тегом </head> Как включить <title> в wordpress? Для подключения заголовков страниц, добавьте поддержку title tag в add_theme_support(). Пример как это сделать: Зайдите в function.php вашей темы и добавьте этот код: Вставив этот код, вы подключите вывод заголовка страницы в мета данных.

PHPWordpress