当前位置: 首页 > 知识库问答 >
问题:

在WooCommerce订单接收页面中通过AJAX更新订单状态

云曦之
2023-03-14

当客户通过Ajax单击thank you页面上的一个按钮时,我正在尝试将woocommerce订单的状态从processing更改为completed。

我的代码如下:

$.ajax({
    type: 'post',
    dataType: 'json',
    url: ajax_url,
    data: {action: 'redeem_complete'},
    success: function(response){
        alert("Order data successfully fetched.");                      
    }
});

和我的functions.php中的php

add_action( 'wp_ajax_redeem_complete', 'fairbooks_redeem_complete');
add_action( 'wp_ajax_nopriv_redeem_complete', 'fairbooks_redeem_complete');

function fairbooks_redeem_complete($order_id){
        
    $order = wc_get_order( $order_id ); 
    $order->update_status( 'completed' );
    echo 'test';
    die();
}

我知道ajax在没有$order->update_status('completed');语句的情况下可以正常工作,但使用它,我会得到一个500内部服务器错误。我还知道,如果我不使用ajax并将其挂到thank you页面中,那么它就会毫无问题地更改状态。是什么导致了这个错误,或者有没有更好的方法来解决这个问题。提前道谢!

共有1个答案

艾俊悟
2023-03-14

您需要将订单Id从javascript代码传递给PHP,因为它没有在PHP WordPress Ajax接收器函数中定义,因此在使用update_status()方法时,由于$order变量没有定义,所以通常会得到错误500,并抛出错误。

下面的完整示例基于您的代码(并且工作时没有错误):

add_action( 'woocommerce_thankyou', 'customer_completes_order_thankyou' );
function customer_completes_order_thankyou( $order_id ) {
    $order = wc_get_order( $order_id );
     // print_r($order->get_status()); // Uncomment for testing
    ?>
    <div><button class="button alt complete-status"><?php _e("Complete your order"); ?></button><br><br>
    <span class="response" style="color:green;"></span></div>
    <script type="text/javascript">
    jQuery(function($){
        if (typeof woocommerce_params === 'undefined')
            return false;

        $('button.complete-status').click( function(e){
            e.preventDefault();

            $.ajax({
                type: 'POST',
                dataType: 'json',
                url: woocommerce_params.ajax_url,
                data: {
                    'action': 'redeem_complete',
                    'order_id': <?php echo $order_id; ?>, // Here we send the order Id
                },
                success: function (response) {
                    $('.response').text("Order data successfully fetched.");
                    console.log("Order data successfully fetched.");
                }
            });
        });
    });
    </script>
    <?php
}

add_action( 'wp_ajax_redeem_complete', 'fairbooks_redeem_complete');
add_action( 'wp_ajax_nopriv_redeem_complete', 'fairbooks_redeem_complete');
function fairbooks_redeem_complete(){
    if ( isset($_POST['order_id']) && $_POST['order_id'] > 0 ) {
        $order = wc_get_order($_POST['order_id']);
        $order->update_status('completed');
        die();
    }
}

代码放在您的活动子主题(或活动主题)的functions.php文件中。经过测试并起作用。

 类似资料:
  • 我将从我的WoocCommerce商店定制感谢页面。为此,我加了一句布兰科谢谢。php进入WooCommerce签出目录。 我试过这个密码 但是变量$order\u id为空。 有人知道我是如何在感谢页面上获得订单标识的吗?

  • 接收订单状态回调 说明 当订单状态发生改变时,滴滴出行会通过回调服务将这些事件通知接入方。使用此功能需开启回调服务,关于如何设置接收消息请见回调服务配置。 当接入方收到回调后,需要重新调用订单详情接口,拉取最新的订单状态和信息,然后做相应处理 支持场景 订单中间状态流转 司机接单(等待接驾) 改派中 乘客迟到 乘客迟到计费 司机迟到 司机到达 计费中(行程中) 订单终态通知 正常

  • 如何根据订单的发货方式自定义订单感谢页面?因此,例如,如果客户使用请求交付选项,感谢页面将显示不同的标题。

  • 在WooCommerce中,当订单处于处理状态时,我希望在“我的帐户”页面上显示一个操作按钮,允许客户通过更改订单状态以完成来确认订单已经到达。 我已经看到允许客户通过电子邮件相关的问题代码改变订单的状态(没有答案),这并没有真正帮助实现我的目标。 客户是否可以通过将订单状态更改为“已完成”来确认订单是否已到达?

  • 问题内容: 我是WooCommerce的新手,我想自定义管理订单列表页面。所以基本上我创建了新产品类型。现在,我还限制了客户一次可以购买我的自定义产品类型的产品或简单产品类型的产品。 现在在管理订单列表页面中,我想显示具有简单产品类型产品的订单。我该怎么做? 我进行了很多搜索,发现了一个具有过滤器的插件,可以按产品而不是产品类型显示订单。在研究该插件时,我知道可能可以使用操作来完成此操作。但是我没

  • 上次WooCommerce更新后,订单详细信息不再显示在感谢页面上。从那时起,我使用WooCommerce Storefront主题开发了一个儿童主题。不管我做了什么,我看到的只是感谢页面上的“谢谢”信息。 到目前为止我所尝试的: > 对整个进程进行故障排除,以查找任何可能出错的问题。这包括以下内容: 检查了调用order-details模板和it相关操作挂钩的wc模板函数(均存在) 确保我的Ch