为什么,如果一个函数接受参数,它在AJAX调用中就会失败?

时间:2020-06-26 作者:Artem

我正在尝试编写一个WP函数来处理ajax和直接调用,如下所示:

PHP

function some_function($var){
    $var = !empty($var) ? $var : $_POST[\'var\'];
    echo $var;
    
    //or even

    $var = null;
    echo \'something\';

    if(!empty($_POST[\'action\'])) wp_die();
}
AJAX调用

let ajaxurl = \'███\';
let data = {\'action\': \'somefunction\',\'var\':\'foo\')};
$.post(ajaxurl, data, function(response) {console.log(response);});
WP使用

add_action( \'wp_ajax_somefunction\', \'some_function\',10,1);
add_action( \'wp_ajax_nopriv_somefunction\', \'some_function\',10,1);
另一次WP使用

some_function(\'bar\');
然而,每当我将$var作为一个可接受的函数参数时,一些\\u函数($var),我的ajax调用就会开始返回500个错误。像这样的

function some_function(){
    $var = !empty($var) ? $var : $_POST[\'var\'];
    echo $var;
}
适用于ajax。

我尝试查找wp ajax&;参数,但搜索结果总是关于我们通过ajax传递的变量,而不是回调函数参数。我学到的唯一一件事是,我们必须在add\\u action()中添加一些可接受的参数

我做错了什么?

非常感谢。

。。。P、 我发现了一个有趣的解决方法:

function some_function_ajax(){
    $var = $_POST[\'var\'];
    some_function($var);
}
function some_function($var){
    echo $var;
} // =)
但是,正确的方法是什么?

Jackob Peattie,谢谢你的提示!工作代码如下所示,然后:

//JS (jQuery):
let data = {
   \'action\' : \'func\',
   \'var\' : \'something\',
   \'nonce\' : nonce
};
$.post(ajaxurl, data);

//add_action:
add_action( \'wp_ajax_func\', \'func_ajax\');
add_action( \'wp_ajax_nopriv_func\', \'func_ajax\');

//PHP:
function func_ajax(){
   //verify nonce
   if(empty($_POST[\'nonce\']) || !wp_verify_nonce( $_POST[\'nonce\'], \'myajax-nonce\' ) ) wp_die();

    $var = $_POST[\'var\'];
    func($var);

   //end ajax call
   wp_die();
}

function func($var){
    echo $var;
}

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

没有参数传递给AJAX回调函数。随请求传递的变量在中可用$_GET$_POST. 因此,如果函数需要参数,则不能直接将其用作挂钩回调。

您的解决方法是使用在AJAX请求中接受参数的函数的正确方法。

相关推荐

通过FormData API和AJAX上传图像不起作用($_FILES始终为空)

当我尝试执行标题中提到的操作时,我的请求都能正常工作(nonce-check通过,服务器响应200已接收,服务器脚本也能正常工作)。我的问题是,我无法访问服务器端脚本上上载的图像文件$_文件始终为空。虽然已经有很多关于堆栈溢出的帖子,但他们的解决方案都不适合我。我的HTML(请注意,我不使用表单标记,但应该不会有问题):<input type=\'file\' name=\'imageupload\' id=\'image-for-upload\'> <button onclic