停止AJAX侦听器向函数发送空参数

时间:2017-02-22 作者:indextwo

我有很多函数可以对一些字段进行实时ajax检查;例如,在email 字段填充后,它将触发ajax检查,以查看该电子邮件是否已被其他帐户使用。我还想使用相同的函数对发布到表单的值进行双重检查。目前,情况如下:

function ajax_checkEmailAddress($passedEmail = false) {

    $isAjaxRequest = ($passedEmail === false);

    $sentEmail = (!$isAjaxRequest) ? $passedEmail : sanitize_email($_POST[\'email\'], true);

    if (email_exists($sentEmail)) {
    $jsonArray[\'response\'] = \'error\';
    $jsonArray[\'message\'] = __(\'This email address is already in use.\', \'ajaxSignup\');
    } else {
        $jsonArray[\'response\'] = \'success\';
    }

    if ($isAjaxRequest) {
        wp_send_json($jsonArray);
    } else {
        return $jsonArray;
    }
}
随后,我有了另一个处理完整提交表单的ajax功能:

function ajax_processForm() {

    $email = $_POST[\'email\'];
    $checkedEmail = ajax_checkEmailAddress($email);

    if ($checkedEmail[\'response\'] == \'success\') {
        //  Continue processing the form actions
    } else {
        wp_send_json($checkedEmail);
    }
}

add_action(\'wp_ajax_processForm\', \'ajax_processForm\');
add_action(\'wp_ajax_nopriv_processForm\', \'ajax_processForm\');
我不想重复所有的错误检查函数,因此$passedEmail 参数检查,默认为false; 这样,函数应该知道它是由ajax调用还是由内部函数调用,并且可以return 函数的结果数组,而不是wp_send_json, 这会die().

但是,使用标准ajax侦听器:

add_action(\'wp_ajax_checkEmailAddress\', \'ajax_checkEmailAddress\');
add_action(\'wp_ajax_nopriv_checkEmailAddress\', \'ajax_checkEmailAddress\');
。。。它们似乎总是发送一个空参数,所以$passedEmail 从不默认为false. 即使我尝试使用无意义的默认值,它也会被覆盖:

function ajax_checkEmailAddress($passedEmail = \'wibble\') {
    wp_send_json($passedEmail); //  Returns \'\' when called via ajax
}
很遗憾,我不能使用DOING_AJAX 确定字段检查功能是否应returnwp_send_json, 因为表单检查函数本身是通过ajax调用的,所以DOING_AJAX 始终返回true.

我有半打针对不同字段类型的“实时检查”函数,所以我真的不想将它们全部复制。有没有办法wp_ajax 是否发送空参数?还是一种更整洁的处理方式?

这听起来与年提出的问题类似this old trac ticket, 但这并不完全相同,只是讨论了在3.4和;3.5。

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

最后,我只是将实际验证抽象为另一个函数:

function ajax_checkEmailAddress($passedEmail = false) {

    $sentEmail = sanitize_email($_POST[\'email\'], true);

    $jsonArray = validateEmailAddress($passedEmail);
    wp_send_json($jsonArray);

}

add_action(\'wp_ajax_checkEmailAddress\', \'ajax_checkEmailAddress\');
add_action(\'wp_ajax_nopriv_checkEmailAddress\', \'ajax_checkEmailAddress\');

function validateEmailAddress($email) {
    if (email_exists($email)) {
        $jsonArray[\'response\'] = \'error\';
        $jsonArray[\'message\'] = __(\'This email address is already in use.\', \'ajaxSignup\');
    } else {
        $jsonArray[\'response\'] = \'success\';
    }

    return $jsonArray;
}
这样,validateEmailAddress 可以从另一个PHP函数调用而不会出现问题,ajax函数不必尝试解密它是否是直接的ajax调用。

我还是不知道为什么wp_ajax 发送一个空参数,但我很想知道。

相关推荐

WordPress AJAX错误400向远程站点发送数据的错误请求

我正在使用发件人。net获取电子邮件订阅列表。这个网站给了我一些信息,可以将用户的电子邮件添加到订阅列表中。我想使用WordPress ajax来实现这一点。但它返回错误400错误请求。我的代码是:文件ajax新闻脚本。js公司: jQuery(document).ready(function($){ // Perform AJAX send news on form submit $(\'form#fnews\').on(\'submit\', funct