Многоязычность — важный аспект для сайтов, ориентированных на международную аудиторию. Обычно в WordPress для реализации мультиязычности используют плагины, такие как Polylang или WPML. Однако иногда возникает необходимость сделать многоязычный сайт без сторонних плагинов, чтобы снизить нагрузку, повысить безопасность и сохранить полный контроль над кодом.
Почему стоит реализовывать многоязычность без плагинов
Использование плагинов — быстрый и удобный способ добавить языки, но у них есть свои недостатки:
- Избыточный код и нагрузка на сайт.
- Зависимость от обновлений и поддержки разработчиков.
- Потеря гибкости при кастомизации.
Реализуя многоязычность вручную, вы получаете:
- Легкий и оптимизированный код.
- Возможность полностью контролировать структуру и логику.
- Отсутствие конфликтов с другими плагинами.
Основные подходы к реализации многоязычности без плагинов
Существует несколько вариантов:
1. Использование пользовательских типов записей для каждого языка
Создайте отдельный тип записи для каждого языка, например, post_en, post_ru, и выводите их в зависимости от выбранного языка.
Плюс такого подхода — простота реализации. Минус — дублирование кода и сложность синхронизации контента.
2. Использование пользовательских таксономий для языков
В этом методе добавляется таксономия language, где каждому посту присваивается термин с языком — «ru», «en» и т.д.
Далее вы фильтруете запросы WP_Query по этой таксономии для вывода контента нужного языка.
3. Использование URL-параметров или поддоменов
Можно реализовать переключение языков по параметру в URL, например, ?lang=ru, или использовать поддомены ru.example.com.
Это удобно для SEO и позволяет гибко настраивать маршрутизацию.
Пример реализации многоязычности с помощью пользовательской таксономии
Создадим таксономию wpid_language для постов:
function wpid_register_language_taxonomy() {
$labels = [
'name' => 'Языки',
'singular_name' => 'Язык',
'search_items' => 'Поиск языков',
'all_items' => 'Все языки',
'edit_item' => 'Редактировать язык',
'update_item' => 'Обновить язык',
'add_new_item' => 'Добавить новый язык',
'new_item_name' => 'Новое название языка',
'menu_name' => 'Языки',
];
register_taxonomy('wpid_language', 'post', [
'labels' => $labels,
'public' => true,
'hierarchical' => false,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => ['slug' => 'language'],
]);
}
add_action('init', 'wpid_register_language_taxonomy');После регистрации в админке появится возможность назначать языки постам.
Фильтрация постов по языку с помощью pre_get_posts
Чтобы выводить на фронтенде только посты определенного языка, добавим фильтр:
function wpid_filter_posts_by_language($query) {
if (!is_admin() && $query->is_main_query()) {
if (isset($_GET['lang'])) {
$lang = sanitize_text_field($_GET['lang']);
$tax_query = [
[
'taxonomy' => 'wpid_language',
'field' => 'slug',
'terms' => $lang,
],
];
$query->set('tax_query', $tax_query);
}
}
}
add_action('pre_get_posts', 'wpid_filter_posts_by_language');Теперь при запросе https://example.com/?lang=ru вы увидите только посты с языком «ru».
Автоматизация добавления языков и переводов
Чтобы упростить администрирование, можно сделать метабоксы или интерфейс для быстрого создания связей между постами разных языков. Например, в записи на русском добавить ссылку на перевод на английский.
Это поможет навигации и улучшит UX.
SEO и структура URL для многоязычности без плагинов
Для SEO важно правильно организовать URL. Вот популярные варианты:
- Папки:
example.com/ru/post-name/ - Поддомены:
ru.example.com/post-name/ - Параметры:
example.com/post-name?lang=ru
Для реализации папок можно добавить правила в .htaccess и обработку в WordPress через хук parse_request. Это немного сложнее, но дает лучший результат.
Пример обработки URL с языковыми папками
function wpid_parse_language_from_url() {
$request_uri = $_SERVER['REQUEST_URI'];
$segments = explode('/', trim($request_uri, '/'));
$langs = ['ru', 'en', 'de'];
if (in_array($segments[0], $langs)) {
define('WPID_CURRENT_LANG', $segments[0]);
// Можно подменить глобальные переменные для корректного запроса
add_filter('pre_get_posts', function ($query) {
if ($query->is_main_query()) {
$query->set('tax_query', [[
'taxonomy' => 'wpid_language',
'field' => 'slug',
'terms' => WPID_CURRENT_LANG,
]]);
}
});
} else {
define('WPID_CURRENT_LANG', 'ru'); // язык по умолчанию
}
}
add_action('init', 'wpid_parse_language_from_url');Вывод переключателя языков
Для удобства пользователей сделаем простой переключатель языков:
function wpid_language_switcher() {
$langs = get_terms(['taxonomy' => 'wpid_language', 'hide_empty' => false]);
if (!$langs || is_wp_error($langs)) return;
echo '<ul class="wpid-language-switcher">';
$current_lang = defined('WPID_CURRENT_LANG') ? WPID_CURRENT_LANG : '';
foreach ($langs as $lang) {
$class = ($lang->slug === $current_lang) ? 'class="active"' : '';
$url = add_query_arg('lang', $lang->slug, home_url('/'));
echo "<li {$class}><a href=\"{$url}\">{$lang->name}</a></li>";
}
echo '</ul>';
}Вызовите wpid_language_switcher() в нужном месте темы, чтобы отобразить список языков.
Поддержка перевода строк в шаблонах
Для многоязычия важно переводить не только контент, но и интерфейс. Вы можете использовать стандартные функции __() и _e() для перевода, а также создавать свои языковые файлы.
Для этого создайте папку languages в теме и используйте load_theme_textdomain('wpid', get_template_directory() . '/languages'); в functions.php.
Заключение
Добавление многоязычности без плагинов — задача, требующая больше времени и навыков, но она дает полный контроль и оптимизацию. Главное — грамотно организовать структуру, фильтрацию и навигацию.
Если нужна готовая расширенная функциональность, можно посмотреть на плагин Clearfy Pro, который оптимизирует работу сайта, включая языковые настройки.