WordPress自定义wp-cron类不会触发计划的处理程序

时间:2019-12-16 23:42:51

标签: php wordpress cron

因此,我们使用Bedrock帮助编写产品代码,我需要构建一个通用类来处理自定义cronjobs。

这是cronjob的基础类:

<?php
namespace namespace\to\the\class;

abstract class CronHelper extends AbstractHelper {

    /** Declare all attributes and other methods */

    /**
     * Setup the custom cronjob
     */
    protected function init() {
        $this->setAlias(DEFAULT_CRON_ALIAS);
        $this->setInterval(DEFAULT_CRON_INTERVAL);
        $this->setDisplay(DEFAULT_CRON_DISPLAY);
    }

    /**
     * Start the cronjob
     */
    public function start() {
        add_filter('cron_schedules', array($this,'customInterval'));
        add_action($this->getAlias(), array($this,'runner'));

        if (! wp_next_scheduled($this->getAlias())) {
            wp_schedule_event(time(), "{$this->getAlias()}_interval", $this->getAlias());
        }
    }

    /**
     * The custom interval builder
     *
     * @return array The custom interval setup
     */
    public function customInterval() {
        $scheduler["{$this->getAlias()}_interval"] = array('interval' => $this->getInterval(),'display' => $this->getDisplay());
        return $scheduler;
    }

    /**
     * The scheduler implementation function
     */
    protected abstract function runner();
}

你们应该知道什么:

  • AbstractHelper是Singleton类
  • 我压制了吸气剂/阻气剂
  • 在我们网站的每次页面加载中都会触发方法start()

这是CronHelper类的一种实现:

<?php
namespace namespace\to\the\class;

class TestCron extends CronHelper {

    protected function runner() {
        // Try to print something on the nginx's error logs
        error_log('Running inside the class TestCron');
        // Create a random file just for testing
        $file = fopen('./cronjob.txt', 'w');
        fwrite($file, sprintf('Hello World [%d]', time()));
        fclose($file);
    }
}

这就是我实例化所有内容的方式,请记住,这段代码每次都会执行:

<?php
/** A lot of code above ... */

// Start the Test Cronjob
TestCron::getInstance()->setAlias('test_cron')
    ->setDisplay('Test Cronjob')
    ->setInterval(5) // Fire every 5 seconds
    ->start();

/** A lot of code below ... */

每次我加载页面并浏览网站时,都不会发生任何事情。我想知道我在做什么错?!

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我终于发现我的代码发生了什么。我只是将其放在此处,以备将来类似的疑问。

解决方案是:为protected的wannabe函数使用public方法,而不是使用runner()方法。