Попытка генерировать миниатюры WordPress программно - PullRequest
3 голосов
/ 23 декабря 2011

Я пытаюсь добавить кучу постов программно, а затем добавить сопровождающие их изображения.У меня есть массив со всеми именами файлов изображений, и я смог добавить их в базу данных, но я не могу создать нужные миниатюры.

Посты поступают изCSV находится в wp-content / uploads / dirname /.У них есть имена в именах файлов, которые соответствуют идентификатору в CSV, поэтому я знаю, какие изображения нужно добавить к какому идентификатору записи.

Я получил часть wp_insert_attachment () для работы сизображения прямо в их собственном небольшом каталоге, но я не мог получить эскизы для генерации.Я установил плагин регенерировать миниатюры, и он смог сгенерировать их, но я не могу заставить это произойти программно.

Я подумал, что это может быть потому, что wp_generate_attachment требует, чтобы фотографии были в / uploads / 2011/12 / (например), поэтому я начал двигаться по пути перемещения изображений, а затем пытался добавить их.В любом случае это имеет смысл, потому что я хочу сделать копии, а не добавлять 5 или 6 разных размеров медиафайлов в мой wp-content / uploads / dirname / dir.

Во всяком случае, это не работает.Перемещение изображений с помощью копии PHP не работает, а эскизы не создаются.

foreach ($frazerfiles[$stock_num] as $stock_img){
  require_once(ABSPATH . 'wp-admin/includes/image.php');
  echo "... ...Trying to add attachment metadata...";

  // copy the file to the upload dir
  $uploads = wp_upload_dir();
  $file_to_move = ABSPATH."wp-content/uploads/".$stock_img;
  if (copy($file_to_move, $uploads['path']."/")) {
    echo "Moved $file_to_move to ".$uploads['path']."/";
    $my_moved_file = $uploads['path']."/".$stock_img;

    // I think this is failing because the images aren't in the upload dir.
    $attachment = array(
       'post_mime_type' => $wp_filetype['type'],
       'post_title' => preg_replace('/\.[^.]+$/', '', basename($stock_img)),
       'post_content' => '',
       'post_status' => 'inherit'
    );
    if ($attach_id = wp_insert_attachment( $attachment, $my_moved_file, $newpostid )) {
      if ($attach_data = wp_generate_attachment_metadata( $attach_id, $my_moved_file)) {
        echo "...success for $my_moved_file: ID:$attach_id<br />\n";
      } else {
        echo "...FAILED for $my_moved_file ID:$attach_id<br />\n";
        print_r($attach_data);
      }
    } else { // inserting attachment failed
      echo "Insert attachment failed for $my_moved_file to $newpostid<br />\n"; 
    }
  } else {
    echo "Failed moving $file_to_move to ".$uploads['path']."/";
  }


}// images foreach

1 Ответ

3 голосов
/ 23 декабря 2011

После перекрестной проверки с основными файлами WordPress единственное, что, по-видимому, отсутствует - это wp_update_attachment_metadata сразу после wp_generate_attachment_metadata.

Попробуйте добавить

wp_update_attachment_metadata($attach_id, $attach_data);

после

echo "...success for $my_moved_file: ID:$attach_id<br />\n";

Таким образом, блок if выглядит следующим образом:

 if ($attach_data = wp_generate_attachment_metadata( $attach_id, $my_moved_file)) {
    echo "...success for $my_moved_file: ID:$attach_id<br />\n";
    wp_update_attachment_metadata($attach_id, $attach_data);
  } else {
    echo "...FAILED for $my_moved_file ID:$attach_id<br />\n";
    print_r($attach_data);
  }

Предложение: (не относится к вопросу)

переместить строку

require_once(ABSPATH . 'wp-admin/includes/image.php');

вне (над) цикла for.

ОБНОВЛЕНИЕ 1: добавление предложения по устранению проблемы с копированием.Вы пропустили строку "проверить тип файла".(Функция копирования PHP не будет работать, если целевой файл ($my_moved_file) уже существует)

Изменить этот код

// copy the file to the upload dir
$uploads = wp_upload_dir();
$file_to_move = ABSPATH."wp-content/uploads/".$stock_img;
if (copy($file_to_move, $uploads['path']."/")) {
echo "Moved $file_to_move to ".$uploads['path']."/";
$my_moved_file = $uploads['path']."/".$stock_img;

// I think this is failing because the images aren't in the upload dir.
$attachment = array(
   'post_mime_type' => $wp_filetype['type'],
   'post_title' => preg_replace('/\.[^.]+$/', '', basename($stock_img)),
   'post_content' => '',
   'post_status' => 'inherit'
);

TO

// copy the file to the upload dir
$uploads = wp_upload_dir();
$file_to_move = ABSPATH."wp-content/uploads/".$stock_img;
$my_moved_file = $uploads['path']."/".$stock_img;
if (copy($file_to_move, $my_moved_file)) {
    echo "Moved $file_to_move to ".$my_moved_file;

    // Check the file type
    $wp_filetype = wp_check_filetype(basename($my_moved_file), null );

    $attachment = array(
       'post_mime_type' => $wp_filetype['type'],
       'post_title' => preg_replace('/\.[^.]+$/', '', basename($my_moved_file)),
       'post_content' => '',
       'post_status' => 'inherit'
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...