Мультиязычный сайт на WordPress

Создать сайт на нескольких языках не сложно. Существует специальный плагин, называется Polylang.

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

lang_1Более подробно о настройке плагина можно посмотреть ниже

Обновил видео по настройке плагина Polylang. Сначала надо посмотреть новое видео, а по нюансам можно уже глянуть старые видео.

к содержанию

Плагин Polylang. Часть первая. Настройка и установка

к содержанию

Плагин Polylang. Часть вторая. Настройка записей

к содержанию

Плагин Polylang. Вставка переключателя языков

Переключатель языков можно установить по-разному:

  • в боковой панели через виджеты

lang_2

  • в меню

lang_2

к содержанию

Как добавить переключатель языков в любом месте шаблона?

Можно обратиться к документации на плагин и использовать специальную функцию

pll_the_languages($args);

Где $args может принимать следующие аргументы

  • ‘dropdown’ => 0 — простой список, 1 — выпадающий список (по умолчанию: 0)
  • ‘show_names’ => вывод названий языков (по умолчанию: 1)
  • ‘display_names_as’ => или ‘name’ или ‘slug’ (по умолчанию: ‘name’)
  • ‘show_flags’ => 1 — показывать картинки флагов (по умолчанию: 0)
  • ‘hide_if_empty’ => 1 — скрывает записи и страницы без контента (по умолчанию: 1)
  • ‘force_home’ => 1 — добавляется ссылка на главную страницу (по умолчанию: 0)
  • ‘hide_if_no_translation’ => 1- скрывает язык если перевода не существует (по умолчанию: 0)
  • ‘hide_current’=> 1 — скрывает текущий язык (по умолчанию: 0)
  • ‘raw’ => 1 — создание собственного переключателя с нужными параметрами (по умолчанию:0)

Примеры:

// вывод списка названий языков
<ul><?php pll_the_languages(); ?></ul>
 
// вывод только флагов, без названий языков
<ul><?php pll_the_languages(array('show_flags'=>1,'show_names'=>0)); ?></ul>
 
// вывод названий языков в выпадающем списке
<?php pll_the_languages(array('dropdown'=>1));  ?>

Если вдруг вам не хватает данных параметров, то можно и собственный переключатель сделать

$translations = pll_the_languages(array('raw'=>1));

Функция вернет массив данных

  • [id] => идентификатор языка
  • [slug] => код языка используемый в ссылке
  • [name] => название языка
  • [url] => ссылка на перевод
  • [flag] => ссылка на флаг
  • [current_lang] => вернет true если текущий язык, если нет, то false
  • [no_translation] => вернет true если нет перевода, иначе — false

Более подробно с документацией и дополнительными функциями можно ознакомиться вот здесь.

к содержанию

Добавление переключателя языков в нужном месте шаблона

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

Урок конечно общий, так можно вставлять в нужное место не только переключатели

к содержанию

Код для вывода переключателя в виде флажков

<ul class="langflags"><?php pll_the_languages(array('show_flags'=>1,'show_names'=>0)); ?></ul>

И стили, что бы флажки  были в одну строку:

.langflags {
float: left;
min-width: 50px;
position: relative;
margin: 30px 5px 0 0px;
}
.langflags li {
float:left; 
margin-right:5px;
}

Код для переключателя в виде выпадающего списка

<?php pll_the_languages(array('dropdown'=>1));  ?>

Данная функция сразу формирует нужный хтмл код.

Возможные проблемы при работе плагина Polylang

Пока я встретился с тремя проблемами.

1. Ошибка 404

После настройки плагина могут поехать все ссылки на сайте и начнет выдавать ошибку 404. Страшного ничего в этом нет, достаточно по новой пересохранить постоянные ссылки, по адресу Консоль — Настройки — Постоянные ссылки просто нажмите Сохранить.

2. Использование технологии AJAX

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

Так вот, плагин Polylang не понимает такие вещи и вам все равно придется для переключения языков перезагружать страницу. Решение этой проблемы только одно — отключать AJAX для перехода между страницами.

3. Не переводиться главная страница

Допустим, вам требуется сделать главную страницу в виде одностраничника, что бы на ней выводить некий контент. И при этом, еще используется несколько языков. Проблема будет только в одном — нет возможности перевести главную страницу, потому что для создания этой самой главной страницы используется не отдельная страница, а сам файл index.php Проверить это можно только заглянув в код самого этого файла… Ну а так, как невозможно сделать дублирующую страницу для файла index.php то и перевод к ней прикрутить не получиться.

Решений может быть два — менять шаблон или создавать отдельную страницу для главной…

к содержанию

4. Куда пропадают рубрики-записи-страницы?

Если пропадают рубрики уже существующие или вы не видите ранее созданных страниц — скорее всего у вас переключатель языков в админ панели установлен в какое-то одно из положений текущего языка.

Как работает такой переключатель?

Допустим, у вас на сайте есть несколько страниц, записей, рубрик. Вы решили добавить мультиязычности и выбрали два языка: английский и русский. Устанавливаете плагин Polylang и при первом запуске настроек плагин вас спрашивает

lang_4

Вы ставите галочку и нажимаете Сохранить. И вот тут-то и происходит следующее: всем вашим страницам, рубрикам, записям присваивается выбранный язык по умолчанию. Теперь в дело вступает фильтр самого плагина, который сортирует все страницы-рубрики-записи по языкам. Вот смотрите, показывается список записей для английского языка

lang_5

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

lang_6

Оп-па! Сразу видим кучу записей на русском языке! То же самое происходит с рубриками и страницами. Чаще всего виноват в том, что вы не видите нужных вам записей-рубрик-страниц именно переключатель в верхней админ панели.

lang_7

Ставьте переключатель в положение «Показать все языки» и все увидите.

к содержанию

5. Куда пропадает переключатель языков в меню?

Здесь по проще. Если вы вдруг при создании меню не видите раздела «Переключатель языков»

lang_8

Обратите внимание на вкладку «Настройки экрана», в ней должна стоять галочка «Переключатель языков»

lang_9

Установите галочку и появиться раздел «Переключатель языков»

к содержанию

6. Объединение комментариев на разных языках

Решение такое: добавляем в файл functions.php такой код

//Remove the filter
function polylang_remove_comments_filter() {
global $wp_filter;
global $polylang;
remove_filter(‘comments_clauses’, array(&$polylang, ‘comments_clauses’));
}

function sort_merged_comments($a, $b) {
return $a->comment_ID – $b->comment_ID;
}

//Get the comments from the same posts in different languages
function merge_comments($comments, $post_ID) {
global $sitepress;
remove_filter( ‘comments_clauses’, array( $sitepress, ‘comments_clauses’ ) );
// get all the languages for which this post exists
$languages = icl_get_languages(‘skip_missing=1’);
$post = get_post( $post_ID );
$type = $post->post_type;
foreach($languages as $code => $l) {
// in $comments are already the comments from the current language
if(!$l[‘active’]) {
$otherID = icl_object_id($post_ID, $type, false, $l[‘language_code’]);
$othercomments = get_comments( array(‘post_id’ => $otherID, ‘status’ => ‘approve’, ‘order’ => ‘ASC’) );
$comments = array_merge($comments, $othercomments);
}
}
if ($languages) {
// if we merged some comments in we need to reestablish an order
usort($comments, ‘sort_merged_comments’);
}
//
add_filter( ‘comments_clauses’, array( $sitepress, ‘comments_clauses’ ) );

return $comments;
}

//Add comments for the same posts in different languages
function merge_comment_count($count, $post_ID) {
// get all the languages for which this post exists
$languages = icl_get_languages(‘skip_missing=1’);
$languages = pll_the_languages(array(‘raw’=>1 ));
$post = get_post( $post_ID );
$type = $post->post_type;

foreach($languages as $l) {
// in $count is already the count from the current language
if(!$l[‘active’]) {
$otherID = icl_object_id($post_ID, $type, false, $l[‘language_code’]);
if($otherID) {
// cannot use call_user_func due to php regressions
if ($type == ‘page’) {
$otherpost = get_page($otherID);
} else {
$otherpost = get_post($otherID);
}
if ($otherpost) {
// increment comment count using translation post comment count.
$count = $count + $otherpost->comment_count;
}
}
}
}
return $count;
}

//Trigger the functions
add_action(‘wp’,’polylang_remove_comments_filter’);
add_filter(‘comments_array’, ‘merge_comments’, 100, 2);
add_filter(‘get_comments_number’, ‘merge_comment_count’, 100, 2);
Данное решение мной не проверялось. Найдено читателем сайта

Вот, как-то так…

Если есть вопросы задавайте в комментариях. Всегда рад помочь.

Всегда ваш, Артем.