2016-09-19 9 views
0

私は外部URLから毎日データをインポートする必要があるサイトを用意していますので、これを処理するプラグインを作成しました。これまでのところとても良いですが、問題は私のcronイベントがうまくいかないことです。イベントをテストするためにCrontrolプラグインをインストールしましたが、何も起こりません。フック名が一覧に表示されますが、[今すぐ実行]をクリックすると、cronイベントは正常に実行されたが、データはインポートされないというメッセージが表示されます。カスタムWordpressプラグインでCronイベントが実行されない

私は多くの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'); 

をiが前に出力をテストしたので、私はそれを手動で実行したときに動作しますfetchDetails()方法(I 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/

は、ここに起動/停止フックの詳細情報:デバッグWPのcronイベントへ https://developer.wordpress.org/plugins/the-basics/activation-deactivation-hooks/

そして、良いプラグイン: https://wordpress.org/plugins/wp-crontrol/

+0

残念ながら同じ私が持っていたように結果:何も起こりません。あなたが言いました(WP Crontrol)というプラグインがインストールされていて、そこにイベントが表示されていますが、[今すぐ実行]をクリックすると何もインポートされません。 import-data.phpの最後に 'add_shortcode( 'ip_test_output'、 'ip_do_import_data');を追加し、テストページに行くとデータをインポートするテストページに' ['ip_test_output]を追加します。 – Maurice

+0

WordPressがあなたのcron関数を実行していることを確認してから、cronイベントがスケジュールされるようにプラグインを無効にして再度アクティブにする必要があります。 wp cron環境を手動で起動するには、http://yourdomain.com/wp-cron.php?doing_wp_cronを参照してください。スケジュールされているイベントがあれば、それらはアクティブになります。何が失敗するかを確認するには、コードのデバッグを開始する必要があります。 – MrZiggyStardust

+0

上記のプラグインを試しましたが、 'require_once()'とイベントコードをすべて削除し、代わりに単純な 'wp_mail()'呼び出しを追加しました。 WordPress 4.6.1では、イベントが追加され、テスト用の電子メールが届きました。スケジュールされたイベントが 'ip_import_data'であることを確認してください:' import_data' – MrZiggyStardust

関連する問題