Работая с многоязычными сайтами на WordPress, часто сталкиваешься с проблемой, что шорткоды, встроенные в контент, не переводятся автоматически. Это создает неудобства для пользователей и усложняет поддержку сайта. В этой статье мы разберем, как реализовать автоматический перевод шорткодoв в WordPress, используя PHP и популярные плагины, а также рассмотрим примеры кода, которые помогут решить эту задачу.
Почему шорткоды не переводятся автоматически? Особенности и ограничения
Шорткоды в WordPress — это специальные метки, которые заменяются на динамический контент при выводе страницы. Однако сам текст внутри шорткода, а также параметры шорткода, не переводятся штатными средствами WordPress. Это связано с тем, что перевод обычно проводится по контенту поста, а шорткод обрабатывается уже после фильтрации текста.
Например, если у вас есть шорткод [my_button text="Купить"], то параметр text="Купить" не будет переведен, если только вы не реализуете собственную логику перевода.
Таким образом, чтобы сделать перевод шорткода автоматическим, нужно либо использовать плагины, которые поддерживают перевод параметров шорткодов, либо внедрять собственные фильтры и функции.
Использование плагина WPML для перевода шорткодов
Плагин WPML — один из самых популярных решений для создания многоязычных сайтов на WordPress. Он поддерживает перевод многих видов контента, включая шорткоды, но требует настройки.
Чтобы перевести шорткод с параметрами, необходимо:
- Включить поддержку строковых переводов в WPML (через String Translation).
- Добавить параметры шорткода в строковые переводы вручную или с помощью API.
- Использовать функции WPML для получения перевода внутри обработки шорткода.
Пример обработки шорткода с переводом через WPML:
function wplangs_render_my_button($atts) {
$atts = shortcode_atts(array(
'text' => __('Buy', 'wplangs'),
), $atts, 'my_button');
// Получаем перевод текста через WPML
if(function_exists('icl_t')) {
$atts['text'] = icl_t('wplangs', 'my_button_text', $atts['text']);
}
return '<button>' . esc_html($atts['text']) . '</button>';
}
add_shortcode('my_button', 'wplangs_render_my_button');
В этом примере функция icl_t получает перевод строки с уникальным ключом. Далее эта строка используется внутри шорткода.
Автоматический перевод шорткодов с помощью Google Translate API
Если вы хотите сделать автоматический перевод шорткодов без ручного ввода переводов, можно использовать Google Translate API. Для этого нужно написать функцию, которая будет перехватывать вывод шорткода и переводить текстовые параметры.
Пример упрощенной функции для перевода параметров шорткода:
function wplangs_translate_shortcode_atts($atts) {
// Здесь нужно реализовать вызов Google Translate API
// Для примера — заглушка, возвращающая тот же текст
return $atts;
}
function wplangs_render_translated_button($atts) {
$atts = shortcode_atts(array(
'text' => 'Buy',
), $atts, 'my_button');
$atts = wplangs_translate_shortcode_atts($atts);
return '<button>' . esc_html($atts['text']) . '</button>';
}
add_shortcode('my_button', 'wplangs_render_translated_button');
Для полноценной интеграции необходимо зарегистрироваться в Google Cloud, получить API ключ, и реализовать запрос к API через wp_remote_post или curl. Рекомендуется кэшировать переводы, чтобы не превышать лимиты и не увеличивать нагрузку.
Перевод шорткодов с помощью плагина Clearfy Pro
Плагин Clearfy Pro содержит множество оптимизаций для WordPress, включая улучшенную поддержку многоязычности и SEO. Среди функций есть возможность упрощать и оптимизировать шорткоды, что помогает корректнее их обрабатывать при переводе.
Clearfy Pro не делает автоматический перевод, но хорошо работает в связке с WPML и другими плагинами, позволяя избежать конфликтов и ошибок.
Практические советы по работе с переводом шорткодов
- Используйте gettext функции. Внутри шорткодов применяйте
__()и_e()для всех текстовых параметров, чтобы они попали в систему перевода. - Избегайте хардкода текста внутри параметров. Лучше передавать ключи или идентификаторы, а перевод получать через функции локализации.
- Кэшируйте переводы. Если используете API переводов, сохраняйте результаты в transient или опции, чтобы снизить количество запросов.
- Проверяйте совместимость плагинов. Некоторые плагины для переводов не поддерживают автоматический перевод шорткодов, поэтому тестируйте разные варианты.
- Используйте фильтр
do_shortcode_tag. Можно перехватывать вызовы шорткодов и обрабатывать их параметры перед рендером.
Пример перехвата шорткода для динамического перевода
add_filter('do_shortcode_tag', 'wplangs_filter_shortcode_translation', 10, 4);
function wplangs_filter_shortcode_translation($output, $tag, $attr, $m) {
if($tag === 'my_button' && !empty($attr['text'])) {
// Здесь можно вставить логику перевода, например, через API или локализацию
$attr['text'] = __('Купить', 'wplangs');
// Повторный вызов шорткода с переведённым параметром
$output = do_shortcode('[my_button text="' . esc_attr($attr['text']) . '"]');
}
return $output;
}
Этот фильтр позволяет менять параметры шорткода перед его выполнением, что удобно для централизованного перевода.
Итог
Автоматический перевод шорткодов — непростая задача, которая требует понимания внутреннего механизма WordPress и работы с плагинами перевода. Важно применять gettext-функции, при необходимости использовать API внешних сервисов и грамотно кэшировать результаты.
Для большинства проектов достаточно интеграции с WPML или Polylang и ручного добавления переводов в строковые переводы. Если требуется автоматизация, стоит рассмотреть использование Google Translate API или других сервисов в связке с кастомными функциями WordPress.