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

如何让指定PHP函数在Cron Job或REST API更新WooCommerce产品时执行?

实现WooCommerce产品标签随库存自动同步:覆盖后台/REST API/Cron场景

原代码仅在后台手动更新产品时触发标签同步,要支持Cron更新自定义_stock2元字段、REST API更新基础库存的场景,只需新增两个钩子触发逻辑,同时复用原有标签处理函数即可。

完整修改代码

// 保留原后台手动更新的触发钩子
add_action('woocommerce_admin_process_product_object', 'update_product_tag_on_stock_change');
// 新增REST API更新产品时的触发钩子
add_action('woocommerce_rest_insert_product_object', 'update_product_tag_on_stock_change', 10, 2);
// 新增Cron更新_stock2元字段时的触发钩子
add_action('updated_post_meta', 'trigger_tag_update_on_stock2_change', 10, 4);

/**
 * 根据库存(含_stock2)自动添加/移除产品标签的核心逻辑
 * @param WC_Product $product WooCommerce产品对象
 */
function update_product_tag_on_stock_change($product) {
    // Debugging: 记录函数调用日志
    error_log('Function update_product_tag_on_stock_change called.');

    if ($product->is_type('variable')) {
        $variations = $product->get_children();

        $total_stock_quantity = 0;
        $total_stock_quantity2 = 0;

        foreach ($variations as $variation_id) {
            $variation = wc_get_product($variation_id);
            $total_stock_quantity += intval($variation->get_stock_quantity()) - intval($variation->get_meta('_stock2'));
            $total_stock_quantity2 += intval($variation->get_meta('_stock2'));
        }

        // Debugging: 记录库存计算结果
        error_log('Total Stock Quantity: ' . $total_stock_quantity);
        error_log('Total Stock Quantity2: ' . $total_stock_quantity2);

        if ($total_stock_quantity2 > 0 && $total_stock_quantity < 2) {
            wp_set_object_terms($product->get_id(), '3-5dni', 'product_tag', true);
            error_log('Tag set to 3-5dni');
        } else {
            wp_remove_object_terms($product->get_id(), '3-5dni', 'product_tag', true);
            error_log('Tag removed from 3-5dni');
        }
    } else {
        $stock_quantity = intval($product->get_stock_quantity()) - intval($product->get_meta('_stock2'));
        $stock_quantity2 = intval($product->get_meta('_stock2'));

        // Debugging: 记录库存计算结果
        error_log('Stock Quantity: ' . $stock_quantity);
        error_log('Stock Quantity2: ' . $stock_quantity2);

        if ($stock_quantity2 > 0 && $stock_quantity < 2) {
            wp_set_object_terms($product->get_id(), '3-5dni', 'product_tag', true);
            error_log('Tag set to 3-5dni');
        } else {
            wp_remove_object_terms($product->get_id(), '3-5dni', 'product_tag', true);
            error_log('Tag removed from 3-5dni');
        }
    }
}

/**
 * 当_stock2元字段被更新时,触发标签同步逻辑
 * @param int $meta_id 元数据ID
 * @param int $post_id 产品ID
 * @param string $meta_key 元键
 * @param mixed $meta_value 新的元值
 */
function trigger_tag_update_on_stock2_change($meta_id, $post_id, $meta_key, $meta_value) {
    // 仅处理产品类型的post,且更新的是_stock2元字段
    if ($meta_key === '_stock2' && get_post_type($post_id) === 'product') {
        $product = wc_get_product($post_id);
        if ($product) {
            update_product_tag_on_stock_change($product);
        }
    }
}

关键钩子说明

  • woocommerce_admin_process_product_object:保留原有逻辑,处理后台手动编辑产品的场景。
  • woocommerce_rest_insert_product_object:WooCommerce REST API创建或更新产品时触发,覆盖API修改基础库存的场景。
  • updated_post_meta:当任意post的元字段被更新时触发,这里通过判断元键为_stock2且是产品类型,来处理Cron任务修改_stock2的场景。

调试说明

原代码中的error_log日志可以帮助你验证函数是否被正确触发,你可以通过服务器的PHP错误日志查看这些记录,确认逻辑执行情况。

内容的提问来源于stack exchange,提问作者Eryk Paśnik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:38:16