НейроАгент

Как исправить ошибку WordPress AJAX 400: Полное руководство

Узнайте, как исправлять ошибки WordPress AJAX 400 с проблемами strict-origin-when-cross-origin. Полное руководство по устранению неполадок, охватывающее распространенные причины, настройку CORS и пошаговые решения для разработчиков.

Устранение ошибки 400 при работе с WordPress AJAX

Я столкнулся с ошибкой 400 (strict-origin-when-cross-origin) при реализации AJAX в WordPress, несмотря на следование стандартным практикам. Вот мой код:

Настройка плагина

php
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

javascript
$.ajax({
    url: tax_object.ajax_url,
    type: 'post',
    data: {
        action: 'add_row',
        nonce: tax_object.nonce
    },
  success: function (response) {
    // вероятно, здесь нужно пересчитать
    console.log(response);
  }
});

Обработчик PHP AJAX

php
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-запрос не достигает сервера должным образом из-за ограничений безопасности браузера, или сервер отклоняет запрос по конкретным причинам.

На основе вашего кода и результатов исследования, вот комплексное руководство по устранению неполадок:

Содержание

Понимание комбинации ошибок

Ошибка “400 (strict-origin-when-cross-origin)” на самом деле представляет собой две отдельные проблемы, объединенные вместе:

  1. 400 Bad Request: Ошибка на стороне сервера, указывающая на неправильный формат запроса
  2. strict-origin-when-cross-origin: Политика безопасности браузера, предотвращающая междоменные запросы

Как отмечено в результатах исследования, “это не одна ошибка, а две”. Браузер, вероятно, блокирует запрос до того, как он достигнет вашего сервера, или сервер отклоняет его с кодом состояния 400.

Распространенные причины и решения

1. Проблемы с параметром action

Наиболее распространенной причиной ошибок AJAX 400 в WordPress является отсутствие или неправильный параметр action:

javascript
// Ваш текущий код
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:

javascript
$.ajax({
    url: tax_object.ajax_url,
    type: 'post',
    data: {
        action: 'add_row',
        nonce: tax_object.nonce
    },
    // Удалите настройку contentType полностью
    success: function (response) {
        console.log(response);
    }
});

3. Проблемы с временем регистрации хуков

Ваши хуки зарегистрированы в конструкторе, но, возможно, это слишком поздно:

php
private function __construct() {
    add_action( 'init', array ( $this , 'action_init' ) );
    // AJAX хуки здесь
}

Решение: Переместите регистрацию AJAX-хуков раньше в процессе загрузки:

php
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: Базовая проверка

  1. Проверьте вкладку сети в браузере: Посмотрите на детали фактического запроса в инструментах разработчика браузера
  2. Проверьте параметр action: Убедитесь, что action: 'add_row' точно соответствует вашему зарегистрированному хуку
  3. Протестируйте с упрощенным запросом: Временно удалите nonce, чтобы изолировать проблему
javascript
// Тест без nonce
$.ajax({
    url: tax_object.ajax_url,
    type: 'post',
    data: {
        action: 'add_row'
    },
    success: function (response) {
        console.log(response);
    }
});

Шаг 2: Отладка ответа сервера

Добавьте отладку в ваш PHP-обработчик:

php
public function add_row() {
    // Логируем все полученные данные
    error_log("Полученные данные: " . print_r($_REQUEST, true));
    error_log("Action: " . $_REQUEST['action']);
    
    // Возвращаем что-то для теста
    wp_send_json_success('Hello World');
}

Шаг 3: Проверка конфликтов плагинов

Как рекомендуется в результатах исследования:

“Проверьте, сохраняется ли проблема при деактивации всех плагинов или переключении на тему WordPress по умолчанию”

  1. Деактивируйте все плагины, кроме вашего
  2. Переключитесь на тему по умолчанию (например, Twenty Twenty-Four)
  3. Протестируйте ваш AJAX-вызов
  4. Если это работает, включайте плагины по одному, чтобы найти конфликт

Шаг 4: Сброс постоянных ссылок

Поврежденные настройки постоянных ссылок могут вызывать ошибки 400:

  1. Перейдите в Настройки > Постоянные ссылки
  2. Не вносите изменений, просто нажмите “Сохранить изменения”
  3. Протестируйте ваш AJAX-вызов снова

Расширенная настройка CORS

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

Метод 1: Использование фильтров WordPress

php
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)

apache
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "https://yourdomain.com"
    Header set Access-Control-Allow-Credentials "true"
</IfModule>

Метод 3: Использование PHP в функциях темы

php
add_action('send_headers', function() {
    header('Access-Control-Allow-Origin: https://yourdomain.com');
    header('Access-Control-Allow-Credentials: true');
});

Конфликты плагинов и тем

Если проблема сохраняется после базового устранения неполадок:

  1. Проверьте конфликты JavaScript: Ищите другие скрипты, которые могут мешать
  2. Проверьте реализацию nonce: Убедитесь, что ваш nonce правильно создается и проверяется
  3. Проверьте логи сервера: Ищите ошибки или предупреждения PHP

Альтернативные подходы

1. Использование REST API WordPress

Рассмотрите возможность перехода на современный REST API WordPress вместо устаревшего admin-ajax.php:

javascript
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, рассмотрите возможность обработки его полностью на стороне фронтенда:

javascript
// Обработка данных без обратного вызова к серверу
function addRow() {
    // Ваша логика здесь
    console.log('Строка добавлена');
}

3. Проверка конфигурации сервера

Если вы работаете в локальной среде разработки, такой как MAMP, конфигурация сервера может вызывать проблемы:

  • Проверьте логи ошибок PHP
  • Убедитесь, что модули сервера включены
  • Проверьте правильность прав доступа к файлам

Помните, что ошибка “strict-origin-when-cross-origin” в первую очередь является функцией безопасности браузера, поэтому сначала сосредоточьтесь на правильности формата вашего запроса, прежде чем погружаться в настройку CORS. Ошибка 400 указывает на то, что сервер отклоняет ваш запрос до того, как он может обработать заголовки CORS.

Источники

  1. Stack Overflow - Getting a 400 error with WordPress AJAX call
  2. WordPress Stack Exchange - Cannot load admin-ajax.php
  3. Expertrec - Troubleshooting Admin-ajax.php 400 Error
  4. WPBeginner - Fix WordPress Admin Ajax 400 Error
  5. WordPress Stack Exchange - admin-ajax.php 400 bad request
  6. 24x7 WP Support - Fix WordPress admin-ajax.php 400 Error

Заключение

Ошибка WordPress AJAX 400 с “strict-origin-when-cross-origin” обычно вызвана одной из этих проблем:

  1. Неправильный параметр action, приводящий к отклонению сервером
  2. Несоответствие Content-Type между ожиданиями фронтенда и бэкенда
  3. Политика CORS, блокирующая междоменные запросы
  4. Конфликты плагинов или тем, мешающие выполнению AJAX
  5. Неправильное время регистрации хуков

Начните с простейших шагов по устранению неполадок: проверьте ваш параметр action, удалите любые настройки пользовательского типа содержимого и протестируйте с минимальным запросом. Если проблема сохраняется, исследуйте конфликты плагинов и настройку CORS. Рассмотрите возможность перехода на REST API WordPress для более современного подхода, если вы продолжаете сталкиваться с проблемами с устаревшей конечной точкой admin-ajax.php.