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.