Метка: wpml

Ссылка на перевод страницы WPML/WordPress

Очень часто я в проектах сталкиваюсь с тем, что на страницах в шаблонах присутствуют статические кнопки, ссылки, изображения-ссылки на какие-то страницы (типа контакты, услуги и т.п.). Для них нужно учитывать тот момент, что если проставить просто статическую ссылку, то при переходе на другой язык — ссылка будет вести на ту страницу, которую вы хотите открыть кликая на нее, но на языке, который указан в самой ссылке. Это не правильно. Вот по этому для всех тех, кто пользуется плагином WPML (WordPress) я написал краткий мануал о том, как правильно проставлять такие ссылки корректно.

Конструкция

<?=apply_filters( 'wpml_get_translated_slug', '_post_slug_', '_post_type_', ICL_LANGUAGE_CODE);?>

используется для создания ссылок на переведенные страницы в WordPress, когда используется плагин WPML (WordPress Multilingual). Она позволяет получить переведенный слаг (часть URL-адреса после домена) страницы для заданного типа записи и языка.

Для использования этой конструкции необходимо заменить «post_slug» на слаг страницы, которую вы хотите перевести, «_post_type_» на тип записи (например, post или page), а ICL_LANGUAGE_CODE на языковой код, соответствующий языку перевода.

Например, если вы хотите создать ссылку на переведенную страницу с заголовком «About Us» (тип записи «page») на испанском языке (код языка «es»), то конструкция будет выглядеть следующим образом:

<?=apply_filters( 'wpml_get_translated_slug', 'about-us', 'page', 'es');?>

Такая ссылка будет указывать на страницу с переведенным заголовком «Acerca de nosotros».

Использование конструкции <?=apply_filters( ‘wpml_get_translated_slug’, ‘_post_slug_’, ‘_post_type_’, ICL_LANGUAGE_CODE);?> позволяет создавать ссылки на переведенные страницы без необходимости знать их фактический URL-адрес, что может быть полезно при изменении структуры сайта или переносе страниц на другие адреса.

WordPress pre_get_posts redirect для мультиязычного контента с помощью wpml

Появилась необходимость реализовать следующий функционал:

есть несколько языков на сайте: английский, испанский и китайский. Новости пишут только на английском языке. Для остальных языковых версий нужно сделать тизер для каждой новости (превью / лид-текст новости) и если пользователь кликает по не ней — то переводить его на английскую версию сайта и открывать интересующую новость на английском языке.

Задача не тривиальная. Решение весьма простое.

Был написал следующий функционал в файле functions.php

add_action('pre_get_posts', function(){
if(in_array( get_post_type(), ['event', 'post']) && is_single())
{
    $wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink(), 'en' );
    if(ICL_LANGUAGE_CODE != 'en' && !empty($wpml_permalink))
    {
        $wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink(), 'en' );
        echo '<script type="text/javascript">';
        echo 'window.location = "'.$wpml_permalink.'";';
        echo '</script>';
    }
}
});

Здесь мы проверяем

in_array( get_post_type(), [‘event’, ‘post’])

тип нашего поста event или post? Если да, то проходим к дальнейшей проверке:

is_single()

тут мы проверяем — является ли наша запись к существующему отдельному представлению. Это необходимо для того, чтобы в админке WordPress не выполнялся дальнейший код.

Собственно далее мы проверяем, не английский ли у нас язык (используется WPML плагин для мультиязычности) и если это так, то редиректим страницу на английскую версию сайта.

echo '<script type="text/javascript">';
        echo 'window.location = "'.$wpml_permalink.'";';
        echo '</script>';

где $wpml_permalink это ссылка на текущую новость на английском языке:

$wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink(), 'en' );

Своя ссылка на перевод страницы WPML

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

Мы решаем эту проблему созданием собственной функции, которую назовем, скажем my_languages_list() и разместим ее в файле functions.php

function my_languages_list(){
    $languages = apply_filters( 'wpml_active_languages', NULL, 'skip_missing=0&orderby=code' );
    if( !empty( $languages ) ){
        echo '<ul class="languages-list">';
        foreach( $languages as $l ){
            if(!$l['active'])
            {
	            echo '<li>';
	            echo '<a href="'.$l['url'].'">';
	            echo $l['tag'];
				echo '</a>';
				echo '</li>';
			}
        }
        echo '</ul>';
    }
}

own link to translated page wpml wordpress

Данная функция выводит название языка, которое мы указали в настройках в значении tag. Это сделано потому, что у нас на сайте присутствует китайский и он отображается полностью как 简体中文 (Chinese (Simplified), а нам необходимо, чтобы отображалось, кака ZH.

По этому мы эту задачу и решили через вызов функции:

<?=my_languages_list();?>

в нужном месте в файле header.php

link to translated page wpml

Как видите — все довольно просто. В самой функции my_languages_list можно настраивать вывод уже как угодно и как требуем задача непосредственно.