如果设置了产品自定义字段,则更新 WooCommerce 订单状态

Update WooCommerce order status if product custom field is set

我需要在收到新订单时自动设置特定的订单状态(不同于处理中)。

这是通过这个函数实现的:

add_action('woocommerce_thankyou','change_order_status');

function change_order_status( $order_id ) { 
 
    if ( ! $order_id ) { return; }  
        
    $order = wc_get_order( $order_id );
        
    if( 'processing'== $order->get_status() ) {
        $order->update_status( 'wc-custom-status' );
    }   
}

这完全有效。现在我只需要在产品有定制时发生这种情况。


自定义产品的方法是在添加到购物车之前填写输入字段。输入附加到项目数据:

// Add custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $product_id ){
    if( isset($_POST['custom_text']) ) {
        $cart_item_data['custom_text'] = sanitize_text_field( $_POST['custom_text'] );
        $cart_item_data['unique_key'] = md5( microtime().rand() ); // Make each item unique
    }
    return $cart_item_data;
}

然后使用以下方法检索自定义文本并显示在购物车和订单数据中:

// Display custom cart item data on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_item_data, $cart_item ) {
    if ( !empty( $cart_item['custom_text'] ) ){
        $cart_item_data[] = array(
        'name' => __('Customization', 'woocommerce'),
        'value' => $cart_item['custom_text'] // Already sanitized field
    );
    }
    return $cart_item_data;
}

// Save and display custom item data everywhere on orders and email notifications
add_action( 'woocommerce_checkout_create_order_line_item', 'add_product_custom_field_as_order_item_meta', 10, 4 );

function add_product_custom_field_as_order_item_meta( $item, $cart_item_key, $values, $order ) {

    if ( isset($values['custom_text']) ) {
    $item->update_meta_data('Add on', $values['custom_text'] );
    }

}

我正在尝试使用 if ( isset($values['custom_text']) ) 部分作为功能的触发器,仅在设置了产品附加组件和其他类似方法(如 if ( !empty( $cart_item['custom_text'] ) ) 时才更改订单状态,但我'我不确定这是要走的路:

add_action('woocommerce_thankyou','change_order_status');
function change_order_status( $order_id ) {  
    if ( ! $order_id ) {return;}  
    
    $order = wc_get_order( $order_id );
    
    if ( isset($values['custom_text']) ) {
    
        if( 'processing'== $order->get_status() ) {
            $order->update_status( 'wc-custom-status' );
        }
        
    }
    
}

以上没有任何作用。我用这种方法接近它了吗?

编辑:我也试过了

add_action('woocommerce_thankyou','change_order_status');   
function change_order_status( $order_id ) {         
    if ( ! $order_id ) {return;}                
    
    $order = wc_get_order( $order_id );                 
    
    foreach ( $order->get_items() as $item_id => $item ) {                      
        $allmeta = $item->get_meta_data();                  
        
        if ( isset($values['custom_text']) ) {                          
            if( 'processing'== $order->get_status() ) {                     
                $order->update_status( 'wc-custom-status' );
            }                           
        }
    }
}

您的代码包含一些不必要的步骤以及一些缺点

  • 例如,woocommerce_add_cart_item_data 钩子包含 3 个参数,而 2

所以你得到:

// Add custom cart item data
function filter_add_cart_item_data( $cart_item_data, $product_id, $variation_id ) { 
    // Isset and NOT empty
    if ( isset ( $_POST[ 'custom_text' ] ) && ! empty ( $_POST[ 'custom_text' ] ) ) {
        $cart_item_data['custom_text'] = sanitize_text_field( $_POST['custom_text'] );
    }
    
    return $cart_item_data; 
}
add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data', 10, 3 );

// Display custom cart item data on cart and checkout
function filter_woocommerce_get_item_data( $cart_data, $cart_item = null ) {
    if ( isset ( $cart_item['custom_text'] ) ) {
        $cart_data[] = array(
            'name'  => __( 'Customization', 'woocommerce' ),
            'value' => $cart_item['custom_text']
        );
    }

    return $cart_data;
}
add_filter( 'woocommerce_get_item_data', 'filter_woocommerce_get_item_data', 10, 2 );

// Add the information as meta data so that it can be seen as part of the order
// Save and display custom item data everywhere on orders and email notifications
function action_woocommerce_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    if ( isset ( $values['custom_text'] ) ) {
        $item->update_meta_data( 'custom_text', $values['custom_text'] );
    }
}
add_action( 'woocommerce_checkout_create_order_line_item', 'action_woocommerce_checkout_create_order_line_item', 10, 4 );

// On thankyou page
function action_woocommerce_thankyou( $order_id ) {
    // Get $order object
    $order = wc_get_order( $order_id );
    
    // Is a WC_Order
    if ( is_a( $order, 'WC_Order' ) ) {
        // Only when the current order status is 'processing'
        if ( $order->get_status() == 'processing' ) {
            // Loop trough
            foreach ( $order->get_items() as $item ) {
                // Get meta
                $value = $item->get_meta( 'custom_text' );

                // NOT empty
                if ( ! empty ( $value ) ) {
                    // Update status (change to desired status)
                    $order->update_status( 'cancelled' );

                    // Stop loop
                    break;
                }
            }
        }
    }
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );

目前只是检查该值是否存在,以便有效地比较它

改变

// NOT empty
if ( ! empty ( $value ) ) {
    // Update status
    $order->update_status( 'cancelled' );

    // Stop loop
    break;
}

// Compare
if ( $value == 'some value' ) ) {
    // Update status
    $order->update_status( 'cancelled' );

    // Stop loop
    break;
}