Как создать собственный шорткод для перевода в WordPress

В этой статье мы разберём, как создать собственный шорткод для перевода текста в WordPress. Это полезно, если вы хотите внедрить динамический перевод в контент без использования громоздких плагинов или же хотите расширить функциональность уже используемых решений. Такой подход позволяет вставлять переводы непосредственно в записи и страницы, управлять ими программно и гибко настраивать логику вывода.

Почему стоит создавать собственный шорткод для перевода

Готовые плагины для перевода, такие как WPML или Polylang, отлично справляются со своей задачей, но бывают случаи, когда нужно реализовать более специфичные сценарии. Например, перевод отдельных фраз, которые не должны «переводиться» глобально, или переключение языков по определённым правилам. Собственный шорткод даёт полный контроль над логикой вывода текста и позволяет интегрировать перевод с любыми источниками — от статических массивов до внешних API.

Также использование шорткода упрощает поддержку сайта, поскольку перевод можно централизованно обновлять в одном месте, а не искать в сотнях записей.

Пример задачи

Представим, что у нас есть сайт с двумя языками — русский и английский. Мы хотим выводить текст в зависимости от выбранного языка, используя шорткод [wptranslate_translate key="hello"]. Значения переводов хранятся в массиве PHP, но в будущем можно подключить и базу данных или API.

Создание базового шорткода перевода

Начнём с простого варианта, в котором переводы хранятся в массиве внутри функции. Для идентификации языка будем использовать стандартную функцию WordPress get_locale(). Вот пример кода, который нужно добавить в файл functions.php вашей темы или в плагин:

function wptranslate_translate_shortcode($atts) {
    $atts = shortcode_atts(array(
        'key' => '',
    ), $atts, 'wptranslate_translate');

    $translations = array(
        'hello' => array(
            'ru_RU' => 'Привет',
            'en_US' => 'Hello',
        ),
        'bye' => array(
            'ru_RU' => 'До свидания',
            'en_US' => 'Goodbye',
        ),
    );

    $locale = get_locale();
    $key = $atts['key'];

    if (isset($translations[$key][$locale])) {
        return $translations[$key][$locale];
    } elseif (isset($translations[$key]['en_US'])) {
        // fallback на английский
        return $translations[$key]['en_US'];
    } else {
        return '';
    }
}
add_shortcode('wptranslate_translate', 'wptranslate_translate_shortcode');

Теперь в любом месте сайта можно написать [wptranslate_translate key="hello"] и получить перевод слова «Привет» или «Hello» в зависимости от языка.

Объяснение кода

Функция принимает атрибут key, по которому ищет перевод в массиве $translations. Для определения языка используется get_locale(), которая возвращает текущую локаль WordPress, например, 'ru_RU' или 'en_US'. Если перевода на текущий язык нет, функция возвращает английский вариант по умолчанию.

Расширение функционала: использование пользовательских языков и интеграция с Polylang

В реальных проектах локали могут отличаться от стандартных или вы используете плагин для мультиязычности, например Polylang. В этом случае лучше получать язык через API плагина. Для Polylang это функция pll_current_language(), которая возвращает код языка, например 'ru' или 'en'.

Изменим функцию так, чтобы она проверяла наличие Polylang и использовала её API, а иначе — fallback на get_locale():

function wptranslate_translate_shortcode($atts) {
    $atts = shortcode_atts(array(
        'key' => '',
    ), $atts, 'wptranslate_translate');

    $translations = array(
        'hello' => array(
            'ru' => 'Привет',
            'en' => 'Hello',
        ),
        'bye' => array(
            'ru' => 'До свидания',
            'en' => 'Goodbye',
        ),
    );

    if (function_exists('pll_current_language')) {
        $lang = pll_current_language();
    } else {
        $locale = get_locale();
        $lang = substr($locale, 0, 2); // берем первые 2 символа, например 'ru'
    }

    $key = $atts['key'];

    if (isset($translations[$key][$lang])) {
        return $translations[$key][$lang];
    } elseif (isset($translations[$key]['en'])) {
        return $translations[$key]['en'];
    } else {
        return '';
    }
}
add_shortcode('wptranslate_translate', 'wptranslate_translate_shortcode');

Такой подход позволит корректно работать с языками, заданными в Polylang, и выводить переводы в шорткодах.

Пример использования с Polylang

Вставляем в редактор запись:

[wptranslate_translate key="hello"]

При переключении языка на сайте вывод изменится с «Hello» на «Привет» автоматически.

Динамическое добавление переводов из базы данных

Для крупных проектов хранение переводов в массиве неэффективно. Лучше создавать отдельную таблицу в базе данных WordPress и загружать переводы динамически.

Пример SQL для создания таблицы:

CREATE TABLE wp_wptranslate_translations (
  id INT AUTO_INCREMENT PRIMARY KEY,
  translation_key VARCHAR(255) NOT NULL,
  language_code VARCHAR(10) NOT NULL,
  translation_text TEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Добавим функцию для получения перевода из базы:

function wptranslate_get_translation_from_db($key, $lang) {
    global $wpdb;
    $table = $wpdb->prefix . 'wptranslate_translations';
    $translation = $wpdb->get_var($wpdb->prepare(
        "SELECT translation_text FROM $table WHERE translation_key = %s AND language_code = %s LIMIT 1",
        $key,
        $lang
    ));
    return $translation;
}

Изменим шорткод для использования базы:

function wptranslate_translate_shortcode($atts) {
    $atts = shortcode_atts(array(
        'key' => '',
    ), $atts, 'wptranslate_translate');

    if (function_exists('pll_current_language')) {
        $lang = pll_current_language();
    } else {
        $locale = get_locale();
        $lang = substr($locale, 0, 2);
    }

    $key = $atts['key'];

    $translation = wptranslate_get_translation_from_db($key, $lang);

    if ($translation) {
        return $translation;
    } else {
        // fallback на английский
        $translation = wptranslate_get_translation_from_db($key, 'en');
        return $translation ? $translation : '';
    }
}
add_shortcode('wptranslate_translate', 'wptranslate_translate_shortcode');

Таким образом вы получите централизованное хранилище переводов, которое легко редактировать и расширять.

Советы по работе с шорткодом перевода

Чтобы повысить удобство использования и производительность, рекомендуем:

  • Кэшировать результаты запросов к базе, особенно при большом количестве переводов.
  • Реализовать административную панель для управления переводами — это позволит быстро добавлять и редактировать тексты без прямого доступа к базе.
  • Добавить возможность передавать параметры в шорткод, например форматирование или fallback-текст.
  • Использовать nonce и проверки прав пользователя при сохранении переводов через интерфейс.

Пример расширения шорткода с fallback-текстом

Иногда перевод отсутствует, и хочется вывести свой текст, а не пустоту. Добавим атрибут default:

function wptranslate_translate_shortcode($atts) {
    $atts = shortcode_atts(array(
        'key' => '',
        'default' => '',
    ), $atts, 'wptranslate_translate');

    if (function_exists('pll_current_language')) {
        $lang = pll_current_language();
    } else {
        $locale = get_locale();
        $lang = substr($locale, 0, 2);
    }

    $key = $atts['key'];

    $translation = wptranslate_get_translation_from_db($key, $lang);

    if ($translation) {
        return $translation;
    } elseif ($atts['default'] !== '') {
        return $atts['default'];
    } else {
        $translation = wptranslate_get_translation_from_db($key, 'en');
        return $translation ? $translation : '';
    }
}
add_shortcode('wptranslate_translate', 'wptranslate_translate_shortcode');

Теперь можно писать: [wptranslate_translate key="hello" default="Здравствуйте!"], и если перевода нет, выведется «Здравствуйте!».

Как создать собственный переводчик для WordPress
14.11.2025
Автоматический перевод сообщений о статусах заказов WooCommerce в WordPress
06.06.2026
Как создать свой плагин для автоперевода WordPress
26.11.2025
Как создать автоперевод на основе Google Cloud Translate в WordPress
02.01.2026
Как добавить автоперевод форм в WordPress
16.01.2026