WordPress REST API и мультиязычность: как реализовать поддержку нескольких языков

WordPress REST API стал мощным инструментом для создания современных веб-приложений и мобильных клиентов. Но когда дело доходит до мультиязычных сайтов, возникает вопрос: как грамотно организовать поддержку нескольких языков через REST API? В этой статье мы подробно рассмотрим практические способы добавления мультиязычности к вашим REST API эндпоинтам в WordPress с примерами кода и рекомендациями.

Почему мультиязычность важна в REST API WordPress

Если ваш сайт работает на нескольких языках, API должен возвращать контент на запрошенном языке, чтобы клиент получал релевантные данные. Без корректной поддержки локализации пользователи видят данные на одном языке, что ухудшает опыт и снижает конверсию.

Кроме того, многие популярные плагины мультиязычности, такие как WPML и Polylang, имеют свои особенности работы с REST API, и их нужно учитывать для корректной интеграции.

Основные подходы к реализации мультиязычности в REST API WordPress

1. Использование параметра запроса lang в URL

Самый простой способ – добавить в REST API запрос параметр lang, например ?lang=ru, и на основе этого параметра фильтровать контент.

Для этого можно расширить стандартные эндпоинты или создать кастомные, которые будут учитывать параметр языка.

Пример: регистрация параметра lang и фильтрация постов

add_action('rest_api_init', function() {
    register_rest_route('wpapi/v1', '/posts', [
        'methods' => 'GET',
        'callback' => 'wpapi_get_posts_by_lang',
        'args' => [
            'lang' => [
                'required' => false,
                'validate_callback' => function($param) {
                    return in_array($param, ['en', 'ru', 'de']);
                },
            ],
        ],
    ]);
});

function wpapi_get_posts_by_lang($request) {
    $lang = $request->get_param('lang') ?: 'en';

    $args = [
        'post_type' => 'post',
        'posts_per_page' => 10,
        'meta_query' => [
            [
                'key' => '_wpapi_lang',
                'value' => $lang,
                'compare' => '=',
            ],
        ],
    ];

    $query = new WP_Query($args);
    $posts = [];

    foreach ($query->posts as $post) {
        $posts[] = [
            'id' => $post->ID,
            'title' => $post->post_title,
            'content' => $post->post_content,
        ];
    }

    return rest_ensure_response($posts);
}

В этом примере мы предполагаем, что у каждой записи есть метаполе _wpapi_lang, хранящее язык записи. В реальном проекте это может быть поле от плагина мультиязычности.

2. Интеграция с WPML и Polylang

Если вы используете популярные плагины мультиязычности, то стоит воспользоваться их API для фильтрации запросов в REST API.

Для WPML можно получить текущий язык через функцию apply_filters( 'wpml_current_language', NULL ), а для Polylang — через pll_current_language().

Пример фильтрации стандартного REST API запросов через WPML

add_filter('rest_post_query', 'wpapi_filter_posts_by_wpml_language', 10, 2);
function wpapi_filter_posts_by_wpml_language($args, $request) {
    if (!function_exists('apply_filters')) {
        return $args;
    }

    $lang = $request->get_param('lang');
    if (!$lang) {
        $lang = apply_filters('wpml_current_language', NULL);
    }

    if ($lang) {
        $args['lang'] = $lang; // WPML поддерживает этот параметр
    }

    return $args;
}

Таким образом, при передаче параметра lang в REST API запрос, WPML отфильтрует записи по указанному языку.

Как добавить мультиязычность в кастомные REST API эндпоинты

Если вы создаёте свои собственные эндпоинты, нужно самостоятельно обрабатывать параметр языка, например, из URL или заголовков.

Пример получения языка из заголовка Accept-Language

add_action('rest_api_init', function() {
    register_rest_route('wpapi/v1', '/custom-data', [
        'methods' => 'GET',
        'callback' => 'wpapi_custom_data_by_language',
    ]);
});

function wpapi_custom_data_by_language($request) {
    $lang = 'en';
    $headers = $request->get_headers();
    if (!empty($headers['accept-language'])) {
        // Берем первый язык из заголовка
        $lang = substr($headers['accept-language'][0], 0, 2);
    }

    // Здесь логика выборки данных по языку
    $data = wpapi_get_data_for_lang($lang);

    return rest_ensure_response($data);
}

function wpapi_get_data_for_lang($lang) {
    // Пример возврата данных
    $texts = [
        'en' => 'Hello World',
        'ru' => 'Привет мир',
        'de' => 'Hallo Welt',
    ];
    return ['message' => $texts[$lang] ?? $texts['en']];
}

Такой подход позволяет клиентам указывать предпочитаемый язык через HTTP заголовки, что удобно для мобильных приложений и SPA.

Рекомендации и лучшие практики

  • Ясный и понятный API: всегда документируйте, как указывать язык — через параметр URL, заголовок или куки.
  • Кэширование: учитывайте язык при кэшировании ответов, чтобы не отдавать данные на неправильном языке.
  • Используйте возможности плагинов: если у вас WPML или Polylang, используйте их API, чтобы не изобретать велосипед.
  • Тестируйте на разных языках: проверяйте, что все поля и метаданные корректно локализуются.
  • Безопасность: фильтруйте и валидируйте параметры языка, чтобы избежать инъекций и ошибок.

Заключение

Добавление мультиязычности в WordPress REST API — задача, которую можно решить разными способами в зависимости от используемых плагинов и требований проекта. Важно обеспечить корректную фильтрацию контента по языку и удобный интерфейс для клиентов API. Представленные примеры кода помогут быстро внедрить поддержку нескольких языков и улучшить пользовательский опыт ваших приложений.

Если хотите расширить возможности мультиязычного REST API, рекомендую обратить внимание на плагин Clearfy Pro — он помогает оптимизировать работу сайта и может упростить интеграцию с API.

Шаблоны для WP Плагины для WP