Шорткоды — один из самых удобных способов добавлять динамический контент в WordPress. Однако при создании мультиязычных сайтов часто возникает проблема: содержимое шорткодов не переводится автоматически, особенно если оно генерируется динамически или зависит от пользовательских данных. В этой статье мы подробно разберём, как реализовать автоперевод содержимого шорткодов в WordPress с помощью готовых решений и собственного кода.
Почему автоперевод шорткодов в WordPress — сложная задача
Шорткоды могут возвращать HTML, текст, данные из базы или API. В отличие от обычного контента страниц, их содержимое не всегда доступно для стандартных плагинов перевода, так как оно генерируется динамически при выводе. Поэтому автоперевод шорткодов требует перехвата их вывода и интеграции с переводческими сервисами.
Основные сложности:
- Определение текста для перевода внутри шорткода.
- Передача текста в переводчик и получение результата.
- Обеспечение кеширования перевода для производительности.
- Корректная замена исходного текста на переведённый.
Рассмотрим эти моменты на примерах.
Как перехватить вывод шорткода для перевода
Самый простой способ — обернуть функцию шорткода в фильтр, который будет запускать автоперевод. Предположим, у нас есть шорткод [wptranslate_greeting], который выводит приветствие:
function wptranslate_greeting_shortcode() {
return 'Hello, welcome to our site!';
}
add_shortcode('wptranslate_greeting', 'wptranslate_greeting_shortcode');
Чтобы добавить автоперевод, создадим функцию автоперевода и применим её к выводу шорткода:
function wptranslate_autotranslate_text($text, $target_lang = 'ru') {
// Здесь можно интегрировать API перевода, например, DeepL или Google Translate
// Для примера вернём текст с пометкой
return '[Перевод на ' . $target_lang . ']: ' . $text;
}
function wptranslate_greeting_autotranslate_shortcode() {
$original = wptranslate_greeting_shortcode();
$translated = wptranslate_autotranslate_text($original, get_locale());
return $translated;
}
remove_shortcode('wptranslate_greeting');
add_shortcode('wptranslate_greeting', 'wptranslate_greeting_autotranslate_shortcode');
Так мы заменили стандартный шорткод на версию с автопереводом. В реальном проекте функцию wptranslate_autotranslate_text нужно заменить на вызов API перевода.
Интеграция с Google Translate API
Для реального автоперевода можно использовать Google Translate API. Вот упрощённый пример вызова:
function wptranslate_autotranslate_text($text, $target_lang = 'ru') {
$api_key = 'ВАШ_API_КЛЮЧ';
$url = 'https://translation.googleapis.com/language/translate/v2?key=' . $api_key;
$data = [
'q' => $text,
'target' => $target_lang
];
$response = wp_remote_post($url, [
'body' => json_encode($data),
'headers' => [
'Content-Type' => 'application/json'
]
]);
if (is_wp_error($response)) {
return $text; // Возвращаем оригинал при ошибке
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (isset($body['data']['translations'][0]['translatedText'])) {
return $body['data']['translations'][0]['translatedText'];
}
return $text;
}
Не забудьте заменить ВАШ_API_КЛЮЧ на свой ключ Google Cloud Translate.
Автоматизация автоперевода для произвольных шорткодов
Если на сайте много шорткодов, можно написать универсальный фильтр, который будет перехватывать их вывод и переводить автоматически. Для этого воспользуемся хуком do_shortcode_tag или фильтром the_content с функцией, которая распознаёт шорткоды и переводит их содержимое.
Пример универсального фильтра:
function wptranslate_autotranslate_shortcodes($content) {
// Паттерн поиска шорткодов
$pattern = get_shortcode_regex();
return preg_replace_callback('/' . $pattern . '/s', function($matches) {
$shortcode = $matches[0];
$tag = $matches[2];
$atts = shortcode_parse_atts($matches[3]);
// Вызываем оригинальный шорткод для получения текста
$output = do_shortcode($shortcode);
// Переводим вывод
return wptranslate_autotranslate_text($output, get_locale());
}, $content);
}
add_filter('the_content', 'wptranslate_autotranslate_shortcodes', 20);
Этот код автоматически переводит вывод всех шорткодов внутри контента. При необходимости можно добавить проверку по названиям шорткодов или языкам.
Как кешировать переводы для производительности
Каждый вызов API перевода — это задержка и расход ресурсов. Чтобы избежать частых обращений, реализуем кеширование переведённого текста.
Пример кеширования с использованием Transients API:
function wptranslate_autotranslate_text_cached($text, $target_lang = 'ru') {
$cache_key = 'wptranslate_trans_' . md5($text . $target_lang);
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$translated = wptranslate_autotranslate_text($text, $target_lang);
set_transient($cache_key, $translated, DAY_IN_SECONDS * 7);
return $translated;
}
Используйте эту функцию вместо прямого вызова wptranslate_autotranslate_text, чтобы повысить скорость и снизить нагрузку.
Использование плагинов для автоперевода шорткодов
Если вы предпочитаете готовые решения, обратите внимание на следующие плагины:
- TranslatePress — поддерживает перевод содержимого, в том числе шорткодов, с визуальным редактором.
- Polylang Pro — расширенная версия Polylang с поддержкой динамического контента.
- WPML String Translation — позволяет перевести строки, включая те, что выводятся шорткодами.
Для интеграции автоперевода с этими плагинами можно использовать их API и хуки. Например, WPML предоставляет фильтр icl_translate, с помощью которого можно обрабатывать вывод шорткодов.
Пример использования WPML и автоперевода для шорткодов
function wptranslate_wpml_autotranslate_shortcode($output, $original, $name) {
if ($name === 'wptranslate_greeting') {
// Проверяем язык и вызываем автоперевод
$current_lang = apply_filters('wpml_current_language', null);
if ($current_lang && $current_lang !== 'en') {
return wptranslate_autotranslate_text_cached($original, $current_lang);
}
}
return $output;
}
add_filter('wpml_translate_single_string', 'wptranslate_wpml_autotranslate_shortcode', 10, 3);
Так можно комбинировать мощь WPML и автоматический перевод контента шорткодов.
Резюме и рекомендации
Автоперевод шорткодов в WordPress — задача, требующая аккуратного подхода, но решаемая с помощью комбинации перехвата вывода, вызова API перевода и кеширования. В зависимости от масштаба проекта можно выбрать:
- Простой перехват конкретных шорткодов и перевод их вывода.
- Универсальный фильтр для всех шорткодов с проверкой контекста.
- Использование готовых плагинов с интеграцией автоперевода.
Для интеграции с API рекомендуем Google Cloud Translate, DeepL или аналогичные сервисы с хорошей поддержкой языков. Кеширование обязательно для производительности.
Если хотите попробовать готовые решения, на сайте WPSHOP.RU есть удобные плагины и темы, которые можно адаптировать под ваши задачи.