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

WP CRON任务未触发回调函数,但手动调用该函数正常运行

问题分析与解决方案

核心原因排查

WordPress的CRON是请求触发式,而非系统级定时任务——只有当网站有前台/后台访问请求时,WP才会检查并执行到期的CRON任务。如果网站长时间无访问,任务会延迟甚至不执行,这是最常见的隐性原因。

代码层面的修复点

  1. 显式声明回调函数的参数接收数量
    你的add_action未指定接受参数的个数,虽默认是1,但显式设置能避免参数传递失败:

    add_action( 'update_product_price_curve', 'bulk_update_product_price_curve', 10, 1 );
    

    最后一个参数1表示回调函数接受1个参数,和调度时传递的$args对应。

  2. 给回调函数添加调试日志
    在回调函数开头写入日志,确认函数是否被触发,同时排查数据库操作错误:

    function bulk_update_product_price_curve( $setup_table_name) {
        // 记录任务启动日志
        error_log('[Price Curve CRON] 任务启动,目标表:' . $setup_table_name);
        
        $args = array(
            'post_type' => 'bons-plans',
            'posts_per_page' => -1,
            'post_status' => 'publish',
        );
        $posts_array = get_posts( $args );
        
        global $wpdb;     
        $table_name = $wpdb->prefix . $setup_table_name;       
        $date = date('Y/d/m');
        
        foreach( $posts_array as $post_array ){
            $price = get_post_meta( $post_array->ID, 'prix-promo', true);
            $wpdb->insert($table_name, array('product_id' => $post_array->ID, 'date' => $date, 'product_price' => $price));
            
            // 检查数据库插入错误
            if ( $wpdb->last_error ) {
                error_log('[Price Curve CRON] 插入失败:' . $wpdb->last_error);
            }
        }
        
        // 记录任务结束日志
        error_log('[Price Curve CRON] 任务结束,处理文章数:' . count($posts_array));
    }
    
  3. 开启WordPress错误日志
    在wp-config.php中添加以下配置,让错误日志写入wp-content/debug.log:

    define('WP_DEBUG', true);
    define('WP_DEBUG_LOG', true);
    define('WP_DEBUG_DISPLAY', false); // 不在前端显示错误,避免影响用户
    
  4. 解决CRON环境下的查询权限问题
    CRON运行时无当前登录用户,部分主题/插件会限制未授权的文章查询。可在get_posts前强制切换到管理员用户:

    wp_set_current_user(1); // 替换为你的管理员用户ID,通常是1
    $posts_array = get_posts( $args );
    

进阶调试与优化

  • 强制触发CRON任务:手动访问http://你的域名/wp-cron.php?doing_wp_cron,立即触发所有到期任务,然后查看debug.log日志。
  • 改用系统级CRON:如果网站访问量低,建议配置服务器系统CRON,定期调用wp-cron.php,比如每1小时执行一次:
    0 * * * * wget -q -O - http://你的域名/wp-cron.php?doing_wp_cron >/dev/null 2>&1
    
  • 检查任务调度参数:用WP Control查看任务的参数是否正确传递,确保$setup_table_name值无误。
  • 排查插件冲突:临时禁用其他插件,切换到默认主题(如Twenty Twenty-Four),测试CRON是否正常运行。

内容的提问来源于stack exchange,提问作者Fabien Bertrand-Durousset

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:10:35