Das programmgesteuerte Hinzufügen von Bildern zur Medienbibliothek mit wp_generate_attachment_metadata schlägt zufällig fehl


8

Ich verwende die neueste WordPress-Version (4.6) auf einem LAMP-Server (Shared Hosting) mit PHP-Version 5.6.12.

Ich versuche, programmatisch 10 Bilder hinzufügen , mit ftp auf das hochgeladenen wp-uploadsVerzeichnis, in die Medienbibliothek , die drei Wordpress - Funktionen wp_insert_attachment, wp_generate_attachment_metadataund wp_update_attachment_metadata.

Mein Problem:

Manchmal funktioniert mein PHP-Skript (alle 10 Bilder werden korrekt zur Medienbibliothek hinzugefügt) - und manchmal nicht (von den 10 Bildern werden nur 4, 5, 6 oder so hinzugefügt)! Jedes Bild ist 2 bis 4 Millionen groß.

Was ich bisher gemacht habe:

Ich habe error_logging über php.ini aktiviert und festgestellt, dass hin und wieder ein Fehler auftritt wp_generate_attachment_metadata(dh während der Bearbeitung des 5., 6., 7. oder so-Images) und mein gesamtes PHP-Skript beendet wird. Ich bekomme keine weiteren Informationen aus dem error_log (). Da ich Speicherprobleme vermutete, erhöhte ich die Speichergröße für PHP auf 120 MB (mein Hosting-Anbieter gibt mir 128 Millionen) und die Skriptausführung auf 100 Sekunden (mein Hosting-Anbieter gibt mir 120 Sekunden). Alle Dateien existieren (natürlich), sie sind alle PNGs - und wie gesagt, mit demselben Satz von 10 Bildern zum Testen funktioniert es manchmal und manchmal funktioniert es nicht ...

Meine Frage:

  • Gibt es ein bekanntes Problem mit wp_generate_attachment_metadatain WP 4.6? Früher hat alles gut funktioniert, bis ich meine Site von WP 4.3 auf 4.6 aktualisiert habe ...

  • Wenn nicht genügend Speicher das Problem verursacht, wie kann ich mein PHP-Skript optimieren, um das von meinem Webhoster angegebene 128-MB-Speicherlimit zu bewältigen?

  • Wie finde ich heraus, ob mein PHP-Skript aufgrund von Speichermangel beendet wird?

Danke im Voraus!

Hier ist mein 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);
}

Antworten:


12

Ich habe Ihren Code überprüft und ich denke, Sie vermissen die Anleitung der Bilder. Bitte schauen Sie sich den folgenden Code an:


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

Einzelheiten finden Sie in der Funktion wp_insert_attachment .


Vielen Dank, dass Sie guidmich auf das Vermisste hingewiesen haben. Ich werde das zu meinem Code hinzufügen, es erneut versuchen und Sie wissen lassen, ob das Problem dadurch behoben wird.
Sebastian

1
Hm, scheint das Fehlen guiddas Problem verursacht zu haben. Mit dem hinzugefügten Guid funktioniert es jetzt zu 100%. Während mit dem fehlenden Guid, manchmal funktionierte es, manchmal nicht - seltsam :-) DANKE WIEDER ashikra
Sebastian

Ihr Willkommen @Sebastian :)
Syed Fakhar Abbas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.