Многоязычный сайт — это важный элемент для расширения аудитории и повышения удобства пользователей. Обычно для реализации многоязычности в WordPress используются популярные плагины, такие как Polylang или WPML. Однако иногда возникает задача сделать это без плагинов, чтобы не нагружать сайт и избежать конфликтов.
Почему стоит делать многоязычность без плагинов
Плагины для многоязычности увеличивают нагрузку на сайт, замедляют работу и могут создавать сложности при обновлениях. Без плагинов вы получаете полный контроль над структурой и функционалом сайта. Это особенно актуально для небольших проектов, где нужно реализовать 2–3 языка с минимальными затратами.
Кроме того, такой подход позволяет глубже понять работу WordPress и расширить навыки программирования.
Однако стоит понимать, что без плагинов придется реализовывать многие функции вручную, включая переключение языков, хранение контента для разных языков и SEO.
Как организовать многоязычность в WordPress без плагинов
Создаем структуру URL для языков
Первый шаг — определить структуру URL. Чаще всего используют подкаталоги, например:
- example.com/ru/ — русский язык
- example.com/en/ — английский язык
Для этого в файле functions.php вашей темы или в отдельном плагине добавим фильтр на пермалинки и обработчик для языка.
function wphelper_set_language_from_url() {
$uri = trim($_SERVER['REQUEST_URI'], '/');
$parts = explode('/', $uri);
$lang = $parts[0];
$available_langs = ['ru', 'en'];
if (in_array($lang, $available_langs)) {
define('WPS_HELPER_CURRENT_LANG', $lang);
} else {
define('WPS_HELPER_CURRENT_LANG', 'ru'); // язык по умолчанию
}
}
add_action('init', 'wphelper_set_language_from_url');Этот код устанавливает константу WPS_HELPER_CURRENT_LANG с текущим языком, основываясь на первом сегменте URL.
Храним переводы в пользовательских полях
Чтобы хранить контент для разных языков без плагинов, удобно использовать пользовательские поля (post meta). Например, для заголовка и текста поста создадим поля title_en, title_ru, content_en, content_ru.
В редакторе WordPress можно использовать стандартный метабокс или написать свой для удобства редактирования.
Вывод контента на текущем языке
В шаблоне темы заменим стандартные функции the_title() и the_content() на наши функции, которые будут выводить нужный перевод.
function wphelper_get_translated_meta($post_id, $field) {
$lang = defined('WPS_HELPER_CURRENT_LANG') ? WPS_HELPER_CURRENT_LANG : 'ru';
$meta_key = $field . '_' . $lang;
$value = get_post_meta($post_id, $meta_key, true);
if (!$value) {
// fallback на русский
$value = get_post_meta($post_id, $field . '_ru', true);
}
return $value;
}
function wphelper_the_title() {
echo wphelper_get_translated_meta(get_the_ID(), 'title');
}
function wphelper_the_content() {
echo wphelper_get_translated_meta(get_the_ID(), 'content');
}Теперь в шаблоне замените the_title() на wphelper_the_title(), а the_content() на wphelper_the_content().
Создаем переключатель языков
Для удобства пользователей нужен переключатель языков, который будет менять URL, сохраняя текущий путь.
function wphelper_language_switcher() {
$available_langs = ['ru' => 'Русский', 'en' => 'English'];
$current_lang = defined('WPS_HELPER_CURRENT_LANG') ? WPS_HELPER_CURRENT_LANG : 'ru';
$uri = trim($_SERVER['REQUEST_URI'], '/');
$parts = explode('/', $uri);
if (in_array($parts[0], array_keys($available_langs))) {
array_shift($parts); // удаляем текущий язык из URL
}
$path = implode('/', $parts);
echo '<ul class="language-switcher">';
foreach ($available_langs as $code => $name) {
$url = site_url('/' . $code . '/' . $path);
$class = $code === $current_lang ? 'active' : '';
echo '<li class="' . $class . '"><a href="' . esc_url($url) . '">' . esc_html($name) . '</a></li>';
}
echo '</ul>';
}Вызовите wphelper_language_switcher() в нужном месте темы (например, в header.php), чтобы вывести переключатель.
SEO для многоязычного сайта без плагинов
Для правильной индексации поисковиками важно указывать теги hreflang. Добавим их в header.php:
function wphelper_add_hreflang_tags() {
$available_langs = ['ru', 'en'];
$current_url = home_url($_SERVER['REQUEST_URI']);
$uri = trim($_SERVER['REQUEST_URI'], '/');
$parts = explode('/', $uri);
if (in_array($parts[0], $available_langs)) {
array_shift($parts);
}
$path = implode('/', $parts);
foreach ($available_langs as $lang) {
$href = home_url('/' . $lang . '/' . $path);
echo '<link rel="alternate" hreflang="' . $lang . '" href="' . esc_url($href) . '" />';
}
}
add_action('wp_head', 'wphelper_add_hreflang_tags');Это поможет поисковым системам понимать, какие версии страницы существуют для разных языков.
Преимущества и ограничения такого подхода
Преимущества:
- Минимум сторонних зависимостей и плагинов
- Легко кастомизировать под свои нужды
- Повышенная производительность без лишнего кода
Ограничения:
- Больше ручной работы при добавлении контента
- Отсутствие удобного интерфейса для переводчиков без дополнительных разработок
- Нужно самостоятельно следить за SEO и корректной работой
Заключение
Создание многоязычного сайта на WordPress без плагинов — вполне реализуемая задача, которая позволит вам получить легкий и быстрый сайт с базовой многоязычностью. При необходимости можно расширять функционал, добавляя кастомные метабоксы для удобного редактирования, автоматизировать создание ссылок и создавать более сложные механизмы кэширования.
Если хотите посмотреть готовые решения для улучшения вашего сайта, обратите внимание на плагины и темы на WPSHOP.ru, которые помогут ускорить разработку и расширить функционал.