排查WordPress中admin-ajax.php请求被重定向至首页的问题
排查WordPress中admin-ajax.php请求被重定向至首页的系统性方法
我正在寻找最佳方法,排查为何我的WordPress站点中,指向/wp_admin/admin-ajax.php的Ajax请求会被重定向至首页。参考了另一个正常运行的、使用admin-ajax的插件模式开发新自定义插件,但新插件的admin-ajax请求始终被重定向到首页。
已完成的排查步骤
- 站点有按用户角色跳转的登录重定向插件,修改其代码在重定向前增加
DOING_AJAX判断,但问题仍未解决:if (is_admin() || !$post || DOING_AJAX) { return; } - 浏览器中可见Ajax请求已发起,但返回302状态码并被重定向至首页:

我的代码实现
JavaScript代码
function updateAvailability(e){ var active_select = document.getElementById("availability_" + e); var newAvailability = active_select.value; var respJSON = ""; console.log('display_user_company_products updating availability for product: ' + e + ' to : ' + newAvailability); jQuery.ajax({ type : "post", dataType : "json", url : "https://xxxxxx/wp_admin/admin-ajax.php", data : {'action': 'update_product_master', 'product_id': e, 'attribute': 'current_availability', 'value': newAvailability, }, success: function(response) { respJSON = JSON.stringify(response); console.log('display_user_company_products AJAX call returned : ' + respJSON); if(response.type == "success") { alert("Thank you for updating your info!"); } else { respJSON = JSON.stringify(response); alert("Your update could not be processed"); } } }); }
PHP代码
// Create admin-ajax function to update product master attributes based on call from B2B Portal add_action("wp_ajax_update_product_master", "ajax_update_product_master",1); add_action("wp_ajax_nopriv_update_product_master", "ajax_update_product_master",1); function ajax_update_product_master() { if (!$product_id) { $product_id = isset($_POST['product_id'])?$_POST['product_id']:isset($_GET['product_id'])?$_GET['product_id']:0; } if (!$attribute) { $attribute = isset($_POST['attribute'])?$_POST['attribute']:isset($_GET['attribute'])?$_GET['attribute']:0; } if (!$value) { $value = isset($_POST['value'])?$_POST['value']:isset($_GET['value'])?$_GET['value']:0; } error_log("Function ajax_update_product_master updating product master : ".$product_id." attribute : ".$attribute." with value : ".$value); $result = array('success'=> 1, 'message'=>'Function ajax_update_product_master updating product master '.$cigar_id.' attribute '.$attribute.' with value '.$value); return json_encode($result); }
我无法理解为何admin-ajax未执行上述PHP函数,反而将请求重定向至首页,请问可采用哪些系统性方法排查该问题?
系统性排查步骤
1. 修正admin-ajax.php路径
WordPress标准路径是/wp-admin/admin-ajax.php(注意是wp-admin而非你代码中的wp_admin),路径错误是常见的重定向原因。推荐使用WordPress内置函数动态获取路径,避免硬编码:
url: "<?php echo admin_url('admin-ajax.php'); ?>",
2. 验证DOING_AJAX常量是否生效
在wp-config.php中添加日志代码,确认Ajax请求是否被正确识别:
add_action('init', function() { if (isset($_REQUEST['action'])) { error_log('DOING_AJAX status: ' . (defined('DOING_AJAX') ? DOING_AJAX : '未定义')); error_log('请求action: ' . $_REQUEST['action']); } });
查看服务器错误日志,确认Ajax请求触发时DOING_AJAX是否为true。
3. 排查重定向来源
- 暂时禁用所有第三方插件(保留自定义插件),测试请求是否正常。若恢复正常,逐个启用插件排查元凶。
- 切换到默认主题(如Twenty Twenty-Four),排除主题的权限拦截或重定向逻辑。
- 搜索全站代码中所有
wp_redirect、redirect或302状态相关代码,检查是否遗漏DOING_AJAX判断。
4. 验证钩子与函数加载
- 在PHP函数开头添加日志,确认函数是否被触发:
若日志无记录,检查自定义插件是否激活、代码是否在插件主文件中,或钩子名称是否拼写错误。function ajax_update_product_master() { error_log("ajax_update_product_master已触发"); // 原有代码... }
5. 修复Ajax响应逻辑
WordPress的admin-ajax请求必须用wp_die()终止执行,而非return,否则会触发后续流程导致重定向:
echo json_encode($result); wp_die(); // 必须添加,终止WordPress执行流程
6. 分析服务器与网络日志
- 查看服务器access.log和error.log,确认302重定向的触发源(代码或服务器配置)。
- 在浏览器Network面板中查看请求的
X-Redirect-By响应头,该字段会标明触发重定向的插件/函数。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

