WooCommerce产品促销定时启停时自动增减指定分类代码故障求助
WooCommerce促销自动绑定pishnahad分类代码修复方案
现有代码无法运行的核心原因
- 钩子优先级冲突:你当前挂载
woocommerce_scheduled_sales钩子的优先级为默认值10,和WooCommerce原生处理促销状态更新的函数优先级一致,会导致你操作分类时产品的促销状态还未完成更新,逻辑提前执行失效。 - 未适配可变产品场景:如果促销是针对可变产品的子变体设置的,
get_starting_sales和get_ending_sales返回的是子变体ID,而WooCommerce的product_cat分类仅绑定到父级主产品,直接给子变体操作分类不会生效。 - 冗余操作冲突:
wp_set_object_terms和wp_remove_object_terms是直接操作WordPress分类关联表的原生函数,你额外调用的$product->save()属于冗余操作,可能引发缓存更新冲突。 - 分类匹配错误风险:你直接传入分类字符串
pishnahad,如果该值是分类显示名称而非slug别名,或者分类不存在时会直接报错。 - 定时任务依赖:需确认WordPress的wp-cron定时任务正常运行,否则
woocommerce_scheduled_sales钩子本身不会被触发。
修复后可直接使用的代码
function zt_wc_scheduled_sales() { // 校验目标分类是否存在,避免无效操作报错 // 如果pishnahad是分类显示名称,将下方的slug改为name即可 $target_term = get_term_by( 'slug', 'pishnahad', 'product_cat' ); if ( ! $target_term ) { return; } $target_term_id = $target_term->term_id; $data_store = WC_Data_Store::load( 'product' ); // 处理即将启动的促销 $product_ids = $data_store->get_starting_sales(); if ( $product_ids ) { do_action( 'wc_before_products_starting_sales', $product_ids ); foreach ( $product_ids as $product_id ) { $product = wc_get_product( $product_id ); if ( ! $product ) { continue; } // 可变产品子变体取父产品ID操作分类 $operate_id = $product->is_type( 'variation' ) ? $product->get_parent_id() : $product_id; // 追加分类,不覆盖产品原有分类 wp_set_object_terms( $operate_id, $target_term_id, 'product_cat', true ); } do_action( 'wc_after_products_starting_sales', $product_ids ); WC_Cache_Helper::get_transient_version( 'product', true ); delete_transient( 'wc_products_onsale' ); } // 处理即将结束的促销 $product_ids = $data_store->get_ending_sales(); if ( $product_ids ) { do_action( 'wc_before_products_ending_sales', $product_ids ); foreach ( $product_ids as $product_id ) { $product = wc_get_product( $product_id ); if ( ! $product ) { continue; } $operate_id = $product->is_type( 'variation' ) ? $product->get_parent_id() : $product_id; wp_remove_object_terms( $operate_id, $target_term_id, 'product_cat' ); } do_action( 'wc_after_products_ending_sales', $product_ids ); WC_Cache_Helper::get_transient_version( 'product', true ); delete_transient( 'wc_products_onsale' ); } } // 优先级设为20,晚于WooCommerce原生促销状态更新逻辑执行 add_action( 'woocommerce_scheduled_sales', 'zt_wc_scheduled_sales', 20 );
内容的提问来源于stack exchange,提问作者zahra taran
相关产品推荐
相关产品推荐

