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

WooCommerce交叉销售双向自动同步失效,现有代码无法实现需求

解决WooCommerce交叉销售双向同步问题

你的现有代码仅实现了添加交叉销售时的单向同步,完全未处理「移除交叉销售」的场景,且依赖save_post_product钩子无法获取更新前的交叉销售数据,导致无法检测列表的变化。以下是完整的修正代码,同时支持添加/移除操作的双向自动同步:

add_action('woocommerce_update_product', 'sync_cross_sells_bidirectionally', 10, 2);

function sync_cross_sells_bidirectionally($product_id, $product) {
    // 静态变量防止无限循环
    static $processing = false;
    if ($processing) return;
    $processing = true;

    // 获取更新前的交叉销售ID列表
    $old_cross_sells = get_post_meta($product_id, '_crosssell_ids', true);
    $old_cross_sells = is_array($old_cross_sells) ? $old_cross_sells : [];

    // 获取更新后的交叉销售ID列表
    $new_cross_sells = $product->get_cross_sell_ids();
    $new_cross_sells = is_array($new_cross_sells) ? $new_cross_sells : [];

    // 找出新增的交叉销售产品(新列表有,旧列表没有)
    $added_ids = array_diff($new_cross_sells, $old_cross_sells);
    // 找出移除的交叉销售产品(旧列表有,新列表没有)
    $removed_ids = array_diff($old_cross_sells, $new_cross_sells);

    // 处理新增的产品:将当前产品添加到它们的交叉销售列表
    foreach ($added_ids as $target_id) {
        if (!wc_get_product($target_id)) continue;

        $target_cross_sells = get_post_meta($target_id, '_crosssell_ids', true);
        $target_cross_sells = is_array($target_cross_sells) ? $target_cross_sells : [];

        if (!in_array($product_id, $target_cross_sells)) {
            $target_cross_sells[] = $product_id;
            update_post_meta($target_id, '_crosssell_ids', $target_cross_sells);
        }
    }

    // 处理移除的产品:将当前产品从它们的交叉销售列表中删除
    foreach ($removed_ids as $target_id) {
        if (!wc_get_product($target_id)) continue;

        $target_cross_sells = get_post_meta($target_id, '_crosssell_ids', true);
        $target_cross_sells = is_array($target_cross_sells) ? $target_cross_sells : [];

        $key = array_search($product_id, $target_cross_sells);
        if ($key !== false) {
            unset($target_cross_sells[$key]);
            // 重新索引数组,避免WooCommerce读取异常
            $target_cross_sells = array_values($target_cross_sells);
            update_post_meta($target_id, '_crosssell_ids', $target_cross_sells);
        }
    }

    $processing = false;
}

关键改进说明:

  1. 使用专属钩子:替换save_post_product为woocommerce_update_product,这是WooCommerce官方提供的产品更新钩子,能直接获取更新前后的产品数据,精准检测交叉销售列表的变化。
  2. 对比新旧数据:通过array_diff找出新增和移除的产品ID,针对性处理两种场景,而不是盲目遍历当前列表。
  3. 更可靠的循环防护:用静态变量$processing替代transient,避免缓存失效或多环境下的异常,同时确保同一请求内不会重复触发钩子。
  4. 兼容WooCommerce数据格式:处理完移除操作后重新索引数组,避免因为数组键值不连续导致WooCommerce后台读取交叉销售列表时出现异常。
  5. 产品有效性校验:使用wc_get_product替代get_post,更贴合WooCommerce的产品校验逻辑,避免无效ID的处理。

内容的提问来源于stack exchange,提问作者Jeriss Cloud Center

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:47:06