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
相关产品推荐
相关产品推荐

