Increase/adjust WooCommerce 中自定义订单状态的产品库存数量

Increase/adjust product stock quantity for custom order status in WooCommerce

我有一个名为 'cancel-by-admin' 的自定义订单状态,它是在网站管理员出于某种原因取消订单时设置的。

现在我们需要increase/adjust取消订单时的产品库存盘点。 WooCommerce 已经提供了 'cancel' 订单状态,当它被设置时,库存数量会通过现有代码进行调整。我们需要为 'cancel-by-admin' 状态实现相同的功能。

如何实现?我正在使用 Woocommerce 6.3.1。


有人建议使用函数 wc_update_product_stock()。还有这个link:

但我注意到什么是最好的方法。请注意,客户可以在一个订单中订购多个产品,因此当管理员取消订单时,需要调整所有关联的产品数量。

要添加自定义订单状态,我使用以下代码:

add_action( 'init', 'register_custom_order_statuses', 20 );
function register_custom_order_statuses() {
register_post_status( 'wc-cancelled-by-us', array(
        'label'                     => _x( 'CancelledByAdmin', 'Order status', 'woocommerce' ),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'CancelledByAdmin <span class="count">(%s)</span>', 'CancelledByAdmin <span class="count">(%s)</span>', 'woocommerce' )
    ) );
}

我的代码尝试,我可以在其中使用一些关于如何继续的建议:

add_action('woocommerce_order_status_changed', 'func_status_changed', 10, 4 );
function func_status_changed( $order_id, $old_status, $new_status, $order ){
     if ( $new_status == 'cancelled-by-us' ) {
        // Stock update operation goes here
     }
}

为了添加自定义订单状态,我重写了您的代码,因为:

  • init 挂钩已替换为 woocommerce_register_shop_order_post_statuses 以注册自定义订单状态。
  • wc_order_statuses在下拉列表中添加wc_order_statuses显示订单状态@单笔订单
  • 添加
  • bulk_actions-edit-shop_order以在下拉列表中显示订单状态@bulk actions
// Register order status
function filter_woocommerce_register_shop_order_post_statuses( $order_statuses ) {
    // Status must start with "wc-"
    $order_statuses['wc-cancelled-by-us'] = array(
        'label'                     => _x( 'Cancelled by admin', 'Order status', 'woocommerce' ),
        'public'                    => false,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        /* translators: %s: number of orders */
        'label_count'               => _n_noop( 'Cancelled by admin <span class="count">(%s)</span>', 'Cancelled by admin <span class="count">(%s)</span>', 'woocommerce' ),   
    );
    
    return $order_statuses;
}
add_filter( 'woocommerce_register_shop_order_post_statuses', 'filter_woocommerce_register_shop_order_post_statuses', 10, 1 );

// Show order status in the dropdown @ single order
function filter_wc_order_statuses( $order_statuses ) {  
    $new_order_statuses = array();

    // Add new order status after cancel
    foreach ( $order_statuses as $key => $status ) {

        $new_order_statuses[ $key ] = $status;

        if ( 'wc-cancelled' === $key ) {
            // Status must start with "wc-"
            $new_order_statuses['wc-cancelled-by-us'] = _x( 'Cancelled by admin', 'Order status', 'woocommerce' );
        }
    }

    return $new_order_statuses;
}
add_filter( 'wc_order_statuses', 'filter_wc_order_statuses', 10, 1 );

// Show order status in the dropdown @ bulk actions
function filter_bulk_actions_edit_shop_order( $bulk_actions ) {
    // Note: "mark_" must be there instead of "wc"
    $bulk_actions['mark_cancelled-by-us'] = __( 'Cancelled by admin', 'woocommerce' );
    return $bulk_actions;
}
add_filter( 'bulk_actions-edit-shop_order', 'filter_bulk_actions_edit_shop_order', 10, 1 );

要回答您的问题,最好查看现有 'cancel' 订单状态应用了哪些功能,然后重现它。

wc-stock-functions.php中我们可以看到函数wc_maybe_increase_stock_levels()'cancel'状态和'pending' 状态

要重现它,我们可以使用可用于任何自定义订单状态的 woocommerce_order_status_' . $status_transition['to'] 复合挂钩

所以你得到:

// Maybe increase stock levels
add_action( 'woocommerce_order_status_cancelled-by-us', 'wc_maybe_increase_stock_levels' );