WORDPRESS add_filter('cron_schedules', ...) 无法在 PHP class 中工作

WORDPRESS add_filter('cron_schedules', ...) not working in a PHP class

我试图为 WP_CRON 声明一个新的时间间隔。 当我在 PHP 文件中执行此操作时,它会起作用。 当我在 PHP Class 中执行时,它不会。

有人能看出我做错了什么吗?

我正在使用插件 cron view 检查声明是否有效。

如果我解决了这个问题,我想知道为什么我的 cron 作业没有在 class 中触发,但在 class 中却正常工作的原因也会解决我的问题。

=> 文件 myplugin.php

function set_up_option_page() {
    add_options_page( [...]);
}
add_action( 'admin_menu', 'set_up_option_page' );

function do_some_rock() {

    $instance = My_Plugin_Class::instance();

    if ( isset($_POST['action']) && 'do-magic' == $_POST['action'] ) {
        $instance->do_stuff();
    }else{
        // Display the form.
    <?
    }
}

=> 文件 My_Plugin_Class.php

<?php

if ( ! defined( 'ABSPATH' ) ) exit;

class My_Plugin_Class {

    private static $_instance = null;

    public function __construct () {

[...] 

        add_filter( 'cron_schedules', array($this,'cron_time_intervals'));

    } 

    public function cron_time_intervals( $schedules ) {
        echo "——— cron time intervals —— ";
        $schedules['minutes_1'] = array(
            'interval' => 10*60,
            'display'   => 'Once 10 minutes'
        );

        return $schedules;
    }

    public static function instance () {
        if ( is_null( self::$_instance ) ) {
            self::$_instance = new self();
        }
        return self::$_instance;
    } // End instance ()

此致。

我不确定,但试试这个。

   add_filter( 'cron_schedules', array($this,'cron_time_intervals'),1);

并检查 cron_time_intervals() 函数是否被调用。

我几乎可以肯定 do_some_rock() 不会每次都调用 - 只有当有人访问该页面时才会调用。您可以将 add_filter( 'cron_schedules', array($this,'cron_time_intervals')); 从 class 构造函数移动到主插件文件 myplugin.php 并或多或少地执行类似这样的操作

add_action( 'admin_menu', 'set_up_option_page' );
$instance = My_Plugin_Class::instance();
add_filter( 'cron_schedules', array($instance ,'cron_time_intervals'));

多问一个问题。 My_Plugin_Class 构造函数是否包含您希望在每个请求期间阻止执行的任何代码?

我认为正确的方法是为我的 Cron 设置一个特定的 class。 这个 class 是在每个请求上实例化的,这就是为什么代码不应该像我以前那样在带有静态实例的 class 中。 此外,我认为最好将 Cron 放在插件 class 之外,以实现逻辑和更清晰的代码目的。感谢 Lukas Pawlik 的帮助。

 if (!defined('ABSPATH')) exit;

    new My_Cron();

    class My_Cron {

        public function __construct() {
            add_filter('cron_schedules', array($this, 'cron_time_intervals'));
            add_action( 'wp',  array($this, 'cron_scheduler'));
            add_action( 'cast_my_spell', array( $this, 'auto_spell_cast' ) );
        }

        public function cron_time_intervals($schedules)
        {
            $schedules['minutes_10'] = array(
                'interval' => 10 * 60,
                'display' => 'Once 10 minutes'
            );
            return $schedules;
        }

        function cron_scheduler() {
            if ( ! wp_next_scheduled( 'cast_my_spell' ) ) {
                wp_schedule_event( time(), 'minutes_10', 'cast_my_spell');
            }
        }

        function auto_spell_cast(){
            My_Plugin_Class::instance()->launch_spell();
        }
    }