You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

排查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状态码并被重定向至首页:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:27:33