Мультиязычность — важный аспект современного сайта, особенно если вы хотите расширить аудиторию и сделать контент доступным для пользователей из разных стран. В этой статье мы разберём, как создать мультиязычный сайт на WordPress без использования сторонних плагинов, используя собственные типы записей, таксономии и шаблоны. Такой подход позволит вам полностью контролировать структуру и логику перевода, избегая нагрузки и ограничений плагинов.
Зачем делать мультиязычный сайт без плагинов? Преимущества и недостатки
Плагины, такие как WPML или Polylang, сильно упрощают работу с мультиязычностью, но имеют свои минусы:
- Увеличение нагрузки на сайт и количество запросов к базе данных.
- Потенциальные конфликты с другими плагинами и темами.
- Ограничения в кастомизации и интеграции.
Собственный код даст гибкость, позволит оптимизировать структуру данных и лучше интегрироваться с вашим сайтом. Однако такой подход требует знаний PHP и понимания архитектуры WordPress.
Создание структуры для мультиязычности: типы записей и таксономии
Мы создадим отдельный тип записи wpdirect_language для хранения языков сайта, а также расширим существующие записи, добавив мета-поля для языка. Рассмотрим пример на базе стандартного типа записей post.
Регистрация таксономии для языка
Добавим таксономию wpdirect_language, чтобы привязывать записи к языкам:
add_action('init', 'wpdirect_register_language_taxonomy');
function wpdirect_register_language_taxonomy() {
register_taxonomy('wpdirect_language', ['post', 'page'], [
'label' => 'Язык',
'public' => true,
'hierarchical' => false,
'rewrite' => ['slug' => 'lang'],
'show_admin_column' => true,
]);
}Этот код добавит в админку метабокс для выбора языка записи. Можно добавить языки вручную через раздел «Записи» → «Язык».
Добавление языков в админке
Добавьте нужные языки, например, ru, en, de.
Если хотите, можно создать интерфейс для управления языками через отдельный тип записей, но таксономия проще и удобнее.
Вывод контента на выбранном языке: фильтрация запросов
Чтобы на фронтенде показывать записи на нужном языке, нужно фильтровать основной запрос WordPress. Для этого используем хук pre_get_posts.
add_action('pre_get_posts', 'wpdirect_filter_posts_by_language');
function wpdirect_filter_posts_by_language($query) {
if (is_admin() || !$query->is_main_query()) return;
// Определяем язык, например, из параметра URL ?lang=ru
$lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'ru';
// Добавляем таксономию для фильтрации
$tax_query = [
[
'taxonomy' => 'wpdirect_language',
'field' => 'slug',
'terms' => $lang,
]
];
$query->set('tax_query', $tax_query);
}Теперь, если добавить в URL ?lang=en, будут показываться только записи на английском языке.
Создание языковых переключателей
Чтобы пользователи могли переключать язык, добавим простой языковой переключатель. Он будет формировать ссылки с параметром lang.
function wpdirect_language_switcher() {
$languages = get_terms([
'taxonomy' => 'wpdirect_language',
'hide_empty' => false,
]);
if (!$languages || is_wp_error($languages)) return;
echo '<ul class="wpdirect-language-switcher">';
foreach ($languages as $lang) {
$link = add_query_arg('lang', $lang->slug, home_url());
echo '<li><a href="' . esc_url($link) . '">' . esc_html(strtoupper($lang->slug)) . '</a></li>';
}
echo '</ul>';
}Вызовите wpdirect_language_switcher() в нужном месте темы, например, в header.php.
Перевод статических элементов и шаблонов
Статические фразы (заголовки, меню и т.д.) нужно адаптировать под текущий язык. Можно завести массив с переводами и выводить нужный текст в зависимости от параметра lang:
function wpdirect_get_translation($key) {
$lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'ru';
$translations = [
'title' => [
'ru' => 'Привет, мир!',
'en' => 'Hello, world!',
],
// Добавьте другие строки
];
return $translations[$key][$lang] ?? $translations[$key]['ru'];
}<Используйте в шаблонах:
<h1><?php echo wpdirect_get_translation('title'); ?></h1>Поддержка мультиязычности в меню и виджетах
Для меню можно создать разные меню под каждый язык и выводить их условно в зависимости от lang. Аналогично с виджетами — можно использовать условные теги и фильтры WordPress.
Пример расширенного кода фильтрации для SEO URL
Чтобы сделать URL с языком более чистым, например, example.com/en/post-name, нужно добавить Rewrite Rules и обработать запросы:
add_action('init', 'wpdirect_add_rewrite_rules');
function wpdirect_add_rewrite_rules() {
add_rewrite_rule('^([a-z]{2})/([^/]+)/?$', 'index.php?post_type=post&name=$matches[2]&wpdirect_lang=$matches[1]', 'top');
}
add_filter('query_vars', function($vars) {
$vars[] = 'wpdirect_lang';
return $vars;
});
add_action('pre_get_posts', 'wpdirect_filter_posts_by_language_rewrite');
function wpdirect_filter_posts_by_language_rewrite($query) {
if (is_admin() || !$query->is_main_query()) return;
$lang = get_query_var('wpdirect_lang', 'ru');
$tax_query = [
[
'taxonomy' => 'wpdirect_language',
'field' => 'slug',
'terms' => $lang,
]
];
$query->set('tax_query', $tax_query);
}Не забудьте обновить постоянные ссылки в настройках WordPress после добавления правил.
Как работать с переводами метаполей и кастомных типов записей
Если у вас есть кастомные поля, их тоже нужно адаптировать под мультиязычность. Обычно для каждого языка создают отдельное поле с суффиксом языка, например, wpdirect_description_en, wpdirect_description_ru. В шаблонах выбирайте нужное поле в зависимости от языка.
Пример вывода кастомного поля с учётом языка:
function wpdirect_get_custom_field($post_id, $field_base) {
$lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'ru';
$field_name = $field_base . '_' . $lang;
return get_post_meta($post_id, $field_name, true);
}Это позволяет хранить данные на нескольких языках в одной записи.
Интеграция с плагином Clearfy Pro для оптимизации SEO мультиязычного сайта
Если вы используете Clearfy Pro, он поможет оптимизировать SEO-параметры и убрать дублирование контента, что критично для мультиязычных сайтов. Clearfy умеет управлять мета-тегами и каноническими ссылками, что улучшит индексирование.
Выводы и рекомендации
Создание мультиязычного сайта без плагинов — отличный способ получить максимальный контроль и производительность. Подход с таксономиями, фильтрацией запросов и адаптацией шаблонов позволит реализовать гибкое решение. Такой метод подходит для опытных разработчиков и позволяет избежать лишних зависимостей.
Для автоматизации перевода и расширенного SEO рекомендую интегрировать WPDirect-решение с Clearfy Pro.