【问题标题】:Send a form from Jquery to PHP with ajax (wordpress)使用ajax(wordpress)将表单从Jquery发送到PHP
【发布时间】:2013-12-30 00:22:04
【问题描述】:

我有一个 javascript 文件序列化并将表单发送到 php 函数:

function call_ajax(){


var data2 = jQuery('#newIdeaForm').serialize(); // <--- Important

jQuery.ajax({
    type: 'POST',
    url: myAjax.ajaxurl,
    data: ({action : 'savedata',data : data2}),
    success: function() {


        alert(data2);


    }
});

};

问题是我不知道如何在这个 php 函数中接收这个表单:

function savedata(){



$my_post = array(
            'post_title'    => 'data.name',
            'post_content'  => 'data.idea',
            'post_status'   => 'publish',
            'post_author'   => $user_id,
            );
        wp_insert_post($my_post);

        die();
    }

表单的某些字段是'name'和'idea',我知道var data2接收到序列化的表单但不知道如何将此表单放入php函数中。

其他问题: 在 javascript 文件的警报事件中,它会提醒已序列化的表单,我该如何反序列化此表单以仅提醒名称字段?

【问题讨论】:

    标签: javascript jquery ajax wordpress serialization


    【解决方案1】:

    这是一个如何在 Wordpress 中不使用 AJAX 的主要示例。

    首先,您需要挂钩 wordpress 提供的操作。为此,我们将同时使用 noprivgeneric.

    add_action('wp_ajax_nopriv_savedata', 'my_ajax_handler');
    add_action('wp_ajax_savedata', 'my_ajax_handler');
    

    现在,我们需要定义 my_ajax_handler() 函数并将其配置为仅解析我们发送的 ajax 请求(稍后会详细介绍)

    ​​>
    function my_ajax_handler(){
        switch($_REQUEST['fn']):
            case 'savedata' : 
                echo my_ajax_save_form($_REQUEST['data']);
                break;
        endswitch;
    }
    

    然后,我们需要定义my_ajax_save_form()函数,这样我们才能触发实际的WP Post提交。

    function my_ajax_save_form($arr){
        $post_vars = array();
        $data = parse_str($arr, $params);
        $my_post = array(
            'post_title'    => $data['name'],
            'post_content'  => $data['idea'],
            'post_status'   => 'publish',
            'post_author'   => $user_id, //where did this come from?
            );
        if(wp_insert_post($my_post)) return true;
        return false;
    }
    

    上面最值得注意的是$data = parse_str($_REQUEST, $params);。这个 s 用于获取序列化的 jQuery 表单var1=a&amp;var2=b....等,并将其转换为数组,然后我们可以在其中提取变量。如果发布成功,该函数将返回 true,否则返回 false。最后,您需要更新您的 ajax 函数以将新的 fn 参数设置为 switched() on。

    jQuery.ajax({
        type: 'POST',
        url: ajaxurl, //wordpres supplies this global variable. use it.
        data: ({fn: 'savedata', action : 'savedata',data : data2}),
        success: function(resp) {
            if(!resp){ alert ('Failed!')}else{ alert(data2) }
        }
    });
    

    需要注意的是,在发出 ajax 请求时,WP 会将 action 参数保留为您的 add_action() 中的一个值,这就是它如此命名的原因。如果您想更改javascript 中的action value,请确保根据需要更新add_action 代码。

    【讨论】:

    • 我只是粘贴了代码中最重要的部分,但我还有其他所需的功能。
    【解决方案2】:

    serialize() 将生成一个表单编码字符串,如下所示:

    name=foo&amp;email=foo@bar.com&amp;age=86

    如果你将一个对象传递给data,jQuery 会默认将其转换为这种格式。

    混合序列化和对象因此变得棘手,所以最好坚持一种方法或另一种。

    试试这个:

    var data2 = jQuery('#newIdeaForm').serialize()
    jQuery.ajax({
        type: 'POST',
        url: myAjax.ajaxurl,
        data: data2 + '&action=savedata',
        success: function() {
            .....
    
        }
    });
    

    现在您可以使用$_POST['fieldName'] 访问name 的所有表单

    【讨论】:

    • 请看我上面的帖子,因为这有点误导,并促进了使您的 Wordpress 安装易受攻击的不良做法。
    • @Ohgodwhy 我的回答中没有任何内容与 wordpress 有任何关系,只是清理客户端代码。客户不了解wordpress
    • 我不同意,这直接促进了这一点,因为您没有传入action 参数,这表明您没有在functions.php 文件中使用add_action(),这意味着您将其直接发送到您自己的文件并绕过 Wordpress 核心。也就是说,正如我之前所说的那样,既误导又提倡不良做法。
    • @Ohgodwhy 你是什么意思...当然有一个action 参数在我的代码中的数据
    • 哎呀,你是对的,我错了。无论如何,我会把我的 cmets 留在这里。
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多