Php 根据Woocommerce 3中的订单状态向配送服务发送订单

Php 根据Woocommerce 3中的订单状态向配送服务发送订单,php,wordpress,if-statement,woocommerce,orders,Php,Wordpress,If Statement,Woocommerce,Orders,我的订单会自动发送到外部送货服务。但当订单的状态发生变化时,它会再次发送到外部交付服务。如何修复它 add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 ); function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){ //

我的订单会自动发送到外部送货服务。但当订单的状态发生变化时,它会再次发送到外部交付服务。如何修复它

add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 );
function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){
    // Only for 'processing' and 'hold-on' order statuses change
    if ( $new_status == 'processing' || $new_status == 'hold-on' ) {
        // Checking if this has already been done avoiding reload
        if (get_post_meta($order_id, 'delivery_order_id', true)) {
            return; // Exit if already processed
        }
    }

    $order_data = $order->get_data();

    // Send data
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://app.example.com/api/index.php?new_order");
    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_POSTFIELDS, $data);
    $result = curl_exec($ch);
    curl_close($ch);

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

    // Output
    if( isset($decoded['result']) && $decoded['result'] == 'success' && isset($decoded['order_id']) && !empty($decoded['order_id']) ){
        update_post_meta( $order_id, 'delivery_order_id', esc_attr( $decoded['order_id'] ) );
    }
}

我认为问题很简单。第一个
IF
语句应该在末尾关闭,以避免重复问题

因此,您的代码将是:

add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 );
function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){
    // Only for 'processing' and 'hold-on' order statuses change
    if ( $new_status == 'processing' || $new_status == 'hold-on' ) {
        // Checking if this has already been done avoiding reload
        $delivery_order_id = get_post_meta($order_id, 'delivery_order_id', true);
        if ( ! empty( $delivery_order_id  ) ) {
            return; // Exit if already processed
        }

        $order_data = $order->get_data();

        // Send data
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://app.example.com/api/index.php?new_order");
        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_POSTFIELDS, $data);
        $result = curl_exec($ch);
        curl_close($ch);

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

        // Output
        if( isset($decoded['result']) && $decoded['result'] == 'success' && isset($decoded['order_id']) && !empty($decoded['order_id']) ){
            update_post_meta( $order_id, 'delivery_order_id', esc_attr( $decoded['order_id'] ) );
        }
    } // <==  <==  <==  <==  Closing bracket HERE
}
add_action('woocommerce_order_status_changed'、'order_stock_reduction_based_on u status',20,4);
功能订单库存减少基于订单状态($order\u id,$old\u status,$new\u status,$order){
//仅用于“处理”和“保留”订单状态更改
如果($new_status=='processing'| |$new_status=='hold on'){
//检查是否已完成此操作以避免重新加载

$delivery\u order\u id=get\u post\u meta($order\u id,'delivery\u order\u id',true);
如果(!空($delivery\u order\u id)){ return;//如果已处理,则退出 } $order_data=$order->get_data(); //发送数据 $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,”https://app.example.com/api/index.php?new_order"); 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_超时,30); 卷曲设置($ch,卷曲设置桩,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$data); $result=curl\u exec($ch); 卷曲关闭($ch); $decoded=(数组)json_decode($result); //输出 如果(isset($decoded['result'])和&$decoded['result']='success'&&isset($decoded['order\u id'])和&!empty($decoded['order\u id'])){
更新发布元数据($order\u id,'delivery\u order\u id',esc\u attr($decoded['order\u id']); }
}//您是否测试过设置post meta字段以存储订单是否已发送到外部配送服务?然后,您可以检查该值,如果该值为真,则返回该值。就像您已经为Exit(如果已处理)所做的一样。是的,此字段有值,但当您在“管理”面板中更改订单的状态时,订单仍会重新发送。当rE提交,此字段被新字段覆盖。您指的是哪个字段?交货\订单\ id