wpdebug.ru wordpress WP Debug

Как решить проблему нерабочего WPML AJAX в WordPress

Плагин WPML — один из самых популярных инструментов для создания многоязычных сайтов на WordPress. Однако при интеграции WPML с AJAX-запросами часто возникают проблемы: AJAX перестает работать корректно, страница не обновляется, либо контент отображается на неправильном языке. В этой статье мы подробно рассмотрим причины этих сбоев и дадим практические советы по их устранению с примерами кода.

Почему WPML ломает AJAX-запросы? Основные причины

WPML при работе с AJAX добавляет дополнительные параметры для определения языка, чаще всего параметр lang. Если AJAX-запрос не учитывает этот параметр или не передает его, WPML не может корректно обработать запрос, и возвращает данные на дефолтном языке или вовсе ошибку.

Кроме того, WPML может использовать собственные хуки и фильтры, которые влияют на глобальные переменные, связанные с языком, и это тоже может приводить к конфликтам при выполнении AJAX.

Еще одна причина — кэширование AJAX-ответов без учета языковых параметров. Если сервер или плагин кэширует ответ без параметра lang, последующие запросы будут получать устаревший или неправильный контент.

Как правильно передавать язык в AJAX-запросах с WPML

Чтобы AJAX-запросы корректно работали с WPML, всегда нужно передавать параметр языка. Рассмотрим пример правильной передачи этого параметра в jQuery AJAX:

jQuery.ajax({
    url: wpdebug_ajax_object.ajax_url,
    type: 'POST',
    data: {
        action: 'wpdebug_my_ajax_action',
        lang: wpdebug_ajax_object.current_lang, // передаем текущий язык
        other_data: 'value'
    },
    success: function(response) {
        console.log('Response:', response);
    }
});

В PHP, в функции-обработчике, нужно убедиться, что язык берется из параметра и устанавливается для WPML:

function wpdebug_handle_ajax() {
    if ( isset($_POST['lang']) ) {
        do_action( 'wpml_switch_language', sanitize_text_field($_POST['lang']) );
    }
    // теперь WPML знает, какой язык использовать
    // ваша логика обработки AJAX
    wp_send_json_success( array('message' => 'AJAX успешно обработан на языке ' . ICL_LANGUAGE_CODE) );
}
add_action('wp_ajax_wpdebug_my_ajax_action', 'wpdebug_handle_ajax');
add_action('wp_ajax_nopriv_wpdebug_my_ajax_action', 'wpdebug_handle_ajax');

Обратите внимание на вызов do_action('wpml_switch_language', $lang) — он переключает язык для текущего запроса.

Как получить текущий язык на фронтенде

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

function wpdebug_enqueue_scripts() {
    wp_enqueue_script('wpdebug-ajax-script', get_template_directory_uri() . '/js/ajax.js', array('jquery'), null, true);
    wp_localize_script('wpdebug-ajax-script', 'wpdebug_ajax_object', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'current_lang' => apply_filters( 'wpml_current_language', NULL )
    ));
}
add_action('wp_enqueue_scripts', 'wpdebug_enqueue_scripts');

Решение проблем с кэшированием AJAX и WPML

Если на сайте используется кэширование, например плагин Clearfy Pro или WP Super Cache, важно исключить AJAX-запросы с языковыми параметрами из кэша или правильно кэшировать их по языку.

В Clearfy Pro есть опция исключения AJAX-запросов из кэша, что обычно решает проблему. Альтернативно можно использовать фильтры для добавления параметров в ключ кэша:

add_filter('wp_cache_get_key', function($key) {
    if ( isset($_REQUEST['lang']) ) {
        $key .= '_' . sanitize_text_field($_REQUEST['lang']);
    }
    return $key;
});

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

Пример плагина для автоматической поддержки WPML в AJAX

Для упрощения работы с WPML и AJAX можно создать небольшой плагин, который автоматически переключает язык при AJAX-запросах:

/**
 * Plugin Name: WPDebug WPML AJAX Fix
 * Description: Автоматическое переключение языка WPML для AJAX-запросов.
 * Version: 1.0
 * Author: WPDebug
 */

function wpdebug_wpml_ajax_language_switch() {
    if ( defined('DOING_AJAX') && DOING_AJAX ) {
        if ( isset($_REQUEST['lang']) ) {
            do_action('wpml_switch_language', sanitize_text_field($_REQUEST['lang']));
        }
    }
}
add_action('init', 'wpdebug_wpml_ajax_language_switch');

После активации этого плагина достаточно в AJAX-запросах передавать lang, и WPML будет корректно переключать язык.

Отладка и проверка работы AJAX с WPML

Для отладки AJAX с WPML рекомендую использовать консоль браузера и WP_DEBUG_LOG. Проверяйте, что параметр lang передается корректно, а в ответе сервера отображается нужный язык.

Если AJAX не срабатывает, проверьте, не блокирует ли кэш запросы, корректно ли подключен JavaScript, и не возникает ли ошибок PHP.

Для логирования в PHP можно добавить:

function wpdebug_log_ajax_lang() {
    error_log('WPML AJAX lang: ' . (isset($_POST['lang']) ? $_POST['lang'] : 'not set'));
}
add_action('wp_ajax_wpdebug_my_ajax_action', 'wpdebug_log_ajax_lang');
add_action('wp_ajax_nopriv_wpdebug_my_ajax_action', 'wpdebug_log_ajax_lang');

Выводы

Проблемы с нерабочим AJAX при использовании WPML — частая ситуация, но легко решаемая, если:

  • Передавать параметр языка lang в AJAX-запросах;
  • В обработчике AJAX переключать язык с помощью do_action('wpml_switch_language', $lang);
  • Учитывать кэширование и исключать AJAX с языковыми параметрами из кэша;
  • Использовать локализацию скриптов для передачи текущего языка на фронтенд;
  • Для удобства применять простой плагин-фикс для автоматической поддержки.

Если используете плагины из WPShop, обратите внимание на Clearfy Pro — он помогает решать вопросы кэширования AJAX и языков.

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее