Плагин 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 и языков.