WORDPRESS add_filter('cron_schedules',...)无法在PHP类

时间:2015-05-23 04:27:51

标签: php wordpress cron

我试图为WP_CRON声明一个新的时间间隔。 当我在PHP文件中执行它时,它可以工作。 当我在PHP类中执行它时它不会。

有人能看出我做错了吗?

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

如果我解决了这个问题,我认为它也可以解决我的问题,知道为什么我的cron作业不是在课堂上触发,而是在不在课堂上时正常工作。

=>文件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.
    <?
    }
}

=&GT;文件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 ()

最好的问候。

3 个答案:

答案 0 :(得分:2)

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

My_Plugin_Class

另外一个问题。 RefMean <- data.frame(tapply(QARef$MTN,paste(QARef$Target_CD,QARef$Feature_Type,QARef$Orientation,QARef$Contrast,QARef$Prox,QARef$Measurement_Type),FUN=mean,trim=0,na.rm=TRUE)) colnames(RefMean) <- c("MTN_Ref") Ident <- do.call(rbind, strsplit(rownames(RefMean), " ")) RefMean["Target_CD"] <- Ident[,1] RefMean["Feature_Type"] <- Ident[,2] RefMean["Orientation"] <- Ident[,3] RefMean["Contrast"] <- Ident[,4] RefMean["Prox"] <- Ident[,5] RefMean["Measurement_Type"] <- Ident[,6] QA4 <- merge(QARef,RefMean,by=c("Target_CD","Feature_Type","Orientation","Contrast","Prox","Measurement_Type"),all.x=TRUE,sort=FALSE) 构造函数是否包含您希望阻止在每个请求期间执行的任何代码?

答案 1 :(得分:2)

我认为正确的方法是为我的Cron设置一个特定的类。 这个类在每个请求上都是实例化的,这就是为什么代码不应该像我之前那样在静态实例的类中。 此外,我认为将Cron置于插件类之外以实现逻辑和更清晰的代码目的更好。感谢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();
        }
    }

答案 2 :(得分:1)

我不确定但试试这个。

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

并检查cron_time_intervals()函数是否为Call。