web-dev-qa-db-fra.com

get_posts à l'intérieur du cron

Édité pour réécrire ma question

Je vais essayer d'être le plus clair possible, car je dois résoudre ce problème rapidement.

J'ai désactivé le cron de WordPress et ajouté un vrai travail cron sur mon serveur pour appeler wp-cron.php tous les jours. La fonction que j'appelle ne fonctionne pas, cependant.

L'exécution de code semble s'arrêter à get_posts, même chose si j'essaie d'utiliser la classe WP_Query. Aucun message d'erreur, et tout code après ne s'exécute pas.

Quand je n'ajoute pas numberposts, il me donne cependant 5 posts, qui est la valeur par défaut pour numberposts.

Échantillon :

 $posts = get_posts( array(
     'post_type'    => 'post-type',
     'numberposts' => -1,
     'tax_query'    => array(
           array(
                'taxonomy'  =>  'tax',
                'field'     =>  'slug',
                'terms' =>  'term-slug'
           )
      )
 ));

Plus d'infos

  • Le type de publication et la taxonomie sont créés dans mon fichier de plug-in sur le hook init.
  • La fonction fonctionne correctement lorsqu'elle est exécutée à partir d'une page PHP, comme la page de configuration de mon plugin.
  • J'ai essayé d'accrocher ma fonction dans wp_ajax_nopriv et d'appeler admin-ajax.php?action=the-action à partir de mon serveur cron, mais avec exactement le même résultat.
  • Je n'ai pas essayé de garder le code de commande de WP, car la fonction prend beaucoup de temps à exécuter et vous avez besoin d'un visiteur qui la lance en visitant le site.

S'il vous plaît répondre avec des questions/demande de code si plus d'informations sont nécessaires.

Éditer - Ma boucle

 set_time_limit( 1800 );

 $stores = get_option( 'stores' );

 foreach( $stores as $store_name => $store )
 {

      $ctime = 0;
      $filename = '';
      $xml_path = '';

      $dir = dir( $store );

      while( false !== ( $entry = $dir->read() ) )
      {

           $info = pathinfo( $entry );

           $ext = strtolower( $info['extension'] );

           $filepath = "{$store}/{$entry}";

           if( is_file( $filepath ) && $ext == 'xml' && filectime( $filepath ) > $ctime )
           {

                $ctime = filectime( $filepath );

                $filename = $entry;

                $xml_path = $filepath;

           }

      }

      if( file_exists( $xml_path ) && is_file( $xml_path ) )
      {

           //
           //Delete products first
           //
           $posts = get_posts( array(
                'post_type' => 'produit-xml',
                'posts_per_page' => -1,
                'tax_query' => array(
                     array(
                          'taxonomy'    =>  'succursale',
                          'field'       =>  'slug',
                          'terms'       =>  $store_name
                     )
                )
           ));

           foreach( $posts as $post )
           {

                $image = get_post_meta( $post->ID, 'nom_photo', true );

                if( $image )
                {

                     $fullpath = ABSPATH . get_option( $store_name . '-image-path' );

                     $fullpath .= '/resized/' . $image;

                     @unlink( $fullpath );

                }

                wp_delete_post( $post->ID, true );

           }

           //
           //Insert operations follow....
           //

      }

 }
3
Shane

Chaque fois que vous obtenez get_posts ou WP_Query ou quoi que ce soit du genre, il est important de se rappeler que le code récupère en fait tous les articles en même temps et les charge en mémoire de la base de données. Si vous manquez de mémoire, votre processus mourra simplement avec une erreur. Cela se produira assez souvent si vous tentez d’obtenir un très grand nombre de messages à la fois.

Activer les display_errors de PHP. Vous verrez probablement une erreur de mémoire insuffisante.

Ensuite, augmentez le paramètre PHP memory_limit à 128M ou 256M et vérifiez si vous avez suffisamment de mémoire pour le faire.

Sinon, réécrivez votre get_posts pour utiliser la pagination. Obtenez-les 100 à la fois ou quelque chose du genre. Ensuite, vous n'essayez pas de mémoriser des milliers de publications en une fois.

5
Otto