WPML code & solutions examples
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" 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> // Получаем вывод адреса. При смене языка, будет отображаться переведенный адрес