订单状态完成后,更改产品类别

时间:2016-08-29 06:17:12

标签: php wordpress woocommerce product orders

一旦订单状态在WooCommerce中“完成”,我想将新类别应用于产品。假设产品在(类别A),我想在订单状态“已完成”时应用(类别B)。

有没有办法做到这一点?

我找到了几个教程,但不知道如何将它们组合起来:

https://wordpress.org/support/topic/automatically-add-posts-to-a-category-conditionally

https://wordpress.org/support/topic/woocommerce-on-order-complete-insert-quantity-data-into-custom-database-table

我怎样才能做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:2)

已更新 (与WooCommerce 3 +的兼容性)

  

如果您想更改产品的woocommerce类别,您应该使用wp_set_object_terms()原生WordPress功能,该功能接受类别ID或带有'product_cat'分类参数的slug 'category'

woocommerce_order_status_completed 挂钩经常用于在订单更改为状态时触发回调函数。

这是代码:

add_action('woocommerce_order_status_completed', 'add_category_to_order_items_on_competed_status' 10, 1);

function add_category_to_order_items_on_competed_status( $order_id ) {

    // set your category ID or slug
    $your_category = 'my-category-slug'; // or $your_category = 123; 

    $order = wc_get_order( $order_id );

    foreach ( $order->get_items() as $item_id => $product_item ) {
        // compatibility with WC +3
        if ( version_compare( WC_VERSION, '3.0', '<' ) ) 
            $product_id = $product_item['product_id'];
        else
            $product_id = $product_item->get_product_id();

        wp_set_object_terms( $product_id, $your_category, 'product_cat' );
    }
}

或者你也可以使用 woocommerce_order_status_changed 钩子来条件函数来过滤订单“已完成”状态:

add_action('woocommerce_order_status_changed', 'add_category_to_order_items_on_competed_status' 10, 1);

function add_category_to_order_items_on_competed_status( $order_id ) {

    // set your category ID or slug
    $your_category = 'my-category-slug'; // or $your_category = 123; 

    $order = wc_get_order( $order_id );
    $order_status =  $order->post->post_status;

    if ( $order->has_status( 'completed' ) ) {
        foreach ( $order->get_items() as $item_id => $product_item ) {
            // compatibility with WC +3
            if ( version_compare( WC_VERSION, '3.0', '<' ) ) 
                $product_id = $product_item['product_id'];
            else
                $product_id = $product_item->get_product_id();

            wp_set_object_terms( $product_id, $your_category, 'product_cat' );
        }
    }
}

此代码位于您的活动子主题或主题的function.php文件中。

此代码经过测试且功能齐全。

答案 1 :(得分:0)

如果您想在订单完成后执行任何操作,则必须使用woocommerce_order_status_completed操作,并添加必须使用的类别wp_set_object_terms。所以在你的情况下,这个功能应该有用。

function add_cat_product($order_id) {
    $post_categories = array(); //Array of category IDs.
    $append = FALSE; // If true, categories will be appended to the post. If false, categories will replace existing categories.
    $order = new WC_Order( $order_id );
    $items = $order->get_items();
    foreach ( $items as $item ) {
        //$product_name = $item['name'];
        $product_id = $item['product_id'];
        $term_taxonomy_ids = wp_set_object_terms( $product_id, $post_categories, 'product_cat', $append);
        if ( is_wp_error( $term_taxonomy_ids ) ) {
            // There was an error somewhere and the terms couldn't be set.
        } else {
            // Success! The post's categories were set.
        }
    }
}
add_action( 'woocommerce_order_status_completed', 'add_cat_product' );