web-dev-qa-db-fra.com

Erreur non capturée: appel de la fonction non définie wp_generate_attachment_metadata () @ wp-cron

Devs

J'ai un WP-cronjob en cours d'exécution qui est censé importer des images et les définir en tant que pièces jointes pour un poste spécifique. Mais je suis apparemment incapable de le faire lorsque je l'exécute en tant que WP-cronjob - cela fonctionne très bien quand je l'exécute sur "init" pour exampel. Mais dès que j'essaie de l'exécuter dans un WP-cronjob, il échoue.

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

Comme j'ai pu le lire, c’est parce que la fonction wp_generate_attachment_metadata() n’est actuellement pas incluse dans un wp-cronjob et que je devrais require_once('wp-load.php').

Mais malheureusement, je ne suis pas en mesure d'exiger cela lors de l'exécution d'un travail cron (j'ai essayé les deux wp-load.php et wp-includes/post.php) - mais le truc non plus.

Alors peut-être qu'il y a un homme sage sur WPSE qui peut m'éclairer sur la façon dont je suis supposé obtenir le bon fonctionnement de mon travail-cronjob.

6
Mac

Une partie de ce qui est habituellement une fonctionnalité côté administrateur ne fait pas partie du "principal" bootstrap de wordpress, les fichiers contenant des fonctions de manipulation de fichier téléchargées en font partie et vous devez les inclure explicitement en ajoutant

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

dans votre fonction call_import.

8
Mark Kaplun

En haut de votre script cronjob (par exemple: my-cron.php), procédez comme suit:

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

Puis installez cron comme ceci sur votre serveur:

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

Remarque: vous avez peut-être essayé d'exécuter cron avec PHP ligne de commande (CLI), cela ne fonctionnerait pas. Vous devez exécuter cron en tant que requête HTTP (avec wget ou curl), comme indiqué ci-dessus.

Pour plus d'informations lisez ce document WordPress officiel .

Mettre à jour:

Sur la base du nouveau code ajouté, je peux voir que ce code est erroné:

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
 }

Vous avez coché if ( ! wp_next_scheduled( 'import_feed' ) ) mais vous planifiez add_action( 'import', 'call_import' );. Pour que cron fonctionne correctement, vous devez enregistrer la même action import. De plus, votre hook d'activation est OA_FeedManager_activated, assurez-vous qu'il exécute la fonction importpicture_activated. Donc, le code devrait être comme:

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
 }

Pour vérifier si votre cron est enregistré correctement, vous pouvez utiliser le plugin control . Activez également WP debugging pour voir quelle erreur votre CODE génère.

Note: _ Pour la fonction non définie wp_generate_attachment_metadata() erreur cochez la case réponse de Mark.

De plus, comme vous avez programmé le hook d'activation du plug-in cron dans le plug-in, vous devez désactiver, puis réactiver le plug-in si vous modifiez la fonction de hook d'activation. En utilisant Crontrol Plugin, assurez-vous qu’il n’y a pas de cron inutile inscrit dans le backend.

Enfin, vérifiez si dans wp-config.php vous avez define( 'DISABLE_WP_CRON', true );. Vous devez le supprimer (s'il existe) ou le définir sur false, si vous souhaitez que WP cron s'exécute sous le chargement normal WP. Sinon, vous devrez configurer cron avec OS crontab (comme indiqué au début de ma réponse.)

2
Fayaz