WPML code & solutions examples

Last update: 22 Квітня, 2023

Category: WordPress

Определение языка страницы WPML

Определение текущего языка страницы:

<?php
global $sitepress;
$current_lang = $sitepress->get_current_language();
?>

Вывод контента в коде на определенном языке

Для вывода переводов контента в коде страницы потребуется установить плагин WPML Shortcodes (автор Mirco Babini):

<?php
wpml_e__if_language( '', 'uk' );
wpml_e__if_language( '', 'ru' );
wpml_e__if_language( '', 'en' );
?>

Вывод переключателя языков

Этот код поможет получить перечень доступных на странице языков и их правильные называния:

<?php
if ( function_exists('icl_get_languages') ) {
  $languages = icl_get_languages('skip_missing=1&orderby=code&order=asc');
  foreach ( $languages as $language ) : 
  echo $language['native_name'].' ';
  endforeach;
}
?>

Пример вывода переключателя языков #1

<div class="">
    <?php
  if ( function_exists('icl_get_languages') ) {
        $languages = icl_get_languages('skip_missing=1&orderby=code&order=asc');
        $lang_active = '';
        $langs_other = '';
    foreach ( $languages as $language ) :
      /* Перебираем все языки, устанавливаем выводимое краткое название и класс. Класс нужен (к примеру) для случаев, когда мы добавляем иконку флага. */    
      switch ($language['native_name']) {
        case 'English':
          $lang_short = 'Eng';
          $lang_class = 'si_wpml_icon_eng';
          break;
        case 'Türkçe':
          $lang_short = 'Tur';
          $lang_class = 'si_wpml_icon_tur';
          break;
        case 'Русский':
          $lang_short = 'Ru';
          $lang_class = 'si_wpml_icon_rus';
          break;
      }
      
      /* Проверяем, активный ли текущий язык (активный язык не должен быть ссылкой) */
                if ( $language['active'] == '1' ) { // активный
                        $lang_active = '<div><i class="'.$lang_class.'">'.$lang_short.'</i></div>';
                    } else { // не активный
                        $langs_other .= '<a href="'.$language['url'].'"><i class="'.$lang_class.'">'.$lang_short.'</i></a>';
                    }
            endforeach;
    }
  
  /* Выводим полученную информацию */
  echo $lang_active;
  echo $langs_other;
    ?>
</div>

Пример вывода переключателя языков #2

<?php
if ( function_exists('icl_get_languages') ) {
    $languages = icl_get_languages('skip_missing=1&orderby=code&order=asc');
    foreach ( $languages as $language ) :
        switch ($language['native_name']) {
        case 'English':
            $lang_short = 'EN';
            break;
        case 'Ukrainian':
            $lang_short = 'UA';
            break;
        case 'Русский':
            $lang_short = 'RU';
            break;
        }
        //echo $language['native_name'];
        if ( $language['active'] == '1' ) { // активный
            echo '<div class="lang"><span>'.$lang_short.'</span></div>';
        } else {
            echo '<div class="lang"><a href="'.$language['url'].'">'.$lang_short.'</a></div>';
        }
    endforeach;
}

Отключаем подключение лишнего в WPML

Как в WPML отключить подключение css в виде генерации строки вида?

<link rel="stylesheet" id="wpml-legacy-horizontal-list-0-css"
href="http://sitename.domein/wp-content/plugins/sitepress-multilingual-cms/templates/language-switchers/legacy-list-horizontal/style.css?ver=1&quot;
type="text/css" media="all">

Открываем консоль WordPress, переходим в настройки плагина WPML. Как правило они находятся по адресу:

https://sitename.domein/wp-admin/admin.php?page=sitepress-multilingual-cms%2Fmenu%2Flanguages.php

После чего меняем окончание Flanguages.php на Ftroubleshooting.php.

Перед нами откроется консоль поиска/решения проблем, в которой мы жмем на кнопку “Очистить кэш WPML”. У меня после этого проблема исчезла, никаких побочных эффектов выявлено не было. Но всё же рекомендую сделать перед правками бекап сайта.

 

wpml_e__if_language больше не работает как часть стандартного WPML-плагина. Вам нужно установить дополнительный плагин (название WPML Shortcodes, автор Mirco Babini), и после этого Вы сможете использовать этот запрос как раньше 🙂

WPML: получение переменных с другой страницы с учетом мультиязычности

Пример случая, когда это может понадобиться: На странице контактов адрес заведения выведен через произвольные поля, и его нужно дублировать на всех страницах сайта в футере. Целесообразно сделать так, чтобы при изменении на странице контактов адрес автоматически подправился на всех страницах, причем учитывало текущий язык страницы.

Есть 2 простых варианта реализации этой задачи.

1. Если такое поле у нас одно: Просто узнаем текущий язык и меняем обращение к странице.

<?php
    global $sitepress;
    $current_lang = $sitepress->get_current_language();
    if ( $current_lang == 'uk' ) {
        the_field('fieldname', 1);
    } else if ( $current_lang == 'en' ) {
        the_field('fieldname', 2);
    }
?>

Где fieldname – название поля, а 1, 2 – номер публикации, с которой берем поле в соответствии с языком.

2. Если таких полей у нас много, то прописывать для каждого поля условие не уместно, потому в переменной будем хранить id публикации, к которой будем обращаться.

<?php
    global $sitepress;
    $current_lang = $sitepress->get_current_language();

    switch ($current_lang) {
        case 'uk': $contact_page_id = 1; break;
        case 'en': $contact_page_id = 2; break;
    }

// и в месте запроса содержимого поля соответственно получим
the_field('fieldname', $contact_page_id);
?>

// или можно использовать другой код который принимает url страницы и возвращает ID записи, язык указывать не нужно, он подтягивается сам
<?php
    $idcon = url_to_postid( 'url' );
?>
// Пример использования 
<?php
    $idcon = url_to_postid( 'contacts' ); //или // $idcon = url_to_postid( 'https://idma.com/contacts/' ) // что равносильно друг другу
?>
<p><?php echo get_field('adres', $idcon); ?><p>
// Получаем вывод адреса. При смене языка, будет отображаться переведенный адрес