Uncaught Error: Aufruf zu undefinierter function wp_generate_attachment_metadata () @ wp-cron

Entwickler

Ich habe einen WP-Cronjob ausgeführt, der einige Bilder importieren und als Anhänge 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 laufe – es funktioniert gut, wenn ich es zum Beispiel auf “init” starte. Aber sobald ich versuche, es innerhalb eines WP-Cronjobs auszuführen, scheitert es.

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, ist das, weil die wp_generate_attachment_metadata() function derzeit nicht enthalten ist, wenn ich einen wp-cronjob , und ich sollte require_once('wp-load.php') .

Aber leider kann ich das nicht während der Ausführung eines Cron-Jobs wp-load.php (ich habe sowohl wp-load.php wp-includes/post.php ) – aber auch nicht den Trick.

Also vielleicht gibt es einen weisen Mann auf WPSE, der mir aufklären kann, wie ich meinen WP-Cronjob richtig laufen lassen soll.

Solutions Collecting From Web of "Uncaught Error: Aufruf zu undefinierter function wp_generate_attachment_metadata () @ wp-cron"

Einige functionen, die normalerweise auf der Admin-Seite stehen, sind nicht Teil des “Main” -Wordpress-Bootstraps, Dateien mit functionen zum Hochladen von Dateien sind eine davon, und Sie müssen sie explizit hinzufügen

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

in Ihre call_import function.

Führen Sie oben in Ihrem Cronjob-Skript (z. B. my-cron.php ) my-cron.php :

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

Dann richten Sie cron so in 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 als HTTP-Anfrage ausführen (mit wget oder curl ), wie oben gezeigt.

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

Aktualisieren:

Basierend auf dem neu hinzugefügten CODE 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 geprüft, if ( ! wp_next_scheduled( 'import_feed' ) ) aber Sie planen, add_action( 'import', 'call_import' ); . Damit Cron ordnungsgemäß funktioniert, müssen Sie den gleichen Aktionsimport registrieren. Ihr Aktivierungs-Hook ist auch OA_FeedManager_activated , stellen Sie sicher, dass es importpicture_activated function ausgeführt wird. Also sollte der CODE wie folgt 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 Kontroll-Plugin verwenden . Aktivieren Sie auch das WP-Debugging, um zu sehen, welchen Fehler Ihr CODE erzeugt.

Hinweis: Für undefinierte function wp_generate_attachment_metadata() Fehlerprüfung Marks Antwort.

Da Sie den Cron in den Aktivierungs-Hook des Plugins eingeplant haben, müssen Sie das Plug-In auch wieder deaktivieren und aktivieren, wenn Sie die Aktivierungs-Hook-function ändern. Verwenden Sie das Crontrol-Plugin, um sicherzustellen, dass im Backend keine unnötige Cron-Registrierung registriert ist.

wp-config.php Sie wp-config.php , ob Sie in wp-config.php define( 'DISABLE_WP_CRON', true ); . Sie müssen es entfernen (wenn es dort ist) oder es auf false , wenn WP cron bei normalem WP-Laden ausgeführt werden soll. Ansonsten müssen Sie cron mit OS crontab einstellen (wie am Anfang meiner Antwort gezeigt).