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();
}
}
我试图为 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();
}
}