WordPress调用类内AJAX方法遇400错误,求解决方法
问题
之前在functions.php中直接编写WordPress AJAX函数,绑定钩子的代码如下:
add_action('wp_ajax_nopriv_myfunction', 'myfunction'); add_action('wp_ajax_myfunction', 'myfunction');
现在调整代码结构,将函数放到ds_calculators类中,前端AJAX代码:
$.ajax({ type: 'POST', url: my_ajax.ajaxurl, data: { action : 'ds_calculators::myfunction', }, success: function(data, textStatus, XMLHttpRequest) { jQuery('.changer').html(data); }, error: function(XMLHttpRequest, textStatus, errorThrown) { if (typeof console === "undefined") { console = { log: function() {}, debug: function() {}, }; } if (XMLHttpRequest.status == 404) { console.log('Element not found.'); } else { console.log('Error: ' + errorThrown); } } });
后端绑定钩子的代码改为:
add_action('wp_ajax_nopriv_myFunction', 'ds_calculators::myFunction'); add_action('wp_ajax_myFunction', 'ds_calculators::myFunction');
现在请求出现400(错误请求),请问如何正确调用类中的AJAX方法?这是否是导致错误的原因?
解决方案
400错误的核心原因是AJAX action名称不匹配,同时类方法的绑定方式也需要规范调整,具体步骤如下:
1. 统一Action名称(大小写+格式)
WordPress的AJAX action名称区分大小写,且不建议使用::这类特殊字符(易引发解析问题),需保持前后端action名称完全一致:
- 后端钩子的action后缀(即
wp_ajax_/wp_ajax_nopriv_后的部分)要统一,比如设为ds_calculators_myfunction - 前端AJAX请求的
action参数必须和后端后缀完全一致
2. 类方法的正确绑定方式
根据myFunction是静态方法还是实例方法,选择对应的绑定方式:
情况A:静态方法
如果myFunction是ds_calculators类的静态方法,绑定钩子时推荐用数组格式(更规范):
add_action('wp_ajax_nopriv_ds_calculators_myfunction', ['ds_calculators', 'myFunction']); add_action('wp_ajax_ds_calculators_myfunction', ['ds_calculators', 'myFunction']);
也可以用字符串格式,但数组格式更符合WordPress编码规范:
// add_action('wp_ajax_nopriv_ds_calculators_myfunction', 'ds_calculators::myFunction'); // add_action('wp_ajax_ds_calculators_myfunction', 'ds_calculators::myFunction');
情况B:实例方法
如果myFunction是非静态方法,需要先实例化类,再绑定实例的方法:
// 先实例化类 $calculator = new ds_calculators(); // 绑定实例方法 add_action('wp_ajax_nopriv_ds_calculators_myfunction', [$calculator, 'myFunction']); add_action('wp_ajax_ds_calculators_myfunction', [$calculator, 'myFunction']);
3. 调整前端AJAX请求
将前端的action参数改为和后端一致的名称:
data: { action : 'ds_calculators_myfunction' },
额外注意事项
- 确保
ds_calculators类已经被正确加载(比如通过自动加载器或手动include/require),否则会因找不到类/方法触发错误 - 400错误大多是action参数不匹配或后端无对应钩子处理函数,优先检查名称一致性
内容的提问来源于stack exchange,提问作者hfw
相关产品推荐
相关产品推荐

