WordPress admin-ajax.php返回400错误及响应0的问题求助
解决WordPress admin-ajax.php 400 Bad Request错误(响应内容为0)
问题场景
开发WordPress插件时,通过AJAX调用admin-ajax.php返回400 Bad Request错误,网络面板中响应内容为0,控制台报错详情如下:
POST http://localhost/mywordpress/wordpress/wp-admin/admin-ajax.php 400 (Bad Request) Error loading counties: {readyState: 4, status: 400, statusText: "Bad Request", responseText: "0", ...}
相关代码
script.js
$.ajax({ url: city_generator.ajax_url, type: 'POST', data: { nonce: city_generator.nonce, action: 'load_counties', state: state, }, success: function (response) { console.log('County response:', response); }, error: function (error) { console.error('Error loading counties:', error); }, });
admin-page.php
// Example: Load counties based on state add_action('wp_ajax_load_counties', 'load_counties_callback'); add_action('wp_ajax_nopriv_load_counties', 'load_counties_callback'); function load_counties_callback() { $nonce = $_POST['nonce']; check_ajax_referer('ajax-nonce', 'nonce'); // Verify the nonce if (isset($_POST['state'])) { $state = sanitize_text_field($_POST['state']); $counties = get_counties_by_state($state); wp_send_json_success(array('counties' => $counties)); } wp_die(); }
city-generator.php
add_action('admin_enqueue_scripts', 'city_generator_admin_enqueue_scripts'); function city_generator_admin_enqueue_scripts($hook) { if ($hook === 'settings_page_city-generator') { wp_enqueue_script('city-generator-script', plugin_dir_url(__FILE__) . 'assets/script.js', array('jquery'), null, true); wp_enqueue_style('city-generator-style', plugin_dir_url(__FILE__) . 'assets/style.css'); wp_localize_script('city-generator-script', 'city_generator', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('ajax-nonce'), )); } }
排查与修复步骤
确认钩子已正确注册:检查
admin-page.php是否被主插件文件(如city-generator.php)通过require_once或include引入。如果未加载该文件,wp_ajax_load_counties钩子不会被注册,WordPress找不到对应回调函数会直接返回0。验证Nonce一致性:虽然代码中
wp_create_nonce('ajax-nonce')和check_ajax_referer('ajax-nonce', 'nonce')的action参数一致,仍可通过调试确认:- 在
load_counties_callback开头添加代码:error_log('Received nonce: ' . $_POST['nonce']); error_log('Generated nonce: ' . wp_create_nonce('ajax-nonce')); - 查看WordPress的
debug.log(需开启WP_DEBUG),对比两个nonce是否一致。若不一致,检查admin_enqueue_scripts的钩子触发时机,确保wp_localize_script在正确页面调用。
- 在
检查前端
state变量有效性:在AJAX请求前添加console.log(state),确认变量有有效值。若state为undefined,可能触发后续逻辑问题,同时需确保请求参数格式正确。临时关闭Nonce验证测试:注释掉
check_ajax_referer一行后重新发起请求,若请求成功,说明问题出在Nonce验证环节,需重新检查nonce的生成和传递流程。确认钩子优先级:给
add_action添加优先级参数(默认10),确保钩子在合适时机注册:add_action('wp_ajax_load_counties', 'load_counties_callback', 10); add_action('wp_ajax_nopriv_load_counties', 'load_counties_callback', 10);
内容的提问来源于stack exchange,提问作者ladi ayo
相关产品推荐
相关产品推荐

