如何让指定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
相关产品推荐
相关产品推荐

