Устранение ошибки 400 при работе с WordPress AJAX
Я столкнулся с ошибкой 400 (strict-origin-when-cross-origin) при реализации AJAX в WordPress, несмотря на следование стандартным практикам. Вот мой код:
Настройка плагина
require_once( plugin_dir_path( __FILE__ ) . 'classes/duplicate_statement_controller.class.php' );
add_action( 'wp_enqueue_scripts', function(){
wp_enqueue_style('duplicate-tax-css' , plugin_dir_url( __FILE__ ) . '/assets/duplicate-tax.css' );
wp_enqueue_script( 'duplicate-tax-js', plugin_dir_url( __FILE__ ) . '/assets/duplicate-tax.js', array('jquery'), '1.0', true );
wp_localize_script( 'duplicate-tax-js', 'tax_object',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce('tax-nonce')
)
);
} );
Вызов jQuery AJAX
$.ajax({
url: tax_object.ajax_url,
type: 'post',
data: {
action: 'add_row',
nonce: tax_object.nonce
},
success: function (response) {
// вероятно, здесь нужно пересчитать
console.log(response);
}
});
Обработчик PHP AJAX
private function __construct() {
//Хуки и фильтры WordPress
add_action( 'init', array ( $this , 'action_init' ) );
// Ajax действия для строк
add_action('wp_ajax_add_row', array( $this , 'add_row' ) );
add_action('wp_ajax_nopriv_add_row', array( $this , 'add_row' ) );
add_action('wp_ajax_remove_row', array( $this , 'remove_row' ) );
add_action('wp_ajax_nopriv_remove_row', array( $this , 'remove_row' ) );
}
public function add_row() {
error_log("!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
Описание проблемы
Каждый раз, когда я запускаю этот код, я получаю ошибку 400 (strict-origin-when-cross-origin). Я зарегистрировал AJAX вызовы, использовал wp_enqueue и wp_localize_script, а также включил хуки wp_ajax и wp_ajax_nopriv, как рекомендуется. Синтаксис кажется правильным, и тот же код работает в другом плагине без проблем.
Что может вызывать эту ошибку 400, и как можно дальше диагностировать проблему?
Ошибка WordPress AJAX 400 с “strict-origin-when-cross-origin”
Ошибка WordPress AJAX 400 с “strict-origin-when-cross-origin” указывает как на ответ сервера 400 Bad Request, так и на проблему с политикой CORS на стороне клиента. Эта комбинация свидетельствует о том, что ваш AJAX-запрос не достигает сервера должным образом из-за ограничений безопасности браузера, или сервер отклоняет запрос по конкретным причинам.
На основе вашего кода и результатов исследования, вот комплексное руководство по устранению неполадок:
Содержание
- Понимание комбинации ошибок
- Распространенные причины и решения
- Пошаговое устранение неполадок
- Расширенная настройка CORS
- Конфликты плагинов и тем
- Альтернативные подходы
Понимание комбинации ошибок
Ошибка “400 (strict-origin-when-cross-origin)” на самом деле представляет собой две отдельные проблемы, объединенные вместе:
- 400 Bad Request: Ошибка на стороне сервера, указывающая на неправильный формат запроса
- strict-origin-when-cross-origin: Политика безопасности браузера, предотвращающая междоменные запросы
Как отмечено в результатах исследования, “это не одна ошибка, а две”. Браузер, вероятно, блокирует запрос до того, как он достигнет вашего сервера, или сервер отклоняет его с кодом состояния 400.
Распространенные причины и решения
1. Проблемы с параметром action
Наиболее распространенной причиной ошибок AJAX 400 в WordPress является отсутствие или неправильный параметр action:
// Ваш текущий код
data: {
action: 'add_row',
nonce: tax_object.nonce
}
Решение: Убедитесь, что параметр action точно соответствует тому, что вы зарегистрировали. Проверьте наличие опечаток и чувствительность к регистру.
2. Несоответствие Content-Type
На основе результатов исследования, старая конечная точка admin-ajax.php не поддерживает JSON-полезные данные:
“Часть contentType в вашем JS-скрипте, которая отправляет данные формы в виде JSON-полезной нагрузки, но учтите, что старая конечная точка admin-ajax.php не поддерживает JSON-полезную нагрузку, поэтому $_REQUEST[‘action’] будет пустым”
Решение: Удалите любой contentType: 'application/json' из вашего AJAX-вызова и позвольте jQuery использовать стандартный application/x-www-form-urlencoded:
$.ajax({
url: tax_object.ajax_url,
type: 'post',
data: {
action: 'add_row',
nonce: tax_object.nonce
},
// Удалите настройку contentType полностью
success: function (response) {
console.log(response);
}
});
3. Проблемы с временем регистрации хуков
Ваши хуки зарегистрированы в конструкторе, но, возможно, это слишком поздно:
private function __construct() {
add_action( 'init', array ( $this , 'action_init' ) );
// AJAX хуки здесь
}
Решение: Переместите регистрацию AJAX-хуков раньше в процессе загрузки:
add_action( 'plugins_loaded', array( $this, 'init' ) );
private function init() {
// Сразу регистрируем AJAX хуки
add_action('wp_ajax_add_row', array( $this, 'add_row' ));
add_action('wp_ajax_nopriv_add_row', array( $this, 'add_row' ));
}
Пошаговое устранение неполадок
Шаг 1: Базовая проверка
- Проверьте вкладку сети в браузере: Посмотрите на детали фактического запроса в инструментах разработчика браузера
- Проверьте параметр action: Убедитесь, что
action: 'add_row'точно соответствует вашему зарегистрированному хуку - Протестируйте с упрощенным запросом: Временно удалите nonce, чтобы изолировать проблему
// Тест без nonce
$.ajax({
url: tax_object.ajax_url,
type: 'post',
data: {
action: 'add_row'
},
success: function (response) {
console.log(response);
}
});
Шаг 2: Отладка ответа сервера
Добавьте отладку в ваш PHP-обработчик:
public function add_row() {
// Логируем все полученные данные
error_log("Полученные данные: " . print_r($_REQUEST, true));
error_log("Action: " . $_REQUEST['action']);
// Возвращаем что-то для теста
wp_send_json_success('Hello World');
}
Шаг 3: Проверка конфликтов плагинов
Как рекомендуется в результатах исследования:
“Проверьте, сохраняется ли проблема при деактивации всех плагинов или переключении на тему WordPress по умолчанию”
- Деактивируйте все плагины, кроме вашего
- Переключитесь на тему по умолчанию (например, Twenty Twenty-Four)
- Протестируйте ваш AJAX-вызов
- Если это работает, включайте плагины по одному, чтобы найти конфликт
Шаг 4: Сброс постоянных ссылок
Поврежденные настройки постоянных ссылок могут вызывать ошибки 400:
- Перейдите в Настройки > Постоянные ссылки
- Не вносите изменений, просто нажмите “Сохранить изменения”
- Протестируйте ваш AJAX-вызов снова
Расширенная настройка CORS
Если вы выполняете междоменные запросы, вам потребуется настроить заголовки CORS:
Метод 1: Использование фильтров WordPress
add_filter('allowed_http_origins', function($origins) {
// Добавьте ваш домен
$origins[] = 'https://yourdomain.com';
return $origins;
});
add_filter('wp_headers', function($headers) {
$headers['Access-Control-Allow-Origin'] = 'https://yourdomain.com';
$headers['Access-Control-Allow-Credentials'] = 'true';
return $headers;
});
Метод 2: Использование .htaccess (для Apache)
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://yourdomain.com"
Header set Access-Control-Allow-Credentials "true"
</IfModule>
Метод 3: Использование PHP в функциях темы
add_action('send_headers', function() {
header('Access-Control-Allow-Origin: https://yourdomain.com');
header('Access-Control-Allow-Credentials: true');
});
Конфликты плагинов и тем
Если проблема сохраняется после базового устранения неполадок:
- Проверьте конфликты JavaScript: Ищите другие скрипты, которые могут мешать
- Проверьте реализацию nonce: Убедитесь, что ваш nonce правильно создается и проверяется
- Проверьте логи сервера: Ищите ошибки или предупреждения PHP
Альтернативные подходы
1. Использование REST API WordPress
Рассмотрите возможность перехода на современный REST API WordPress вместо устаревшего admin-ajax.php:
fetch('/wp-json/wp/v2/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': wpApiSettings.nonce
},
body: JSON.stringify({
title: 'Hello World'
})
})
2. Решение только на стороне фронтенда
Если ваш AJAX-вызов не требует обработки на бэкенде WordPress, рассмотрите возможность обработки его полностью на стороне фронтенда:
// Обработка данных без обратного вызова к серверу
function addRow() {
// Ваша логика здесь
console.log('Строка добавлена');
}
3. Проверка конфигурации сервера
Если вы работаете в локальной среде разработки, такой как MAMP, конфигурация сервера может вызывать проблемы:
- Проверьте логи ошибок PHP
- Убедитесь, что модули сервера включены
- Проверьте правильность прав доступа к файлам
Помните, что ошибка “strict-origin-when-cross-origin” в первую очередь является функцией безопасности браузера, поэтому сначала сосредоточьтесь на правильности формата вашего запроса, прежде чем погружаться в настройку CORS. Ошибка 400 указывает на то, что сервер отклоняет ваш запрос до того, как он может обработать заголовки CORS.
Источники
- Stack Overflow - Getting a 400 error with WordPress AJAX call
- WordPress Stack Exchange - Cannot load admin-ajax.php
- Expertrec - Troubleshooting Admin-ajax.php 400 Error
- WPBeginner - Fix WordPress Admin Ajax 400 Error
- WordPress Stack Exchange - admin-ajax.php 400 bad request
- 24x7 WP Support - Fix WordPress admin-ajax.php 400 Error
Заключение
Ошибка WordPress AJAX 400 с “strict-origin-when-cross-origin” обычно вызвана одной из этих проблем:
- Неправильный параметр action, приводящий к отклонению сервером
- Несоответствие Content-Type между ожиданиями фронтенда и бэкенда
- Политика CORS, блокирующая междоменные запросы
- Конфликты плагинов или тем, мешающие выполнению AJAX
- Неправильное время регистрации хуков
Начните с простейших шагов по устранению неполадок: проверьте ваш параметр action, удалите любые настройки пользовательского типа содержимого и протестируйте с минимальным запросом. Если проблема сохраняется, исследуйте конфликты плагинов и настройку CORS. Рассмотрите возможность перехода на REST API WordPress для более современного подхода, если вы продолжаете сталкиваться с проблемами с устаревшей конечной точкой admin-ajax.php.