Автоматический перевод контента в WordPress — задача, которая часто возникает при создании многоязычных сайтов. Хотя существуют готовые плагины, иногда требуется гибкое и тонко настроенное решение, интегрированное напрямую в шаблон или функционал сайта. В этой статье мы подробно разберём, как создать собственный автоперевод с помощью хуков и функций WordPress, используя сторонние API-переводчики, и обеспечим примеры кода для реальных случаев.
Почему стоит использовать хуки и функции для автоперевода?
Вместо установки тяжеловесного плагина автоперевода, прописывая собственные функции и используя хуки WordPress, вы получаете полный контроль над процессом перевода. Это позволяет:
- Оптимизировать скорость работы сайта, вызывая перевод только там, где это действительно нужно.
- Интегрировать любой сервис перевода, например, Google Translate API, DeepL API или свой собственный сервис.
- Добавлять кэширование переведённых текстов для снижения числа запросов к API.
- Автоматизировать перевод при сохранении постов, страниц, метаданных и пользовательского контента.
Рассмотрим на практике, как реализовать подобный автоперевод.
Подключение API переводчика — пример с DeepL
Для начала необходимо зарегистрироваться в одном из сервисов перевода. В примере ниже используем DeepL, так как API у него простой и удобный.
В файле functions.php вашей темы или в отдельном плагине добавьте функцию для вызова DeepL API:
function wptranslate_deepl_translate_text($text, $target_lang = 'EN') {
$api_key = 'ВАШ_API_КЛЮЧ_DEEPL';
$url = 'https://api-free.deepl.com/v2/translate';
$args = [
'body' => [
'auth_key' => $api_key,
'text' => $text,
'target_lang' => strtoupper($target_lang),
],
];
$response = wp_remote_post($url, $args);
if (is_wp_error($response)) {
return $text; // Возвращаем исходный текст, если ошибка
}
$data = json_decode(wp_remote_retrieve_body($response), true);
if (!empty($data['translations'][0]['text'])) {
return $data['translations'][0]['text'];
}
return $text;
}
Эта функция принимает исходный текст и язык перевода, возвращая переведённую строку.
Автоперевод содержимого при сохранении поста
Чтобы автоматизировать перевод при сохранении записи, используем хук save_post. Допустим, вы хотите сохранить переведённый заголовок и контент в пользовательские мета-поля.
function wptranslate_auto_translate_post($post_id) {
// Проверяем, чтобы не было автосохранения
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверяем права пользователя
if (!current_user_can('edit_post', $post_id)) {
return;
}
$post = get_post($post_id);
if (!$post) {
return;
}
// Получаем оригинальный заголовок и контент
$original_title = $post->post_title;
$original_content = $post->post_content;
// Переводим на английский (пример)
$translated_title = wptranslate_deepl_translate_text($original_title, 'EN');
$translated_content = wptranslate_deepl_translate_text(wp_strip_all_tags($original_content), 'EN');
// Сохраняем переводы в мета-поля
update_post_meta($post_id, '_translated_title_en', $translated_title);
update_post_meta($post_id, '_translated_content_en', $translated_content);
}
add_action('save_post', 'wptranslate_auto_translate_post');
Используя этот код, при каждом сохранении записи будет создаваться английский перевод и сохраняться в мета-полях _translated_title_en и _translated_content_en.
Вывод переведённого контента на сайте
Чтобы выводить переводы на фронтенде, создадим функцию, которая проверит наличие перевода и при необходимости покажет оригинал.
function wptranslate_get_translated_post_content($post_id, $lang = 'EN') {
$translated_title = get_post_meta($post_id, '_translated_title_' . strtolower($lang), true);
$translated_content = get_post_meta($post_id, '_translated_content_' . strtolower($lang), true);
if ($translated_title && $translated_content) {
return [
'title' => $translated_title,
'content' => $translated_content,
];
}
// Возвращаем оригинал, если перевода нет
$post = get_post($post_id);
return [
'title' => $post->post_title,
'content' => $post->post_content,
];
}
Далее в шаблоне можно использовать так:
$translated = wptranslate_get_translated_post_content(get_the_ID(), 'EN');
echo '<h1>' . esc_html($translated['title']) . '</h1>';
echo wp_kses_post($translated['content']);
Кэширование переводов для оптимизации
Поскольку API перевода обычно платные и имеют лимиты, важно кэшировать результаты. В примере выше мы сохраняем переводы в мета-полях, что отлично подходит для постов. Если надо кэшировать переводы в других местах, можно использовать транзиенты WordPress.
Пример для кэширования произвольного текста:
function wptranslate_get_cached_translation($text, $target_lang) {
$cache_key = 'wptranslate_' . md5($text . $target_lang);
$cached = get_transient($cache_key);
if ($cached) {
return $cached;
}
$translated = wptranslate_deepl_translate_text($text, $target_lang);
set_transient($cache_key, $translated, DAY_IN_SECONDS);
return $translated;
}
Пример интеграции с плагином Clearfy Pro для оптимизации
Если на вашем сайте установлен плагин Clearfy Pro, вы можете дополнительно оптимизировать запросы перевода, отключая ненужные скрипты и стили на страницах, где не нужен перевод. Это позволяет снизить нагрузку и повысить скорость.
Выводы и рекомендации
Использование хуков и функций для создания автоперевода в WordPress — гибкий и мощный способ подстроить перевод именно под ваши задачи. Вы можете расширять приведённые примеры, интегрировать разные сервисы, добавлять поддержку кастомных типов записей и таксономий.
Главное — не забывайте про кэширование и обработку ошибок, чтобы не перегружать API и не ухудшать UX.
Для более продвинутых задач стоит обратить внимание на возможности API OpenAI GPT-4, который позволяет делать более качественные и контекстные переводы с помощью WPGPT.