В современном мире многоязычность сайта — важный аспект для расширения аудитории. Хотя на рынке существует множество готовых решений, например, Polylang и WPML, иногда требуется создать собственный, легкий и адаптированный под конкретные задачи переводчик. В этой статье мы разберем, как создать собственный плагин для перевода контента WordPress с нуля, используя базовые возможности CMS и PHP.
Почему стоит создать собственный плагин для перевода WordPress
Большинство популярных плагинов перевода обладают мощным функционалом, но иногда это избыточно и сказывается на производительности сайта. Создание собственного переводчика позволяет:
- Оптимизировать функциональность под конкретные задачи.
- Минимизировать нагрузку на сервер и базу данных.
- Гибко управлять выводом переведенного контента.
- Избежать конфликтов с другими плагинами.
Кроме того, это отличный способ глубже понять внутренние механизмы WordPress и PHP.
Основные принципы работы плагина перевода
Идея собственного переводчика сводится к хранению переведенных версий страниц и постов в базе данных и выводу нужного варианта в зависимости от выбранного языка пользователя. Важные моменты:
- Использование кастомных полей или таксономий для хранения информации о языке.
- Переключение языка через URL-параметры, поддомены или куки.
- Фильтрация контента через хуки WordPress для вывода нужной версии.
В нашем примере мы реализуем хранение языка в метаданных поста и переключение через GET-параметр ?lang=ru.
Создаем структуру плагина и основные функции
Начнем с создания папки wptranslate-custom-translator в директории wp-content/plugins. В ней создадим файл wptranslate-custom-translator.php с основными заголовками плагина:
<?php
/*
Plugin Name: WPTranslate Custom Translator
Description: Легкий плагин для перевода контента WordPress.
Version: 1.0
Author: WPTranslate.ru
*/
// Код плагина ниже
Далее реализуем функции сохранения языка поста при его создании или редактировании. Для этого используем хук save_post:
function wptranslate_save_post_language($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wptranslate_post_language'])) {
$lang = sanitize_text_field($_POST['wptranslate_post_language']);
update_post_meta($post_id, '_wptranslate_language', $lang);
}
}
add_action('save_post', 'wptranslate_save_post_language');Чтобы добавить поле выбора языка в админке при редактировании поста, подключим метабокс:
function wptranslate_add_language_metabox() {
add_meta_box(
'wptranslate_language',
'Язык поста',
'wptranslate_language_metabox_callback',
'post',
'side'
);
}
add_action('add_meta_boxes', 'wptranslate_add_language_metabox');
function wptranslate_language_metabox_callback($post) {
$value = get_post_meta($post->ID, '_wptranslate_language', true);
?>
<label for="wptranslate_post_language">Выберите язык:</label>
<select name="wptranslate_post_language" id="wptranslate_post_language">
<option value="ru" <?php selected($value, 'ru'); ?>>Русский</option>
<option value="en" <?php selected($value, 'en'); ?>>English</option>
<option value="de" <?php selected($value, 'de'); ?>>Deutsch</option>
</select>
<?php
}Выводим контент на выбранном языке
Для переключения языка мы будем использовать GET-параметр lang. Создадим функцию, которая будет фильтровать основной запрос и выводить посты только нужного языка:
function wptranslate_filter_posts_by_language($query) {
if (is_admin() || !$query->is_main_query()) return;
if (isset($_GET['lang'])) {
$lang = sanitize_text_field($_GET['lang']);
$meta_query = array(
array(
'key' => '_wptranslate_language',
'value' => $lang,
'compare' => '=',
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'wptranslate_filter_posts_by_language');Таким образом, при переходе на страницу https://site.ru/?lang=en будут показаны только посты с меткой языка en.
Переключение языка на фронтенде
Добавим простой переключатель языков в шаблон сайта, например, в header.php:
<div class="wptranslate-language-switcher">
<a href="?lang=ru">Русский</a> |
<a href="?lang=en">English</a> |
<a href="?lang=de">Deutsch</a>
</div>Этот переключатель будет перезагружать страницу с нужным параметром, меняя язык отображаемого контента.
Добавляем поддержку перевода заголовков и других элементов
Чтобы переводить не только посты, но и заголовки, меню и прочие элементы, нужно расширить логику плагина. Один из вариантов — хранить переводы в опциях с префиксом языка, например:
update_option('wptranslate_title_ru', 'Заголовок на русском');
update_option('wptranslate_title_en', 'Title in English');Для вывода заголовка будем использовать функцию:
function wptranslate_get_option($name) {
$lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'ru';
return get_option($name . '_' . $lang);
}В шаблоне вызовем:
<h1><?php echo wptranslate_get_option('wptranslate_title'); ?></h1>Таким образом можно гибко создавать переводы для любых элементов сайта.
Оптимизация и рекомендации
При самостоятельной реализации перевода важно помнить:
- Кэшировать результаты запросов, чтобы снизить нагрузку на базу данных.
- Обрабатывать возможные ошибки и отсутствующие переводы, задавая fallback язык.
- Избегать дублирования контента в поисковых системах — можно использовать тег
hreflangв заголовках страниц. - Тестировать переключение языков на всех типах страниц.
Кроме того, для сложных проектов лучше использовать готовые решения с поддержкой SEO и профессиональными инструментами.
Заключение
Создание собственного переводчика для WordPress — это отличный способ понять, как работают многоязычные сайты, и получить легкий плагин, оптимизированный под ваши нужды. В статье мы рассмотрели базовую реализацию хранения языка в метаданных, фильтрацию запросов, добавление метабокса и переключатель на фронтенде. Вы можете развивать этот функционал, интегрируя поддержку пользовательских типов записей, таксономий и расширяя интерфейс.