我试图为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 ()
最好的问候。
答案 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。