2011-12-22 2 views
3

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

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

Я получил часть 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 

ответ

3

После перекрестная проверка с основными файлами 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 ($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'); 

снаружи (выше) для цикла.

ОБНОВЛЕНИЕ 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' 
); 

К

// 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' 
    ); 
+0

Хм, вы правы. Спасибо за предложение. Тем не менее, часть копии не работает. Есть какие-то мысли? –

+1

Обновленный ответ, пожалуйста, проверьте после ОБНОВЛЕНИЯ 1: – tamilsweet

+0

Я закончил тем, что переместил экземпляр экземпляра в свою собственную функцию, и теперь он работает. Проблема заключалась в том, что PHP copy() не похож на cp из оболочки, поскольку вторым аргументом должно быть имя файла ** в каталоге назначения **, а не только имя каталога. so path/to/file/filename.ext не просто путь/в/файл –