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

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') 
                    );   
                }
            }
        }
    }
}

额外优化说明

  1. 使用get_posts()替代WP_Query并指定fields => 'ids',减少数据库查询返回的数据量,提升执行效率。
  2. 增加is_wp_error($produkt_kat)判断,避免分类获取失败时的错误。
  3. 添加!empty($to)判断,确保只有收件人存在时才执行状态切换和邮件发送,避免错误。
  4. 用isset()检查low_stock_amount,避免未设置阈值时的逻辑错误。

内容的提问来源于stack exchange,提问作者Kasper Ancher Pedersen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:10:36