Wp-cron和执行is_admin()包含的脚本中的代码

时间:2018-04-02 作者:scytale

我正在开发一个插件。其后端设置允许管理员从第三方数据提供商更新站点数据文件,或打开/关闭wp cron作业以自动完成此操作。

在此(简化)代码中I assume my wp-cron job will only be run if someone logs in to the WP Dashboard? (不是我真正想要的)

if (is_admin()) {
  include \'my_update_script.php\';
  include \'settings_form_stuff.php\'; // schedules/deschedules xyz_job etc
}
在“my\\u update\\u script.php”中:

function xyz_2weekly( $schedules ) {
  $schedules[\'xyz_2weekly\'] = array( \'interval\' => 3*604800, \'display\' => __(\'Two Weeks\') );
  return $schedules;
}
add_filter( \'cron_schedules\', \'xyz_2weekly\');

add_action( $xyz_job, \'xyz_update_files\' );
function (xyz_update_files) {
  $xyz_update = new xyz_upd_class();
  $xyz_update->do_update(TRUE); // true identifies it as automated and emails admin on failure
  unset($xyz_update);
  }

class xyz_upd_class { // etc
效率低下,我希望避免前端不必要的包含的开销(该插件适用于PHP 5和PHP 7)。

我知道,为了防止响应访问者的延迟,前端请求会生成一个后台请求来启动一个单独的wp cron“进程”,但我假设(我找不到任何信息)此进程未设置为在“wp admin/is admin scope”中运行,因此不会执行add\\u操作。

Is there an efficient alteration I can make so 前端请求中不包括更新脚本(带有add\\u操作),但从前端启动时,wp cron仍可使用该脚本?

Edit: Clinton的回答表明,当前端请求生成“wp cron进程”时,我的is\\u admin include将“超出范围”。

我希望得到类似的答案if ( is_admin() || wp_next_scheduled($xyz_job) ) include ... (我曾想过但排除了这一点,因为大多数网站都会安排作业;我怀疑时间表不会在内存中,因此这只会导致额外的“慢速”服务器读取)。

在没有其他选择的情况下,我决定只合并代码,而不检查是否管理,因此我接受克林顿的回答。

2 个回复
最合适的回答,由SO网友:Clinton 整理而成

我读了几遍才明白,我不确定我的解释是否正确。无论如何,这是我的解释(如果我弄错了,很抱歉)。。。

您有一个用于更新某种文件的CRON作业。当有人以您指定的频率访问站点(无论是否为管理员)时,将运行此CRON作业。管理员可以从插件设置中关闭CRON作业。您不想包含任何不必要的包含。

我会将其分为两个单独的部分,首先是设置部分,其中我会设置一个开/关标志,如下所示:

将标志定义为选项设置,并在插件激活时将其设置为on(1):

register_activation_hook(__FILE__, function(){
    add_option(\'xyz_cron_status\', 1);
}
此选项的值将通过插件设置菜单访问的表单以常见的Wordpress插件方式进行更改。

接下来,在插件设置代码中定义CRON作业(不包含is\\u admin()函数),如下所示:

xyz_cron_option = get_option(\'xyz_cron_status\');
if ( xyz_cron_option ){
    add_filter(\'cron_schedules\', \'xyz_2weekly\');
    add_action(\'wp\', \'xyz_cron_settings\');
    add_action(\'xyz_cron_hook\', \'xyz_update_files\');
}
其中,xyz\\u cron\\u设置如下:

/**
 * Create a hook called xyz_cron_hook for this plugin and set the time
 * interval for the hook to fire through CRON
 */
function xyz_cron_settings() {
    //verify event has not already been scheduled
    if ( !wp_next_scheduled( \'xyz_cron_hook\' ) ) {
        wp_schedule_event( time(), \'xyz_2weekly\', \'xyz_cron_hook\' );
    }
}
其他功能如代码所示:

function xyz_2weekly( $schedules ) {
  ...
}
以及

function xyz_update_files() {
  ...
}
我希望这会有所帮助。

SO网友:Marcos Silva

我知道已经很晚了,但对于其他正在搜索的人来说:

if (is_admin () || wp_doing_cron ()) {
      your code ...
}

about wp_doing_cron

结束