2016-09-19 150 views
0

我有一個網站,我需要每天從外部URL導入數據,所以我做了一個插件來處理這個問題。到目前爲止這麼好,但事情是,我的cron事件不起作用。我安裝了Crontrol插件來測試事件,但沒有任何反應。我在列表中看到我的鉤子名稱,但是當我點擊'立即運行'時,我收到一條消息,說明cron事件已成功執行,但數據未導入。Cron事件不會在自定義WordPress插件中執行

我已經通過很多recoursesonline(例如)進行了搜索,但不知何故,其他地方發佈的所有解決方案似乎都不適用於我。我必須在某個地方錯過一步。

該插件被稱爲進口數據和wp-content/plugins/import-data/我有進口data.php:

<?php 

    /** 
     * Plugin Name: Import data 
     * Plugin URI: 
     * Description: Import data 
     * Version: 1.0.0 
     * Author: 
     * Author URI: 
     * License: GPL2 
     */ 

    // Block direct acces to file 
    defined('ABSPATH') or die(); 

    // Include functions 
    require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'functions.php'; 

    // Include class 
    require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'lib/class.import_data.php'; 

    /** 
     * @desc iterate through all posts and update information 
     */ 
    function import_data(){ 
      $wp_query = new WP_Query(
       array(
        'post_type' => 'post', 
        'post_status' => 'publish', 
       ) 
     ); 

      if($wp_query->have_posts()){ 
       while($wp_query->have_posts()){ 
        $wp_query->the_post(); 
        $post_id = $wp_query->post->ID; 
        $external_id = get_field(trim(get_option('acfname_external_id'))); 

        // Execute plugin 
        Import_Data::getInstance()->fetchDetails($external_id, $post_id); 
       } 
       wp_reset_postdata(); 
      } 
    } 

    /** 
     * Set cron 
     */ 
    function my_event(){ 
      if(!wp_next_scheduled('import_data')){ 
       wp_schedule_event(time(), 'daily', 'import_data'); 
      } 
    } 

    add_action('wp', 'my_event'); 

    function unset_event(){ 
      wp_clear_scheduled_hook('import_data'); 
    } 

    register_deactivation_hook(__FILE__, 'unset_event'); 

我知道,因爲我測試前的輸出,當我手動運行fetchDetails()工作方法(我我們在import_data()上添加了一個簡碼,並在演示頁面上使用了這個簡碼)數據被導入,但上面的cron設置沒有。

在functions.php中只有管理頁面設置。

這是我在Wordpress插件開發世界的第一步,所以我可以想象我錯過了一個重要的鉤子或過濾器(或其他),但我只是無法找到它是什麼。也許一些初始化?

回答

0

你們之前應該爲全球php函數加上前綴以避免與其他插件,主題或核心發生衝突。

我會使用激活鉤來安排活動,這裏是我會怎麼做:

<?php 

/** 
    * Plugin Name: Import data 
    * Plugin URI: 
    * Description: Import data 
    * Version: 1.0.0 
    * Author: 
    * Author URI: 
    * License: GPL2 
    */ 

// Block direct acces to file 
defined('ABSPATH') or die(); 

// Include functions 
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'functions.php'; 

// Include class 
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'lib/class.import_data.php'; 

// Register activation/deactivation hooks 
register_deactivation_hook(__FILE__, 'ip_deactivation_func'); 
register_activation_hook(__FILE__, 'ip_activation_func'); 

// The plugin activation function 
function ip_activation_func(){ 
    // Do not forget to namespace your hooks also 
    if(!wp_next_scheduled('ip_import_data')){ 
     wp_schedule_event(time(), 'daily', 'ip_import_data'); 
    } 
} 

// The plugin deactivation function 
function ip_deactivation_func(){ 
    wp_clear_scheduled_hook('ip_import_data'); 
} 

// Add the action event hook 
add_action('ip_import_data', 'ip_do_import_data'); 

// Your actual event code: 
function ip_do_import_data(){ 
    $wp_query = new WP_Query(
     array(
      'post_type' => 'post', 
      'post_status' => 'publish' 
     ) 
    ); 

    if($wp_query->have_posts()){ 
     while($wp_query->have_posts()){ 
      $wp_query->the_post(); 

      // Added this part, no need to use: $wp_query object here! 
      global $post; 

      $post_id = $post->ID; 
      $external_id = get_field(trim(get_option('acfname_external_id'))); 

      // Execute plugin 
      Import_Data::getInstance()->fetchDetails($external_id, $post_id); 
     } 
     wp_reset_postdata(); 
    } 
} 

我不知道你的事件代碼做,你可能需要運行它,以確保其工作正確。

瞭解更多關於WP的cron這裏: https://developer.wordpress.org/plugins/cron/

瞭解更多關於啓用/停用掛鉤這裏: https://developer.wordpress.org/plugins/the-basics/activation-deactivation-hooks/

而一個好的插件來調試WP的cron事件: https://wordpress.org/plugins/wp-crontrol/

+0

不幸的是,同結果如我:沒有任何反應。我有你提到的插件(WP Crontrol)安裝,我看到事件發生在那裏,但是當我點擊現在運行幾次什麼都得不到導入。當我添加'add_shortcode('ip_test_output','ip_do_import_data');'到import-data.php的底部,然後'['ip_test_output]'到測試頁面時,數據在我進入測試頁面時被導入。 – Maurice

+0

確保WordPress正在運行您的cron功能,然後您需要停用並重新激活您的cron事件插件才能安排。您可以通過訪問http://yourdomain.com/wp-cron.php?doing_wp_cron手動激活wp cron環境 - 如果計劃了任何活動,它們將會激活。您需要開始調試代碼以查看失敗。 – MrZiggyStardust

+0

我嘗試了上面的插件,但我刪除了所有'require_once()'和事件代碼,並添加了一個簡單的'wp_mail()'調用。在WordPress 4.6.1中,事件被添加,我得到我的測試電子郵件確認其工作。確保預定的事件是:'ip_import_data'而不是:'import_data' – MrZiggyStardust