如何使用AJAX通过点击链接插入记录

时间:2019-09-04 作者:pixelngrain

我正在为WordPress开发一个插件。

寻找解决方案我想在用户单击链接时插入记录(可能是任何CRUD操作order-button

我对Ajax非常陌生,所以很困惑当用户单击产品网格上的订单链接时,应该如何将其添加到自定义表中。

我在Ajax回调函数中设置了所有无法获取链接数据属性的bug,以将其传递给jQuery Ajax方法。

排队脚本

function gs_enqueue_ajax_scripts()
{
    wp_register_script(\'gs_ajax\', GROUP_SHOP_ROOT . \'public/js/orders-ajax.js\', [\'jquery\'], 1.0, true);
    wp_localize_script(\'gs_ajax\', \'ajax_vars\', [
        \'ajax_url\' => admin_url(\'admin-ajax.php\'),
        \'nonce\'    => wp_create_nonce(\'gs_nonce\')
    ]);
    wp_enqueue_script(\'gs_ajax\');
}

add_action(\'wp_enqueue_scripts\', \'gs_enqueue_ajax_scripts\');
Ajax操作和回调函数我已经尝试过传递静态数据并获取控制台输出。否则,它会给出null,因为它没有考虑将数据直接设置到AJAX数据参数中
How can I get data dynamically in callback function from the clicked anchor tag?

add_action(\'wp_ajax_gs_order\', \'gs_ajax_callback\');
add_action(\'wp_ajax_nopriv_gs_order\', \'gs_ajax_callback\');

function gs_ajax_callback()
{
    /**
     * I have set statically to check if it works
     * Of course, this is working since it is static
     * BUT I WANT DATA HERE DYNAMICALLY TO PASS IN AJAX
     */
    /*$data = [
        \'product_groups\' => 1,
        \'products\' => 5
    ];*/

    /*echo json_encode($data);*/

    // run the query to add entry
    /*$order = new Group_Shop_Order();
    $order->create_order(194, $products_ids, $product_groups_ids);*/

    wp_die();
}
HTML-产品网格项
<li class="gs-p-item">
    <div class="gs-p-item-container">
        <p class="gs-p-name">
            <a href="http://to-product-page" title="Id adipisci dolores dicta">Id adipisci dolores dicta</a>
        </p>
        <p class="gs-p-price">38.90</p>
        <a class="gs-button order-button et_pb_button" data-pid="168" href="javascript:void(0)" id="gs-p-168">Order</a>
    </div>
</li>
Javascript数据参数正在返回null 价值

var $button = $(\'.order-button\');
console.log(ajax_vars);
$button.attr(\'href\', \'javascript:void(0)\');

$button.on(\'click\', function () {

    $.ajax({
        type: "POST",
        url: ajax_vars.ajax_url,
        data: {
            action: \'gs_order\',
            nonce_data: ajax_vars.nonce,
            product_groups: $(this).data("pgid"),
            products: $(this).data("pid")
        },
        dataType: \'JSON\',
        success: function (data) {
            $(\'#response\').html(data);
            console.log(data);
        },
        error: function (data) {
            $(\'#response\').html(data);
            console.log("Error is there"); //error
        }
    }); // ajax end

}); // on button click
控制台输出
Object
    ajax_url: "http://wpdev.org/wp-admin/admin-ajax.php"
    nonce: "34cb70d514"
    __proto__: Object


null

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

如果这是您对AJAX帖子的请求数据:

data: {
    action: \'gs_order\',
    nonce_data: ajax_vars.nonce,
    product_groups: $(this).data("pgid"),
    products: $(this).data("pid")
},
然后您访问product_groupsproducts 像这样:

$data = [
    \'product_groups\' => $_POST[\'product_groups\'],
    \'products\'       => $_POST[\'products\'],
];
只需确保根据需要对数据进行清理和转义即可。如果它们是身份证,你可以用absint():

$data = [
    \'product_groups\' => absint( $_POST[\'product_groups\'] ),
    \'products\'       => absint( $_POST[\'products\'] ),
];
要验证nonce,请使用:

check_ajax_referer( \'gs_nonce\', \'nonce_data\' );
总之:

function gs_ajax_callback()
{
    check_ajax_referer( \'gs_nonce\', \'nonce_data\' );

    $data = [
        \'product_groups\' => absint( $_POST[\'product_groups\'] ),
        \'products\'       => absint( $_POST[\'products\'] ),
    ];

    $order = new Group_Shop_Order();
    $order->create_order( 194, $data[\'products\'], $data[\'product_groups\'] );

    wp_die();
}
PS:我不知道是什么Group_Shop_Order 或者它是如何工作的,所以我不能说$order->create_order() 是正确的。我只是想看看你的代码。

相关推荐

AJAX:从我点击的帖子中加载内容

为什么要加载整个页面的HTML,而不是选定的帖子内容?功能。PHPfunction my_action_callback() { wp_localize_script(\'main_js\', \'ajax_custom\', array( \'ajaxurl\' => admin_url(\'admin-ajax.php\') )); } add_action( \'wp_enqueue_scripts\', \'my_acti