You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce自定义订单状态下实现商品库存增加

在WooCommerce中自定义订单状态触发库存增加的正确实现

问题描述

我尝试通过PHP在WooCommerce中创建名为wc-compra-proveedor的新订单状态,期望订单切换到该状态时自动增加对应商品的库存,但尝试了两种方案均无效,绑定相关钩子也无法触发库存更新。

尝试过的方案

方案1

function wc_maybe_increase_stock_levels1() {
    if (isset($_GET['action']) && $_GET['action'] === 'mark_compra_proveedor' && isset($_GET['order_id'])) {
        $order_id = intval($_GET['order_id']);
        $order = wc_get_order($order_id);

        if (!$order) {
            return;
        }

        $stock_reduced = $order->get_data_store()->get_stock_reduced($order_id);
        $trigger_increase = (bool) $stock_reduced;

        // Only continue if we're increasing stock.
        if (!$trigger_increase) {
            return;
        }

        wc_increase_stock_levels($order);

        // Ensure stock is not marked as "reduced" anymore.
        $order->get_data_store()->set_stock_reduced($order_id, false);
    }
}
add_action('woocommerce_order_status_mark_compra_proveedor', 'wc_maybe_increase_stock_levels1');

方案2

/**
 * Función para sumar la cantidad de productos de un pedido al inventario cuando se guarda con el estado "wc-compra-proveedor".
 *
 * @param int $order_id El ID del pedido que se guarda.
 */
function sumar_al_inventario_al_guardar_pedido($order_id) {
    // Obtenemos el objeto del pedido
    $order = wc_get_order($order_id);

    // Verificamos si el pedido tiene el estado "wc-compra-proveedor"
    if ($order && $order->get_status() === 'wc-compra-proveedor') {
        // Recorremos los productos en el pedido y ajustamos el inventario
        foreach ($order->get_items() as $item) {
            $product_id = $item->get_product_id();
            $quantity = $item->get_quantity();

            // Obtén la cantidad actual en inventario del producto
            $current_stock = get_post_meta($product_id, '_stock', true);

            // Calcula la nueva cantidad en inventario sumando la cantidad del pedido
            $new_stock = $current_stock + $quantity;

            // Actualiza la cantidad en inventario del producto
            update_post_meta($product_id, '_stock', max(0, $new_stock)); // Aseguramos que no sea negativo
            update_post_meta($product_id, '_manage_stock', 'yes'); // Habilitamos la gestión de inventario
        }
    }
}

// Hook para ejecutar la función al guardar un pedido
add_action('woocommerce_new_order', 'sumar_al_inventario_al_guardar_pedido');

问题分析

  • 方案1:钩子名称错误,且依赖$_GET参数,后台修改订单状态时不会通过GET请求传递参数,因此无法触发逻辑;
  • 方案2:使用woocommerce_new_order钩子仅在订单创建时触发,后续修改状态不会执行,且直接修改_stock元数据未触发WooCommerce内置的库存同步钩子,易导致数据不一致。

正确实现步骤

1. 注册自定义订单状态(若未完成)

// 注册自定义订单状态
function register_compra_proveedor_order_status() {
    register_post_status('wc-compra-proveedor', array(
        'label'                     => 'Compra Proveedor',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop('Compra Proveedor <span class="count">(%s)</span>', 'Compra Proveedor <span class="count">(%s)</span>')
    ));
}
add_action('init', 'register_compra_proveedor_order_status');

// 将自定义状态添加到WooCommerce订单状态列表
function add_compra_proveedor_to_order_statuses($order_statuses) {
    $new_order_statuses = array();
    foreach ($order_statuses as $key => $status) {
        $new_order_statuses[$key] = $status;
        // 在"处理中"状态后插入自定义状态
        if ('wc-processing' === $key) {
            $new_order_statuses['wc-compra-proveedor'] = 'Compra Proveedor';
        }
    }
    return $new_order_statuses;
}
add_filter('wc_order_statuses', 'add_compra_proveedor_to_order_statuses');

2. 绑定状态切换钩子并实现库存增加逻辑

使用woocommerce_order_status_changed钩子(订单状态变更时触发),并调用WooCommerce官方库存函数确保兼容性:

// 订单切换到wc-compra-proveedor状态时增加库存
function increase_stock_on_compra_proveedor_status($order_id, $old_status, $new_status) {
    // 仅处理目标状态切换
    if ($new_status !== 'compra-proveedor') {
        return;
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    // 检查订单是否已减少过库存,避免重复操作
    $stock_reduced = $order->get_data_store()->get_stock_reduced($order_id);
    if (!$stock_reduced) {
        return;
    }

    // 调用官方函数增加库存
    wc_increase_stock_levels($order);

    // 标记库存已恢复,防止重复触发
    $order->get_data_store()->set_stock_reduced($order_id, false);

    // 可选:添加订单备注记录操作
    $order->add_order_note('库存已自动恢复,因订单状态切换为"Compra Proveedor"');
}
add_action('woocommerce_order_status_changed', 'increase_stock_on_compra_proveedor_status', 10, 3);

内容的提问来源于stack exchange,提问作者Pri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:35:25