2016-09-19 2 views
0

Ich habe eine Website, wo ich Daten täglich von einer externen URL importieren muss, so dass ich ein Plugin erstellt, um dies zu behandeln. So weit, so gut, aber die Sache ist, dass mein Cron-Event nicht funktioniert. Ich habe das Crontrol-Plugin installiert, um das Ereignis zu testen, aber nichts passiert. Ich sehe meinen Hook-Namen in der Liste, aber wenn ich auf "Jetzt ausführen" klicke, bekomme ich eine Nachricht, dass das Cron-Event erfolgreich ausgeführt wurde, aber die Daten werden nicht importiert.Cron-Ereignis wird nicht in benutzerdefinierten Wordpress-Plugin ausgeführt

Ich habe eine Menge von recoursesonline (zum Beispiel) durchsucht, aber irgendwie scheinen alle Lösungen woanders nicht für mich arbeiten. Ich muss irgendwo einen Schritt verpasst haben.

Das Plugin Import-Daten genannt und in wp-content/plugins/import-data/ ich habe Import-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'); 

Ich weiß, dass das Verfahren fetchDetails() funktioniert, weil ich die Ausgabe getestet, bevor und wenn ich es manuell ausführen (i habe einen Shortcode zu import_data() hinzugefügt und verwendet, dass auf einer Demo-Seite) die Daten importiert werden, aber die Cron-Einstellungen oben nicht.

In functions.php sind nur Einstellungen der Admin-Seite.

Dies sind meine ersten Schritte in der Welt der Plugin-Entwicklung für Wordpress, so dass ich Bild, dass ich einen wichtigen Haken oder Filter (oder was auch immer) vermisse, aber ich kann einfach nicht finden, was es ist. Vielleicht eine Initialisierung?

Antwort

0

Als erstes sollten Sie Ihre globalen PHP-Funktionen mit Präfix versehen, um Konflikte mit anderen Plugins, Themes oder Core zu vermeiden.

Ich würde die Aktivierung Haken verwenden, um die Veranstaltung zu planen, ist hier, wie ich dies tun würde:

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

ich über Ihren Event-Code nicht kennen, könnten Sie es ausführen müssen, um seine Arbeits stellen Sie sicher, korrekt.

Erfahren Sie mehr über WP cron hier: https://developer.wordpress.org/plugins/cron/

Erfahren Sie mehr über die Aktivierung/Deaktivierung Haken hier: https://developer.wordpress.org/plugins/the-basics/activation-deactivation-hooks/

Und ein gutes Plugin zu debuggen wp cron Ereignisse: https://wordpress.org/plugins/wp-crontrol/

+0

Leider das gleiche Ergebnis wie ich hatte: nichts passiert. Ich habe das Plugin, das Sie erwähnten (WP Crontrol), installiert und ich sehe das Ereignis, das dort auftritt, aber wenn ich auf "Jetzt ausführen" klicke, wird nichts importiert. Wenn ich add_shortcode ('ip_test_output', 'ip_do_import_data'); 'am Ende von import-data.php und dann' ['ip_test_output] 'zu einer Testseite hinzufüge, werden die Daten importiert, wenn ich auf die Testseite gehe. – Maurice

+0

Stellen Sie sicher, dass WordPress Ihre Cron-Funktionen ausführt, dann müssen Sie Ihr Plug-in deaktivieren und erneut aktivieren, damit das Cron-Ereignis geplant wird. Sie können die wp cron-Umgebung manuell aktivieren, indem Sie Folgendes besuchen: http://yourdomain.com/wp-cron.php?doing_wp_cron - Wenn Ereignisse geplant sind, werden sie aktiviert. Sie müssen mit dem Debuggen Ihres Codes beginnen, um zu sehen, was fehlschlägt. – MrZiggyStardust

+0

Ich habe das obige Plugin versucht, obwohl ich alle 'require_once()' und den Ereigniscode entfernt habe und stattdessen einen einfachen 'wp_mail()' Aufruf hinzugefügt habe. In WordPress 4.6.1 wird das Ereignis hinzugefügt und ich erhalte meine Test-E-Mail, die bestätigt, dass sie funktioniert. Stellen Sie sicher, dass das geplante Ereignis ist: 'ip_import_data' und nicht:' import_data' – MrZiggyStardust