WordPress定时任务插件异常:仅激活时运行,后续未执行
问题分析与修复方案
你的插件仅在激活时执行一次、后续定时任务失效,核心问题有两个:
1. 未注册自定义定时间隔
WordPress默认没有every5minutes这个时间间隔,必须手动注册才能被定时任务识别。
2. 局部变量无法持久化响应对比值
$prev_response_body是函数内的局部变量,每次函数执行都会重置,导致永远无法检测到响应内容变化,需要用WordPress的选项系统持久化存储这个值。
完整修复代码
// 注册自定义5分钟定时间隔 add_filter('cron_schedules', 'register_custom_cron_interval'); function register_custom_cron_interval($schedules) { $schedules['every5minutes'] = array( 'interval' => 300, // 5分钟=300秒 'display' => __('每5分钟'), ); return $schedules; } function send_http_post_request() { error_log('Cron is running'); // 日志记录,用于调试 // 从WordPress选项中读取上次的响应内容 $prev_response_body = get_option('previous_product_response', ''); // SOAP请求体 $request_body = '<?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <GetProducts xmlns="http://URL"> <username>TEST</username> <password>123456789</password> <productGroupCode>Test</productGroupCode> </GetProducts> </soap12:Body> </soap12:Envelope>'; // 发送POST请求 $response = wp_remote_post( 'https://www....', array( 'method' => 'POST', 'headers' => array( 'Content-Type' => 'application/soap+xml; charset=utf-8', ), 'body' => $request_body, ) ); if ( is_wp_error( $response ) ) { $error_message = $response->get_error_message(); error_log('SOAP请求错误: ' . $error_message); return; } $response_body = wp_remote_retrieve_body( $response ); // 对比响应内容是否变化 if ( $response_body !== $prev_response_body ) { $file_path = ABSPATH . 'folder/test.xml'; // 确保目录存在,避免写入失败 if (!file_exists(dirname($file_path))) { mkdir(dirname($file_path), 0755, true); } file_put_contents( $file_path, $response_body ); // 更新WordPress选项,存储最新响应 update_option('previous_product_response', $response_body); error_log('XML文件已更新'); } else { error_log('响应内容无变化,无需更新'); } } // 插件激活时的初始化操作 register_activation_hook( __FILE__, 'plugin_activation_setup' ); function plugin_activation_setup() { send_http_post_request(); // 避免重复创建定时任务 if ( ! wp_next_scheduled( 'product_sync_cron_hook' ) ) { wp_schedule_event( time(), 'every5minutes', 'product_sync_cron_hook' ); } } // 绑定定时钩子与执行函数 add_action( 'product_sync_cron_hook', 'send_http_post_request' ); // 插件停用后清理定时任务 register_deactivation_hook( __FILE__, 'plugin_deactivation_cleanup' ); function plugin_deactivation_cleanup() { wp_clear_scheduled_hook( 'product_sync_cron_hook' ); // 可选:清理存储的历史响应数据 delete_option('previous_product_response'); }
额外说明
- WordPress的cron依赖网站访问触发,若需要更稳定的定时执行,建议搭配服务器系统级定时任务(比如Linux的crontab)调用
wp-cron.php。 - 测试时可直接访问
你的域名/wp-cron.php手动触发定时任务,通过wp-content/debug.log查看日志排查问题。 - 后续改为12小时执行时,可直接使用WordPress默认间隔
twicedaily,或注册12小时的自定义间隔(43200秒)。
内容的提问来源于stack exchange,提问作者alorange
相关产品推荐
相关产品推荐

