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

WooCommerce订单拆分代码无效果,如何排查问题?

WooCommerce订单拆分代码无效果的排查方案

问题背景

修改了代码用于拆分带有stock商品标签的WooCommerce订单,将对应商品移至新订单。测试无报错但订单无变化,使用WPCodeBox运行,配置为:运行方式Always (On Page Load)、钩子/优先级Root (Default)、代码顺序10、运行范围Everywhere。

排查步骤

1. 修正钩子绑定配置(核心问题)

woocommerce_checkout_order_processed是结账完成后触发的动作钩子,你的WPCodeBox配置完全错误:

  • 把运行方式从"Always (On Page Load)"改成**"Action Hook"**
  • 指定钩子名称为woocommerce_checkout_order_processed,优先级保持10
  • 页面加载时不存在订单对象,原配置导致代码根本不会在正确时机执行

2. 验证代码是否被触发

在函数开头添加日志代码,确认代码是否执行:

add_action( 'woocommerce_checkout_order_processed', 'action_woocommerce_checkout_order_processed', 10, 3 );
function action_woocommerce_checkout_order_processed( $order_id, $posted_data, $order ) {
    // 新增日志:验证代码是否触发
    error_log('订单拆分代码触发,订单ID:'.$order_id);
    // 原代码内容...
}

完成一次前台结账流程后,查看wp-content/debug.log(需开启WP_DEBUG)或服务器PHP错误日志,看是否有这条记录。如果没有,检查:

  • WPCodeBox的代码是否启用
  • 运行范围是否包含结账页面(不要排除checkout相关页面)
  • 临时把代码放到主题functions.php里测试,排除插件配置问题

3. 确认商品标签匹配正确

has_term('stock', 'product_tag', $product)匹配的是商品标签的slug,不是标签名称:

  • 登录后台查看目标商品的标签,确认slug是stock(不是中文名称或其他自定义slug)
  • 新增日志验证标签:
// 在has_term判断前添加
$product_tags = wp_get_post_terms($product->get_id(), 'product_tag', ['fields' => 'slugs']);
error_log('商品ID '.$product->get_id().' 的标签slug:'.implode(',', $product_tags));

查看日志确认目标商品是否包含stock标签

4. 修复代码逻辑问题

原代码存在几个潜在问题:

  • 用$item['quantity']获取数量,换成WooCommerce推荐的方法:$item->get_quantity()
  • 创建新订单时未判断是否成功,添加失败日志:
$stock_order = wc_create_order();
if ( !$stock_order ) {
    error_log('创建新订单失败,原订单ID:'.$order_id);
    continue;
}
  • 移除订单项后,确保原订单的计算和保存逻辑正确

5. 确认测试场景正确

  • 必须走前台完整结账流程(哪怕用测试支付方式,比如COD),后台手动创建订单不会触发woocommerce_checkout_order_processed钩子
  • 开启WooCommerce调试模式:在wp-config.php中添加
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

所有错误和日志都会写入wp-content/debug.log,方便排查

修正后的示例代码

add_action( 'woocommerce_checkout_order_processed', 'action_woocommerce_checkout_order_processed', 10, 3 );

function action_woocommerce_checkout_order_processed( $order_id, $posted_data, $order ) {
    error_log('订单拆分代码触发,订单ID:'.$order_id);
    $check_for_stock = false;
    $taxonomy = 'product_tag';

    foreach ( $order->get_items() as $item_key => $item ) {
        $product = $item->get_product();
        $product_tags = wp_get_post_terms($product->get_id(), 'product_tag', ['fields' => 'slugs']);
        error_log('商品ID '.$product->get_id().' 的标签slug:'.implode(',', $product_tags));

        if ( has_term( 'stock', $taxonomy, $product ) ) {
            error_log('匹配到stock标签,商品ID:'.$product->get_id());
            if ( !$check_for_stock ) {
                $check_for_stock = true;
                $stock_order = wc_create_order();
                if ( !$stock_order ) {
                    error_log('创建新订单失败,原订单ID:'.$order_id);
                    continue;
                }
            }

            $stock_order->add_product( $product, $item->get_quantity() );
            $order->remove_item( $item->get_id() );
        }
    }

    if ( $check_for_stock ) {
        $order->calculate_totals();
        $order->save();
        error_log('原订单已更新,ID:'.$order_id);
        
        $address = array(
            'first_name' => $order->get_billing_first_name(),
            'last_name'  => $order->get_billing_last_name(),
            'email'      => $order->get_billing_email(),
            'phone'      => $order->get_billing_phone(),
            'address_1'  => $order->get_billing_address_1(),
            'address_2'  => $order->get_billing_address_2(),
            'city'       => $order->get_billing_city(),
            'state'      => $order->get_billing_state(),
            'postcode'   => $order->get_billing_postcode(),
            'country'    => $order->get_billing_country()
        );

        $shipping = array(
            'first_name' => $order->get_shipping_first_name(),
            'last_name'  => $order->get_shipping_last_name(),
            'address_1'  => $order->get_shipping_address_1(),
            'address_2'  => $order->get_shipping_address_2(),
            'city'       => $order->get_shipping_city(),
            'state'      => $order->get_shipping_state(),
            'postcode'   => $order->get_shipping_postcode(),
            'country'    => $order->get_shipping_country()
        );
        
        $currency = $order->get_currency();
        $payment_gateway = $order->get_payment_method();
        
        $stock_order->set_address( $address, 'billing' );
        $stock_order->set_address( $shipping, 'shipping' );
        $stock_order->set_currency( $currency );
        $stock_order->set_payment_method( $payment_gateway );
        $stock_order->calculate_totals();
        $stock_order->add_order_note( 'Automated "stock" order. Created from the original order ID: ' . $order_id );
        $stock_order->update_status( 'on-hold' );
        $stock_order->save();
        error_log('新订单已创建,ID:'.$stock_order->get_id());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:05:26