如何使用jQuery AJAX在WordPress表格中插入数据

时间:2017-01-18 作者:Arun Kumar

如何在wordpress中使用jquery ajax为我的插件插入数据,我做了很多尝试,但我的操作失败了。php页面无法访问全局$wpdb,请告诉我问题出在哪里。

这是我的插件子菜单页面的代码

<?php
        function pincode()
        {
        ?>   

        <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
        <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
        <script>
        function userAction(type,id){
            id = (typeof id == "undefined")?\'\':id;
            var statusArr = {add:"added",edit:"updated",delete:"deleted"};
            var userData = \'\';
            if (type == \'add\') {
                userData = $("#addForm").find(\'.form\').serialize()+\'&action_type=\'+type+\'&id=\'+id;
            }else if (type == \'edit\'){
                userData = $("#editForm").find(\'.form\').serialize()+\'&action_type=\'+type;
            }else{
                userData = \'action_type=\'+type+\'&id=\'+id;
            }
            $.ajax({
                type: \'POST\',
                //url: \'http://localhost/wordpress/wp-content/plugins/arunkumar/action.php\',
                url : \'<?php echo plugin_dir_url(__FILE__).\'action.php\';?>\',
                data: userData,
                success:function(msg){
                    if(msg == \'ok\'){
                        alert(\'User data has been \'+statusArr[type]+\' successfully.\');
                        //getUsers();
                        $(\'.form\')[0].reset();
                        $(\'.formData\').slideUp();
                    }else{
                        //alert(\'Some problem occurred, please try again.\');
                        $("#error").html(\'<div class="alert alert-danger"> <span class="glyphicon glyphicon-info-sign"></span> &nbsp; \'+msg+\' !</div>\');
                    }
                }
            });
        }
        </script>
                <div class="panel-heading">States <a href="javascript:void(0);" class="glyphicon glyphicon-plus" id="addLink" onclick="javascript:$(\'#addForm\').slideToggle();"></a></div>
                <div class="panel-body none formData" id="addForm">
                    <h2 id="actionLabel">Add New State</h2>
                    <form class="form" id="userForm">
                        <div id="error"></div>
                        <div class="form-group">
                            <label>State Name</label>
                            <input type="text" class="form-control" placeholder="Enter State Name" name="name" id="name"/>
                        </div>

                        <a href="javascript:void(0);" class="btn btn-warning" onclick="$(\'#addForm\').slideUp();">Cancel</a>
                        <a href="javascript:void(0);" class="btn btn-success" onclick="userAction(\'add\')">Add State</a>
                    </form>
                </div>
    <?php
    }
这就是行动。应用了insert代码但显示“致命错误:调用成员函数insert()on null”错误的php代码

    <?php

    if(isset($_POST[\'action_type\']) && !empty($_POST[\'action_type\'])){
        if($_POST[\'action_type\'] == \'add\'){
            //echo $insert?\'ok\':\'err\';
            global $wpdb;
            $state_name = $_POST[\'name\']; 
            $wpdb->insert( \'state\',array( \'state_name\' => $state_n),array(\'%s\') );
            $status = $wpdb->insert_id;
            echo $status ? \'ok\' : var_dump($wpdb);


        }

2 个回复
SO网友:Ravi Shinde

您共享的代码可以在核心PHP中工作,而不能在Wordpress中工作。Wordpress文档中解释了在Wordpress插件中使用AJAX。请参考-https://codex.wordpress.org/AJAX_in_Plugins

我试过这个,效果很好。

SO网友:Pedro Coitinho

看起来拉维·辛德是对的:

您共享的代码可以在核心PHP中工作,而不能在Wordpress中工作。Wordpress文档中解释了在Wordpress插件中使用AJAX。请参考-https://codex.wordpress.org/AJAX_in_Plugins

要让插件访问ajax界面,您需要围绕WordPress的ajax操作进行包装wp_ajax_{action}

首先,您需要定义操作:

add_action( \'wp_ajax_user_action\', \'user_action\' );
add_action( \'wp_ajax_nopriv_user_action\', \'user_action\' );
其中注册了user_action 对于登录用户和未经身份验证的用户,使用wordpress。

然后构建处理函数:

function user_action() {
    // since this gets loaded by wordpress
    // you get access to $wpdb and other
    // core functions
    global $wpdb; 

    $state_name = $_POST[\'name\']; 

    $wpdb->insert( \'state\',array( \'state_name\' => $state_n),array(\'%s\') );
    $status = $wpdb->insert_id;

    echo $status ? \'ok\' : var_dump($wpdb);

    // Ajax calls in WP always need to be closed with wp_die:
    wp_die(); 
}
最后,您需要获取端点的引用(wordpress为所有ajax调用共享一个URL)。在您的JS中:

var ajaxurl = <?php echo admin_url( \'admin-ajax.php\' ); ?>;
注意:注册脚本的“正确”方法是通过enqueue_scripts, 但这超出了我们目前的范围。

然后您可以对ajaxurl 和通过{ action: \'user_action\' } 作为数据。

说实话这不是最好的方式,但你会习惯的。如果您需要初级读物,Smashinmag总是有很棒的文章:

https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/

(另外:我还没有测试过代码,但它非常标准,应该可以开箱即用。让我知道!)

相关推荐

JqueryUi对话框给出未捕获的TypeError:This._addClass不是函数错误

我有一个网站,我们需要一些自定义php编码来连接到外部数据库,以获取几个销售我们产品的供应商的产品评论URL。我们试图实现的基本想法是让用户注册他们的产品,然后如果他们愿意留下评论,就延长保修期。我正在使用XYZScript。com的“插入PHP”插件来实现这一点。该主题最初只加载了jQuery,以避免创建子主题,我们正在php脚本中加载jQueryUI。因此,我们将jQuery加载到文档的标题中,将jQueryUI加载到文档的正文中。我不太确定这是因为加载脚本的顺序造成的,还是其他一些冲突的javasc