2015-05-23 56 views
1

不工作我試圖聲明一個新的時間間隔爲WP_CRON。 當我在一個PHP文件中工作。 當我在PHP類中做它時,它不會。WORDPRESS的add_filter(「cron_schedules」,...)的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. 
    <? 
    } 
} 

=>文件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

您是否在每次用戶訪問您的頁面時實例化您的類? –

+0

你好@lukas我很確定這種情況。那麼我首先檢查是否存在該類的現有實例。 $ instance = My_Class_Name :: instance(__FILE__,'1.0.0'); $ instance-> do_things(); –

+0

你可以粘貼全班? –

回答

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(); 
     } 
    } 
+0

我認爲wp_schedule_event只需要被觸發一次,並且在插件激活過程中可以看到更多關於它的細節https://codex.wordpress.org/Function_Reference/wp_schedule_event –

1

我不確定但是試試這個。

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

並檢查cron_time_intervals()函數是否爲調用。

+0

hello @dev,這也行不通。 add_filter似乎不會激怒,因爲cron_time_intervals()函數不是調用。 –

2

我幾乎可以肯定的是do_some_rock()不叫每次 - 只有當有人去到該頁面。你可以從你的類的構造函數主要插件文件myplugin.php移動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')); 

一個額外的問題。 My_Plugin_Class構造函數是否包含您希望阻止在每個請求期間執行的任何代碼?

+0

是的,你是完全正確的。我現在明白我的錯誤。非常感謝你的幫助。 –

相關問題