it-swarm.com.de

Wp_generate_attachment_metadata () @ wp-cron auf

Entwickler

Ich habe einen WP-Cronjob, der einige Bilder importieren und als Anhang für einen bestimmten Beitrag festlegen soll. Aber ich bin anscheinend nicht in der Lage, dies zu tun, während ich es als WP-Cronjob starte - es funktioniert einwandfrei, wenn ich es zum Beispiel auf "init" starte. Aber sobald ich versuche, es in einem WP-Cronjob auszuführen, schlägt es fehl.

 register_activation_hook( __FILE__, 'OA_FeedManager_activated' );
 function importpicture_activated()
 {
    if (! wp_next_scheduled( 'import_feed' ) ) 
    {
       wp_schedule_event( time(), 'hourly', 'import' );
    }
 }

  add_action( 'import', 'call_import' );
  function call_import() 
  {
        //lots of code, where i get data from a XML feed, and creates a new post. no need to include it.           

        foreach($oDataXML->Media->Fotos->Foto as $key => $value)
        {
            $filename = wp_upload_dir()['path'].'/'.$oDataXML->SagsNr->__toString().'_'. $value->Checksum->__toString() . '.jpg';  
            $sPicture = $value->URL->__toString();
            copy($sPicture, $filename);
            $filetype = wp_check_filetype( basename( $filename ), null );

            $wp_upload_dir = wp_upload_dir();
            $attachment = array(
               'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ),
               'post_mime_type' => $filetype['type'],
               'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
               'post_content'   => '',
               'post_status'    => 'inherit'
            );
            $attach_id = wp_insert_attachment( $attachment, $filename, $iPost_ID );
            $attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
            wp_update_attachment_metadata( $attach_id, $attach_data );           
        }
  } 

Wie ich lesen konnte, liegt es daran, dass die Funktion wp_generate_attachment_metadata() derzeit nicht enthalten ist, wenn ich einen wp-cronjob mache, und ich sollte require_once('wp-load.php').

Leider kann ich das nicht beim Ausführen eines Cron-Jobs verlangen (ich habe sowohl wp-load.php als auch wp-includes/post.php ausprobiert) - aber auch nicht.

Vielleicht gibt es einen weisen Mann auf WPSE, der mir aufklären kann, wie ich meinen WP-Cronjob richtig zum Laufen bringen kann.

6
Mac

Einige der Funktionen, die normalerweise auf der Administratorseite verfügbar sind, sind nicht Bestandteil des WordPress-Hauptstarts. Dateien mit hochgeladenen Dateibearbeitungsfunktionen sind eine davon, und Sie müssen sie durch Hinzufügen explizit einbeziehen

include_once( ABSPATH . 'wp-admin/includes/image.php' );

in Ihre call_import Funktion.

8
Mark Kaplun

Führen Sie oben in Ihrem Cronjob-Skript (zum Beispiel: my-cron.php) Folgendes aus:

if ( ! defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Dann richten Sie cron wie folgt auf Ihrem Server ein:

5 * * * * wget -q -O - http://your-domain.com/my-cron.php

Hinweis: Vielleicht haben Sie versucht, cron als PHP Command Line (CLI) auszuführen, das wird nicht funktionieren. Sie müssen cron wie oben gezeigt als HTTP-Anforderung (mit wget oder curl) ausführen.

Für weitere Informationen lesen Sie dieses offizielle WordPress-Dokument .

Aktualisieren:

Aufgrund des neu hinzugefügten Codes kann ich sehen, dass dieser Code falsch ist:

register_activation_hook( __FILE__, 'OA_FeedManager_activated' );
function importpicture_activated() {
    if ( ! wp_next_scheduled( 'import_feed' ) )  {
        wp_schedule_event( time(), 'hourly', 'import' );
    }
 }

 add_action( 'import', 'call_import' );
 function call_import() {
     // lots of code
 }

Sie haben if ( ! wp_next_scheduled( 'import_feed' ) ) aktiviert, aber Sie planen add_action( 'import', 'call_import' );. Damit cron ordnungsgemäß funktioniert, müssen Sie dieselbe Aktion registrieren: import. Außerdem lautet Ihr Aktivierungs-Hook OA_FeedManager_activated. Stellen Sie sicher, dass die Funktion importpicture_activated ausgeführt wird. Der CODE sollte also so aussehen:

register_activation_hook( __FILE__, 'OA_FeedManager_activated' );

function OA_FeedManager_activated() {
    importpicture_activated();
}

function importpicture_activated() {
    if ( ! wp_next_scheduled( 'import' ) ) {
        wp_schedule_event( time(), 'hourly', 'import' );
    }
 }

 add_action( 'import', 'call_import' );
 function call_import() {
     // lots of code
 }

Um zu überprüfen, ob Ihr Cron richtig registriert ist, können Sie das Control Plugin verwenden. Aktivieren Sie außerdem WP debugging , um festzustellen, welchen Fehler Ihr CODE generiert.

Anmerkung:Bei undefinierter Funktion wp_generate_attachment_metadata() error Markierungs Antwort überprüfen.

Da Sie den Cron im Aktivierungs-Hook des Plugins eingeplant haben, müssen Sie das Plugin deaktivieren und erneut aktivieren, wenn Sie die Aktivierungs-Hook-Funktion ändern. Stellen Sie mit dem Crontrol Plugin sicher, dass im Backend keine unnötigen Cron registriert sind.

Überprüfen Sie abschließend, ob Sie in wp-config.phpdefine( 'DISABLE_WP_CRON', true ); haben. Sie müssen es entfernen (falls vorhanden) oder auf false setzen, wenn WP cron bei normaler WP Auslastung ausgeführt werden soll. Andernfalls müssen Sie cron mit OS crontab einstellen (wie am Anfang meiner Antwort gezeigt).

2
Fayaz