WooCommerce库存联动产品状态Cron任务失效求助
问题排查与修复方案
你的代码存在几个关键错误,导致Cron任务无响应,以下是问题分析和修正后的代码:
核心错误点
- 产品对象调用错误:
get_the_ID()返回的是数字ID,不能直接调用WooCommerce产品方法(如get_manage_stock()),必须先通过wc_get_product()获取产品对象,否则会触发致命错误中断代码执行。 - 变量初始化位置错误:
$lagerstyring在分类循环内重复初始化,若产品属于多个分类,第一个分类未开启库存管理时,后续分类的有效判断会被覆盖,导致逻辑失效。 - 时间函数参数缺失:
current_time()需要指定格式参数(如mysql),否则返回值不符合预期,影响邮件内的时间显示。 - 未处理收件人未定义的情况:若产品无开启库存管理的分类,
$to变量未定义会导致wp_mail()报错,中断代码执行。 - 注释与实际调度频率不符:注释标注“每三分钟执行”但实际用的是
daily,易造成混淆。
修正后的代码
// 调度Cron任务(仅在未调度时执行) if ( ! wp_next_scheduled( 'check_daily_for_change_product_status' ) ) { wp_schedule_event( time(), 'daily', 'check_daily_for_change_product_status' ); } // 绑定任务执行函数 add_action( 'check_daily_for_change_product_status', 'check_daily_for_change_product_status_func' ); function check_daily_for_change_product_status_func() { $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'post_status' => array("publish", "draft"), 'fields' => 'ids' // 仅获取产品ID,优化查询性能 ); $product_ids = get_posts( $args ); if( !empty( $product_ids ) ){ foreach ( $product_ids as $product_id ) { $lagerstyring = false; $to = ''; // 获取产品分类并判断是否启用库存管理 $produkt_kat = get_the_terms( $product_id, 'product_cat' ); if ( $produkt_kat && !is_wp_error($produkt_kat) ) { foreach ($produkt_kat as $kat) { $slaa_til = get_field( "lavt_lager", $kat ); if ($slaa_til) { $lagerstyring = true; $to = get_field("deaktiverings_emails", $kat); break; } } } // 获取WooCommerce产品对象,跳过无效产品 $product = wc_get_product( $product_id ); if ( !$product ) continue; $admin_lager = $product->get_manage_stock(); $low_stock_amount = $product->get_low_stock_amount(); $lager = $product->get_stock_quantity(); $produktnavn = $product->get_name(); $produkturl = get_permalink($product_id); $tidspunkt = current_time('mysql'); // 指定时间格式 // 仅当库存管理开启、分类启用自动切换且收件人存在时执行逻辑 if ($admin_lager && $lagerstyring && !empty($to)) { // 库存低于阈值,设为草稿 if ( isset($low_stock_amount) && $low_stock_amount >= $lager ) { wp_update_post( array( 'ID' => $product_id, 'post_status' => 'draft', ) ); wp_mail( $to, "Vare slået fra", "Denne vare er blevet automatisk slået fra da den har en lav lagerbeholdning: <br /><b>" . $produktnavn . "</b><br />" . $produkturl . "<br />" . $tidspunkt, array('Content-type: text/html') ); } // 库存高于阈值,设为发布(且阈值不为空) elseif ( $lager > $low_stock_amount && isset($low_stock_amount) ) { wp_update_post( array( 'ID' => $product_id, 'post_status' => 'publish', ) ); wp_mail( $to, "Vare slået til", "Denne vare er blevet automatisk udgivet, da dens lagerbeholdning er øget: <br /><b>" . $produktnavn . "</b><br />" . $produkturl . "<br />" . $tidspunkt, array('Content-type: text/html') ); } } } } }
额外优化说明
- 使用
get_posts()替代WP_Query并指定fields => 'ids',减少数据库查询返回的数据量,提升执行效率。 - 增加
is_wp_error($produkt_kat)判断,避免分类获取失败时的错误。 - 添加
!empty($to)判断,确保只有收件人存在时才执行状态切换和邮件发送,避免错误。 - 用
isset()检查low_stock_amount,避免未设置阈值时的逻辑错误。
内容的提问来源于stack exchange,提问作者Kasper Ancher Pedersen
相关产品推荐
相关产品推荐

