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

Posted

技术标签:

【中文标题】如果设置了产品自定义字段,则更新 WooCommerce 订单状态【英文标题】:Update WooCommerce order status if product custom field is set 【发布时间】:2022-01-19 11:43:46 【问题描述】:

我需要在获得新订单时自动设置某个订单状态(不同于处理中)。

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

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' );
                                       
        
    

【问题讨论】:

在您的感谢操作中,您必须访问订单项目并检查项目是否具有此值。目前 $values 是什么?如何循环订购商品 - foreach ( $order->get_items() as $item_id => $item ) $allmeta = $item->get_meta_data();获取所有 meta 或 $somemeta = $item->get_meta( '_whatever', true );获取特定的元 - 来源 - businessbloomer.com/… 再说一遍 $values 是什么? 你是对的。我想我意识到有时使用的变量没有在函数中定义(尽管它们在参数中)......无论如何,这是一个很长的镜头,我很感激这个通知。我什至无法提供像 @7uc1f3r 这样的代码,经过一些测试后它可以完美运行。谢谢你们! 【参考方案1】:

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

例如,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;

【讨论】:

以上是关于如果设置了产品自定义字段,则更新 WooCommerce 订单状态的主要内容,如果未能解决你的问题,请参考以下文章

MySQL可以查询自定义字段

WooCommerce 产品供应商 - 更新分类自定义字段

折扣后如果总计为 0,则需要根据自定义价格字段计算税款并添加到购物车页面的总计中

为 woocommerce 产品选项卡上的自定义字段设置优先级

Woocommerce REST API:自定义字段而不是产品名称

Magento - 自定义选项不会更新可配置产品的价格