【问题标题】:Update order status based on an external service response in Woocommerce 3根据 Woocommerce 3 中的外部服务响应更新订单状态
【发布时间】:2018-12-12 04:47:01
【问题描述】:

如果外部配送服务状态为“订单完成”,则在 woocommerce 中更新为“已完成”。 如果外送服务状态为“订单取消”,那么在woocommerce中更新为“取消”。

需要“更新订单状态”部分。

function get_order_ids_to_check(){
    global $wpdb;

    return $wpdb->get_col( "
        SELECT p.ID
        FROM {$wpdb->prefix}posts as p
        WHERE p.post_type LIKE 'shop_order'
        AND p.post_status IN ('wc-on-hold','wc-processing')
        AND UNIX_TIMESTAMP(p.post_date) >= (UNIX_TIMESTAMP(NOW()) - 86400)
    " );

    // Get the Orders IDs to check
    $orders_ids = get_order_ids_to_check();

    // Loop through each order Ids
    foreach( $orders_ids as $order_id ){
        // Get the delivery order ID related to your external shipping service
        $delivery_order_id = get_post_meta( $order_id, 'delivery_order_id', true );

        $param['secret']   = "";
        $param['order_id'] = $delivery_order_id;

        foreach ($param as $key => $value) {
            $data .= "&".$key."=".$value;
        }

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://app.example.com/api/index.php?get_status");
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $result = curl_exec($ch);
        curl_close($ch);

        $decoded = (array) json_decode($result);

        // Update order status
        if( isset($decoded['result']) && $decoded['result'] == 'success' && isset($decoded['status']) && !empty($decoded['status']) ){
            // If the received order status from the external delivery service is "Order completed", then change it in woocommerce "Completed"
        }
    }
}

【问题讨论】:

    标签: php wordpress curl woocommerce shipping


    【解决方案1】:

    要更新订单状态,您将使用WC_Order 方法update_status()。
    我已经重新访问了您的代码。请尝试以下操作:

    function get_order_ids_to_check(){
        global $wpdb;
    
        return $wpdb->get_col( "
            SELECT p.ID
            FROM {$wpdb->prefix}posts as p
            WHERE p.post_type LIKE 'shop_order'
            AND p.post_status IN ('wc-on-hold','wc-processing')
            AND UNIX_TIMESTAMP(p.post_date) >= (UNIX_TIMESTAMP(NOW()) - 86400)
        " );
    }
    
    function send_daily_orders_to_delivery(){
    
        // Loop through each order Ids
        foreach( get_order_ids_to_check() as $order_id ){
            // Get an instance of the WC_Order object
            $order  = wc_get_order($order_id); 
    
            $secret = ''; // <== Secret key to be set
    
            $data   = '&secret='.$secret.'&order_id='.get_post_meta( $order_id, 'delivery_order_id', true );
    
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, "https://app.example.com/api/index.php?get_status");
            curl_setopt($ch, CURLOPT_FAILONERROR, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_HEADER, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            $result = curl_exec($ch);
            curl_close($ch);
    
            $decoded = (array) json_decode($result);
    
            // Update order status
            if( isset($decoded['result']) && $decoded['result'] == 'success' && isset($decoded['status']) && ! empty($decoded['status']) ){
                if( $decoded['status'] == "Order Completed" )
                    $order->update_status( 'completed' );
                elseif( $decoded['status'] == "Order Cancelled" )
                    $order->update_status( 'cancelled' );
            }
        }
    }
    

    然后你将使用:

    send_daily_orders_to_delivery();
    

    在调度程序函数或您选择的任何操作挂钩中。

    代码进入活动子主题(或活动主题)的 function.php 文件中。它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2022-10-05
      • 2020-12-10
      • 2021-04-08
      • 2017-05-24
      • 2017-07-16
      • 2017-05-24
      • 2021-12-08
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多