根据产品库存数量更改WooCommerce处理订单状态

时间:2019-09-14 19:33:09

标签: php wordpress woocommerce hook-woocommerce orders

我目前正在为WooCommerce订单进行自动状态更改:当产品库存达到50%时,我正在尝试将所有相关的“处理中”订单更改为“ kundenupdate”订单状态。

我正在使用retrieve_orders_ids_from_a_product_id()中的函数this answer thread,查询具有“处理中”状态的订单,并在以下代码中形成产品ID:

function retrieve_orders_ids_from_a_product_id( $product_id ) {
    global $wpdb;

    // Define HERE the orders status for queried orders
    $orders_statuses = "'processing'";

    # Requesting All defined statuses Orders IDs for a defined product ID
    return $wpdb->get_col( "
        SELECT DISTINCT woi.order_id
        FROM {$wpdb->prefix}woocommerce_order_itemmeta as woim, 
             {$wpdb->prefix}woocommerce_order_items as woi, 
             {$wpdb->prefix}posts as p
        WHERE  woi.order_item_id = woim.order_item_id
        AND woi.order_id = p.ID
        AND p.post_status IN ( $orders_statuses )
        AND woim.meta_key IN ( '_product_id', '_variation_id' )
        AND woim.meta_value LIKE '$product_id'
        ORDER BY woi.order_item_id DESC"
    );
}

/**
 * Automated order status changes
 */
add_action('woocommerce_order_status_changed', 'woocommerce_auto_processing_orders');
function woocommerce_auto_processing_orders( $order_id ) {
    if ( ! $order_id )
        return;

    $order = wc_get_order( $order_id );

    $items = $order->get_items();

    foreach ( $items as $item ) {
        //product_id gets tracked automatically
        $product = wc_get_product( $item['product_id'] );
        $product_id = $item->get_product_id();

        $orders_ids_array = retrieve_orders_ids_from_a_product_id( $product_id );

        $stock = $product->get_stock_quantity();

        //If order is "processing".
        foreach ( $orders_ids_array as $order_id_array ) { 
            if( $order_id_array->has_status( 'processing' ) ) {
                if( $stock == 350 ) {
                    $order_id_array->update_status( 'kundenupdate' );
                } elseif( $stock == 140 ) {
                    $order_id_array->update_status('on-hold');
                }
            }
        }
    }
}

如果我仅更改一个订单的代码,它就可以工作。但是,如果我尝试获取特定product_id的所有订单,且所有订单都处于“处理中”状态,则该命令将不起作用。

我也不知道函数retrieve_orders_ids_from_a_product_id()是否正常工作,因为我不知道如何在php中调试它。

如何获取特定product_id的所有订单的正确数组,这些订单均处于“处理中”状态?

1 个答案:

答案 0 :(得分:1)

您的代码中有一些错误和错误:

  • 函数retrieve_orders_ids_from_a_product_id()可以正常工作并提供订单ID数组,但不能提供WC_Order对象数组:例如,在您的代码中,方法{ {1}}不能在非has_status()对象上使用。
  • 当前WC_Order对象已经包含在WC_Order挂钩中,因此函数中缺少该参数。
  • 钩子woocommerce_order_status_changed包含在status_transition()使用的woocommerce_order_status_changed update_status()方法源代码中,因此您不能将其与该钩子一起使用,因为它造成了无限循环。
  • 还有其他一些事情……
  

WooCommerce订单和减少产品库存数量的过程说明:

     

使用wc_maybe_reduce_stock_levels()函数可以降低产品库存状态,该函数钩在这4个挂钩中(在function source code上查看)
  -WC_Order-woocommerce_payment_complete作为参数
  -$order_id-具有woocommerce_order_status_on-hold$order_id作为参数
  -$order-具有woocommerce_order_status_processing$order_id作为参数
  -$order-具有woocommerce_order_status_completed$order_id作为参数

     

按订单减少相关产品的库存量时,将为此订单设置特定的元数据,其中元键 $order 和< strong> meta值为 _order_stock_reduced ,避免多次降低该值。

在下面的代码中,我们将使用这4个钩子。

为避免使用带有这些挂钩(如前所述)的WC_Order 1方法的问题,我们将改用update_status() WordPress函数。

您可以尝试以下操作:

wp_update_post()

代码进入活动子主题(或活动主题)的functions.php文件中。它应该更好地工作。

  

这可能是一个问题:如果产品的库存减少了3(例如,订购商品数量),并跳过了 function get_processing_orders_from_a_product_id( $product_id ) { global $wpdb; # Requesting processing Orders IDs for a defined product ID return $wpdb->get_col( " SELECT DISTINCT woi.order_id FROM {$wpdb->prefix}woocommerce_order_itemmeta as woim, {$wpdb->prefix}woocommerce_order_items as woi, {$wpdb->prefix}posts as p WHERE woi.order_item_id = woim.order_item_id AND woi.order_id = p.ID AND p.post_status = 'wc-processing' AND woim.meta_key IN ( '_product_id', '_variation_id' ) AND woim.meta_value LIKE '$product_id' ORDER BY woi.order_item_id DESC" ); } add_action( 'woocommerce_payment_complete', 'orders_status_change_based_on_product_stock', 10, 2 ); add_action( 'woocommerce_order_status_on-hold', 'orders_status_change_based_on_product_stock', 10, 2 ); add_action( 'woocommerce_order_status_processing', 'orders_status_change_based_on_product_stock', 10, 2 ); add_action( 'woocommerce_order_status_completed', 'orders_status_change_based_on_product_stock', 10, 2 ); function orders_status_change_based_on_product_stock( $order_id, $order = '' ) { if( ! $order || ! is_a( $order, 'WC_Order') ) { $order = wc_get_order( $order_id ); // Get the WC_Order object if it's empty } // Loop Through order items foreach ( $order->get_items() as $item ) { $product = $item->get_product(); // Get the WC_Product object $stock_gty = (int) $product->get_stock_quantity(); // the product stock quantity // Getting the new order status from stock quantity thresholds if ( $stock_gty === 140 ) { $new_status = 'on-hold'; } elseif ( $stock_gty === 350 ) { $new_status = 'kundenupdate'; } // Updating related processing orders status if any stock quantity threshold is reached if( isset($new_status) && $processing_orders = get_processing_orders_from_a_product_id( $item->get_product_id() ) ) { // Loop through all related processing orders (IDs) foreach ( $processing_orders as $processing_order_id ) { // We don't use update_status() WC_Order method to avoid an problems using those hooks wp_update_post( array( 'ID' => $processing_order_id, 'post_status' => $new_status ) ); } } } } ,该怎么办? > (或 350 库存数量阈值?您可能不得不考虑不同。