Программно добавить изображения в библиотеку мультимедиа с помощью wp_generate_attachment_metadata случайно не удается

8

Я использую последнюю версию WordPress (4.6) на сервере LAMP (виртуальный хостинг) с версией PHP 5.6.12.

Я пытаюсь программно добавить 10 изображений , загруженных с помощью ftp в wp-uploadsкаталог, в библиотеку мультимедиа, используя три функции WordPress wp_insert_attachment, wp_generate_attachment_metadataи wp_update_attachment_metadata.

Моя проблема:

Иногда мой PHP-скрипт работает (все 10 изображений добавляются в медиатеку правильно), а иногда - нет (из 10 изображений добавляются только 4, 5, 6 или около того)! Размер каждого изображения составляет 2-4 метра.

Что я сделал до сих пор:

Я включил error_logging через php.ini и обнаружил, что время от времени происходит wp_generate_attachment_metadataсбой (т.е. при обработке 5-го, 6-го, 7-го или около того изображения), и весь мой PHP-скрипт завершается. Я не получаю больше информации от error_log (), кроме этого. Так как я подозревал проблемы с памятью, я увеличил объем памяти для php до 120M (мои провайдеры хостинга дают мне 128M) и выполнение скриптов до 100s (мой провайдер хостинга дает мне 120s). Все файлы существуют (конечно), все они в формате PNG - и, как я уже сказал, для тестирования используется один и тот же набор из 10 изображений, иногда он работает, а иногда не работает ...

Мой вопрос:

  • Есть ли известная проблема wp_generate_attachment_metadataв WP 4.6? Раньше все работало нормально, пока я не обновил свой сайт с WP 4.3 до 4.6 ...

  • Если проблема вызвана недостаточным объемом памяти, как я могу оптимизировать свой PHP-скрипт для обработки ограничения памяти 128 МБ, заданного моим веб-хостером?

  • Как я узнаю, что нехватка памяти приводит к прекращению работы моего PHP-скрипта?

Заранее спасибо!

Вот мой код:

$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);
}
Себастьян
источник

Ответы:

12

Я проверил ваш код, и я думаю, что вам не хватает направляющих изображений. Пожалуйста, посмотрите на код ниже:


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

Подробнее смотрите в функции wp_insert_attachment .

Сайед Фахар Аббас
источник
Спасибо, что указали на пропавшее без вести guid. Я добавлю это в мой код, попробуйте еще раз и сообщу, решит ли это проблему.
Себастьян
1
Хм, кажется, что пропажа guidвызвала проблему. С добавленным гидом теперь он работает на 100%. Принимая во внимание, что с отсутствующим гидом, иногда это работало, иногда это не работало - странно :-) СПАСИБО ВНОВЬ ashikra
Себастьян
Добро пожаловать @Sebastian :)
Сайед Фахар Аббас