wordpress 在WooCommerce特定订单状态更改时以编程方式添加免费产品

oalqel3c  于 12个月前  发布在  WordPress
关注(0)|答案(2)|浏览(155)

我试图添加一个行项目时,我在后台更新订单,它匹配的状态更新“查询”,但没有项目被添加。
我尝试了get_statushas_status,但我不能让它工作。任何想法,为什么这是不工作?
代码:

add_action( 'woocommerce_order_status_changed', 'add_free_products', 20, 4 );
function add_free_products( $order_id, $order ){
 if ( ! $order_id )
        return;

    // Getting an instance of the order object
    $order = wc_get_order( $order_id );

    if( $order->get_status() == 'enquiry' ) {
       $product_id = '155185';
        $product = wc_get_product( $product_id );
        $order->add_product( $product);
        $order->save();
    }
}

字符串

6tqwzwtp

6tqwzwtp1#

有一些错误和遗漏的东西,使用以下代替:

add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
    if ( "enquiry" === $new_status ) {
        $product_id = '155185';
        $product = wc_get_product( $product_id );
        $order->add_product( $product );
        $order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
        // $order->save();
    }
}

字符串
代码放在活动子主题(或活动主题)的functions.php文件中。测试并工作。

添加1

您还可以使用自定义Meta数据标记此操作以避免在多次更改订单状态时添加多个产品,如下所示:

add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
    if ( "enquiry" === $new_status && ! $order->get_meta('_free_product_added') ) {
        $product_id = '155185';
        $product = wc_get_product( $product_id );
        $order->add_product( $product );
        $order->update_meta_data('_free_product_added', 'yes'); // Flag the order
        $order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
    }
}


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

添加2-检查产品是否已添加到订单 (避免多次添加产品)

function order_has_specific_product( $product_id, $order ) {
    // Loop through order items to check if a product is on the current order
    foreach ( $order->get_items() as $item ) {
        if ( in_array( $product_id, array($item->get_product_id(), $item->get_variation_id()) ) ) {
            return true;
        }
    }
    return false;
}

add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
    $product_id = '155185'; // Free product to be added only once

    if ( "enquiry" === $new_status && ! order_has_specific_product( $product_id, $order ) ) {
        $product = wc_get_product( $product_id );
        $order->add_product( $product );
        $order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
    }
}


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

rjjhvcjd

rjjhvcjd2#

对于自定义订单状态,您可以使用woocommerce_order_status_' . $status_transition['to']操作钩子,在此将$status_transition[to]替换为enquiry
所以你得到:

function action_woocommerce_order_status_enquiry( $order_id, $order ) {
    // Product ID
    $product_id = 155185;
    
    // Get product
    $product = wc_get_product( $product_id );
    
    // Add an order line item + quantity
    $order->add_product( $product, 1 );
    
    // Calculate totals and SAVE order data
    $order->calculate_totals();
}
add_action( 'woocommerce_order_status_enquiry', 'action_woocommerce_order_status_enquiry', 10, 2 );

字符串

相关问题