Я создаю собственный плагин для WordPress, чтобы загружать свои продукты из моей базы данных в WooCommerce. Вся логика работает отлично, но когда дело доходит до загрузки изображений и прикрепления их к товару, то она не работает.
Я попытался использовать обычную копию из исходного кода в локальный каталог, а затем создать медиапост, но это не сработало.
Это то, что я пытаюсь сейчас:
$image_id = media_sideload_image(
urlencode( $item['ImgPath1'] ),
$post_id,
$item['Title'],
'id'
);
add_post_meta( $post_id, '_thumbnail_id', $image_id );
Я также пробовал:
$filename = basename( $source ); // Get the filename including extension from the $fileurl e.g. myimage.jpg
$destination = WP_CONTENT_DIR. '/uploads/product_images/' . $filename; // Specify where we wish to upload the file, generally in the wp uploads directory
copy( $source, $destination ); // Copy the file
$filetype = wp_check_filetype( $destination ); // Get the mime type of the file
$attachment = array( // Set up our images post data
'guid' => get_option( 'siteurl' ) . '/wp-content/uploads/product_images/' . $filename,
'post_mime_type' => $filetype['type'],
'post_title' => $filename,
'post_author' => 1,
'post_content' => ''
);
Я ожидаю, по крайней мере, увидеть изображения на ftp, но ничего не сообщается, и мой импорт продукта продолжается без каких-либо проблем.






Ваш второй пример кажется неполным, поэтому я проигнорирую его и сосредоточусь на исправлении первого.
Проблема с вашим первым примером заключается в том, что media_sideload_image() предназначен для использования с внешним URL-адресом, а не с путем к файлу на том же сервере. Однако большая часть внутренней работы этой функции на самом деле происходит в media_handle_sideload(), который вызывается после загрузки файла во временное место на локальном сервере.
Следующий код был написан в основном из памяти и не тестировался, но должен работать:
function insert_media_from_path( $file_path, $attach_to = 0, $title = null, $delete_original = false ) {
if ( !file_exists( $file_path ) ) {
return false;
}
$file_array = array(
'name' => basename($file_path),
'tmp_name' => $file_path
);
$id = media_handle_sideload( $file_array, $attach_to, $title );
if ( $id && $delete_original ) {
unlink( $file_path );
}
return $id;
}
Можете ли вы опубликовать пример содержимого массива $item из первого опубликованного вами фрагмента кода?
Я на самом деле пытаюсь скопировать из внешнего источника. второй пример я пытаюсь скопировать из моего внешнего источника в локальный источник, а затем прикрепить его.