L'ajout par programme d'images à la bibliothèque multimédia avec wp_generate_attachment_metadata échoue de manière aléatoire


8

J'utilise la dernière version de WordPress (4.6) sur un serveur LAMP (hébergement partagé) avec PHP version 5.6.12.

J'essaie d' ajouter par programme 10 images , téléchargées avec ftp dans le wp-uploadsrépertoire, à la bibliothèque multimédia en utilisant les trois fonctions WordPress wp_insert_attachment, wp_generate_attachment_metadataet wp_update_attachment_metadata.

Mon problème:

Parfois, mon script PHP fonctionne (les 10 images sont correctement ajoutées à la bibliothèque multimédia) - et parfois non (sur les 10 images, seulement 4, 5, 6 environ sont ajoutées)! Chaque image a une taille de 2M à 4M.

Ce que j'ai fait jusqu'à présent:

J'ai activé error_logging via php.ini et j'ai découvert que de temps en temps wp_generate_attachment_metadataéchoue (c'est-à-dire lors de la gestion de la 5ème, 6ème, 7ème image) et mon script PHP complet se termine. Je n'obtiens plus d'informations de error_log () à part ça. Comme je soupçonnais des problèmes de mémoire, j'ai augmenté la taille de la mémoire pour php à 120M (mes hébergeurs me donnent 128M) et l'exécution du script à 100s (mon hébergeur me donne 120s). Tous les fichiers existent (bien sûr), ce sont tous des fichiers PNG - et, comme je l'ai dit, en utilisant le même ensemble de 10 images pour les tests, cela fonctionne parfois et parfois cela ne fonctionne pas ...

Ma question:

  • Existe-t-il un problème connu avec wp_generate_attachment_metadataWP 4.6? Tout fonctionnait bien jusqu'à ce que je mette à jour mon site de WP 4.3 à 4.6 ...

  • Si la mémoire insuffisante est à l'origine du problème, comment pourrais-je optimiser mon script PHP pour gérer la limite de mémoire de 128 Mo donnée par mon hébergeur?

  • Comment savoir si un manque de mémoire entraîne la fin de mon script PHP?

Merci d'avance!

Voici mon code:

$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');

for($i = 0; $i < 10; $i++) {
  $attachment = array(
    'post_mime_type' => 'image/png',
    'post_title' => 'my description',
    'post_content' => 'my description',
    'post_status' => 'inherit'
  );
  $image_id = wp_insert_attachment($attachment, $images[$i], $post_id);
  $image_data = wp_generate_attachment_metadata($image_id, $images[$i]);
  wp_update_attachment_metadata($image_id, $image_data);
}

Réponses:


12

J'ai vérifié votre code et je pense que le guide des images vous manque. Veuillez consulter le code ci-dessous:


$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');

// Get the path to the upload directory.
$wp_upload_dir = wp_upload_dir();

foreach($images as $name) {
    $attachment = array(
        'guid'=> $wp_upload_dir['url'] . '/' . basename( $name ), 
        'post_mime_type' => 'image/png',
        'post_title' => 'my description',
        'post_content' => 'my description',
        'post_status' => 'inherit'
         );
$image_id = wp_insert_attachment($attachment, $name, $post_id);
// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it. require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Generate the metadata for the attachment, and update the database record. $attach_data = wp_generate_attachment_metadata( $image_id, $name );
wp_update_attachment_metadata( $image_id, $attach_data );
}

Pour plus de détails, regardez la fonction wp_insert_attachment .


Merci de m'avoir signalé les disparus guid. Je vais ajouter cela à mon code, réessayer et vous faire savoir si cela résout le problème.
Sebastian

1
Hm, il semble que les disparus aient guidcausé le problème. Avec le guid ajouté, il fonctionne désormais à 100%. Alors que le guid manquait, parfois ça fonctionnait, parfois ça ne marchait pas - étrange :-) MERCI ENCORE ashikra
Sebastian

Votre bienvenue @Sebastian :)
Syed Fakhar Abbas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.