
Создать сайт на нескольких языках не сложно. Существует специальный плагин, называется Polylang.
- Плагин Polylang. Часть первая. Настройка и установка
- Плагин Polylang. Часть вторая. Настройка записей
- Плагин Polylang. Вставка переключателя языков
- Как добавить переключатель языков в любом месте шаблона?
- Добавление переключателя языков в нужном месте шаблона
- Код для вывода переключателя в виде флажков
- Код для переключателя в виде выпадающего списка
- Возможные проблемы при работе плагина Polylang
- 1. Ошибка 404
- 2. Использование технологии AJAX
- 3. Не переводиться главная страница
- 4. Куда пропадают рубрики-записи-страницы?
- 5. Куда пропадает переключатель языков в меню?
- 6. Объединение комментариев на разных языках
Принцип его работы прост и незамысловат — для каждой записи или страницы создается дублирующий контент на нужном языке. А дальше плагин сам распределяет для какого языка и какую страницу выводить.
Более подробно о настройке плагина можно посмотреть ниже
Обновил видео по настройке плагина Polylang. Сначала надо посмотреть новое видео, а по нюансам можно уже глянуть старые видео.
Плагин Polylang. Часть первая. Настройка и установка
Плагин Polylang. Часть вторая. Настройка записей
Плагин Polylang. Вставка переключателя языков
Переключатель языков можно установить по-разному:
- в боковой панели через виджеты
- в меню
Как добавить переключатель языков в любом месте шаблона?
Можно обратиться к документации на плагин и использовать специальную функцию
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 и при первом запуске настроек плагин вас спрашивает
Вы ставите галочку и нажимаете Сохранить. И вот тут-то и происходит следующее: всем вашим страницам, рубрикам, записям присваивается выбранный язык по умолчанию. Теперь в дело вступает фильтр самого плагина, который сортирует все страницы-рубрики-записи по языкам. Вот смотрите, показывается список записей для английского языка
Если записей на этом языке нет, то естественно он их и не показывает. Переключаем на другой язык
Оп-па! Сразу видим кучу записей на русском языке! То же самое происходит с рубриками и страницами. Чаще всего виноват в том, что вы не видите нужных вам записей-рубрик-страниц именно переключатель в верхней админ панели.
Ставьте переключатель в положение «Показать все языки» и все увидите.
к содержанию5. Куда пропадает переключатель языков в меню?
Здесь по проще. Если вы вдруг при создании меню не видите раздела «Переключатель языков»
Обратите внимание на вкладку «Настройки экрана», в ней должна стоять галочка «Переключатель языков»
Установите галочку и появиться раздел «Переключатель языков»
к содержанию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);
Вот, как-то так…
Если есть вопросы задавайте в комментариях. Всегда рад помочь.
Всегда ваш, Артем.