WP CRON任务未触发回调函数,但手动调用该函数正常运行
问题分析与解决方案
核心原因排查
WordPress的CRON是请求触发式,而非系统级定时任务——只有当网站有前台/后台访问请求时,WP才会检查并执行到期的CRON任务。如果网站长时间无访问,任务会延迟甚至不执行,这是最常见的隐性原因。
代码层面的修复点
显式声明回调函数的参数接收数量
你的add_action未指定接受参数的个数,虽默认是1,但显式设置能避免参数传递失败:add_action( 'update_product_price_curve', 'bulk_update_product_price_curve', 10, 1 );最后一个参数
1表示回调函数接受1个参数,和调度时传递的$args对应。给回调函数添加调试日志
在回调函数开头写入日志,确认函数是否被触发,同时排查数据库操作错误: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)); }开启WordPress错误日志
在wp-config.php中添加以下配置,让错误日志写入wp-content/debug.log:define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); // 不在前端显示错误,避免影响用户解决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
相关产品推荐
相关产品推荐

