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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:12:19