Как установить избранное изображение (миниатюру) по URL-адресу изображения при использовании wp_insert_post ()?
5 ответ
- голосов
-
- 2012-02-05
Вы можете установить изображение в качестве миниатюры сообщения,когда оно находится в медиатеке. Чтобы добавить изображение в свою медиатеку,вам необходимо загрузить его на свой сервер. В WordPress уже есть функция для размещения изображений в вашей медиатеке,вам нужен только скрипт,который загружает ваш файл.
Использование:
Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id ); // $post_id is Numeric ID... You can also get the ID with: wp_insert_post()
Функция:
function Generate_Featured_Image( $image_url, $post_id ){ $upload_dir = wp_upload_dir(); $image_data = file_get_contents($image_url); $filename = basename($image_url); if(wp_mkdir_p($upload_dir['path'])) $file = $upload_dir['path'] . '/' . $filename; else $file = $upload_dir['basedir'] . '/' . $filename; file_put_contents($file, $image_data); $wp_filetype = wp_check_filetype($filename, null ); $attachment = array( 'post_mime_type' => $wp_filetype['type'], 'post_title' => sanitize_file_name($filename), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $file, $post_id ); require_once(ABSPATH . 'wp-admin/includes/image.php'); $attach_data = wp_generate_attachment_metadata( $attach_id, $file ); $res1= wp_update_attachment_metadata( $attach_id, $attach_data ); $res2= set_post_thumbnail( $post_id, $attach_id ); }
http://codex.wordpress.org/Function_Reference/wp_upload_dir
http://codex.wordpress.org/Function_Reference/wp_insert_attachment
РЕДАКТИРОВАТЬ: Добавлено создание пути
You can set an image as post thumbnail when it is in your media library. To add an image in your media library you need to upload it to your server. WordPress already has a function for putting images in your media library, you only need a script that uploads your file.
Usage:
Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id ); // $post_id is Numeric ID... You can also get the ID with: wp_insert_post()
Function:
function Generate_Featured_Image( $image_url, $post_id ){ $upload_dir = wp_upload_dir(); $image_data = file_get_contents($image_url); $filename = basename($image_url); if(wp_mkdir_p($upload_dir['path'])) $file = $upload_dir['path'] . '/' . $filename; else $file = $upload_dir['basedir'] . '/' . $filename; file_put_contents($file, $image_data); $wp_filetype = wp_check_filetype($filename, null ); $attachment = array( 'post_mime_type' => $wp_filetype['type'], 'post_title' => sanitize_file_name($filename), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $file, $post_id ); require_once(ABSPATH . 'wp-admin/includes/image.php'); $attach_data = wp_generate_attachment_metadata( $attach_id, $file ); $res1= wp_update_attachment_metadata( $attach_id, $attach_data ); $res2= set_post_thumbnail( $post_id, $attach_id ); }
http://codex.wordpress.org/Function_Reference/wp_upload_dir
http://codex.wordpress.org/Function_Reference/wp_insert_attachment
EDIT: Added path creation
-
Спасибо за старания!Это работает только при использовании $ upload_dir ['basedir'] (а не пути),потому что,когда я проверяю вложение через интерфейс редактирования сообщения,оно обозначается как .../uploads/FILENAME.EXT,а $ upload_dir ['path'] сохранит его примерно в .../uploads/2012/02/FILENAME.EXT. Было бы даже лучше как-то изменить способ ссылки на файл,но я не знаю,как это сделать.Thank you for your efforts! This only works when using $upload_dir['basedir'] (rather than path) though, because when I inspect the attachment through the post edit interface it is referenced as .../uploads/FILENAME.EXT while $upload_dir['path'] would store it in something like .../uploads/2012/02/FILENAME.EXT. It might be even better to somehow change how the file is referenced, but I wouldn't know how.
- 0
- 2012-02-06
- Chris
-
В мой ответ добавлено создание пути.Added path creation in my answer.
- 1
- 2012-02-06
- Rob Vermeer
-
Ценю ваш быстрый ответ :).Однако я по-прежнему получаю тот же результат,вот скриншот,показывающий мою проблему: http://i.imgur.com/iKTNs.png.Верхняя часть - это результат размещения эха в вашем условном выражении,просто чтобы увидеть,что происходит.Appreciate your quick response :). I still get the same result however, here's a screenshot displaying my problem: http://i.imgur.com/iKTNs.png . The upper section is the result of placing an echo in your conditional, just to see what's going on.
- 0
- 2012-02-06
- Chris
-
Снова изменил,не передавал полный путь к wp_insert_attachment и wp_generate_attachment_metadata.Надеюсь,это решит проблему.Changed it again, didn't pass the full path to wp_insert_attachment and wp_generate_attachment_metadata. Hope this will solve the problem.
- 0
- 2012-02-06
- Rob Vermeer
-
Работает безупречно,большое вам спасибо!Это также устранило проблему с размером,которая,по-видимому,была вызвана неправильными путями (даже если изображение отображалось).Лучше и быть не может!Works flawlessly, thank you so much! This has also fixed a sizing issue, which was apparently caused by incorrect paths (even though the image would show up). Couldn't be any better!
- 0
- 2012-02-06
- Chris
-
Спасибо за отличный код.Требовалась только одна поправка,чтобы заставить его работать с моим импортом CSV,а именно добавлениеpostid к имени файла,чтобы файлы изображений оставались уникальными.Thanks for your great code. Only one amendment was needed to get it to work with my CSV import and that was prepending the postid to the filename to ensure the image files remain unique.
- 0
- 2012-12-07
- Dave Hilditch
-
Позвольте мне также высыпать похвалы.Мне нравится этот фрагмент кода.Спасибо,что сэкономили мне часы!Let me also heap on the praise. Love this snippet of code. Thanks for saving me hours!
- 0
- 2013-02-11
- bkwdesign
-
Просто интересно: это безопасно?Есть ли риск того,что кто-то замаскирует изображение,или wp_check_filetype () позаботится об этом?Just wondering: Is this safe? Is there a risk of someone disguising an image, or does wp_check_filetype() take care of that?
- 0
- 2015-02-14
- LOLapalooza
-
Я использовал приведенный выше код и немного изменил его,чтобы получить избранные изображения,которые называются заголовком сообщения (что довольно много времени,если вы запускаете тысячи сообщений): `код`I used the code above and slightly amended to get featured images which are named as the post slug (which is quite time consuming if you run thousands of posts): `code`
- 0
- 2017-01-19
- Traveler
-
использование `file_get_contents` с URL-адресом не будет работать,если` allow_url_fopen` отключен в `php.ini` - [` wp_remote_get`] (https://codex.wordpress.org/Function_Reference/wp_remote_get) будет более совместимым междуразные среды WPusage of `file_get_contents` with a URL will not work if `allow_url_fopen` is disabled in `php.ini` - [`wp_remote_get`](https://codex.wordpress.org/Function_Reference/wp_remote_get) will be more highly compatible across different WP environments
- 0
- 2017-02-24
- highvolt
-
Предупреждение: этот ответ перезаписывает файл,если он имеет то же имя,будьте осторожны.Он должен генерировать имена с помощью $post_id или хотя бы uniqid ()Warning: This answer rewrites the file if it has the same name, beware. It should generate names using $post_id or at least uniqid()
- 1
- 2017-05-31
- Ivan Castellanos
-
Когда я использую это,изображения,созданные в «загрузках»,имеют нулевой размер файла.When I use this, the images created in "uploads" have a file size of zero.
- 0
- 2018-03-23
- PJ Brunet
-
- 2016-03-02
Я хотел бы улучшить ответ Робса,используя основные функции WP
download_url
иmedia_handle_sideload
<?php /** * Downloads an image from the specified URL and attaches it to a post as a post thumbnail. * * @param string $file The URL of the image to download. * @param int $post_id The post ID the post thumbnail is to be associated with. * @param string $desc Optional. Description of the image. * @return string|WP_Error Attachment ID, WP_Error object otherwise. */ function Generate_Featured_Image( $file, $post_id, $desc ){ // Set variables for storage, fix file filename for query strings. preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches ); if ( ! $matches ) { return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) ); } $file_array = array(); $file_array['name'] = basename( $matches[0] ); // Download file to temp location. $file_array['tmp_name'] = download_url( $file ); // If error storing temporarily, return the error. if ( is_wp_error( $file_array['tmp_name'] ) ) { return $file_array['tmp_name']; } // Do the validation and storage stuff. $id = media_handle_sideload( $file_array, $post_id, $desc ); // If error storing permanently, unlink. if ( is_wp_error( $id ) ) { @unlink( $file_array['tmp_name'] ); return $id; } return set_post_thumbnail( $post_id, $id ); }
I'd like to improve Robs answer by utilizing the WP core functions
download_url
andmedia_handle_sideload
<?php /** * Downloads an image from the specified URL and attaches it to a post as a post thumbnail. * * @param string $file The URL of the image to download. * @param int $post_id The post ID the post thumbnail is to be associated with. * @param string $desc Optional. Description of the image. * @return string|WP_Error Attachment ID, WP_Error object otherwise. */ function Generate_Featured_Image( $file, $post_id, $desc ){ // Set variables for storage, fix file filename for query strings. preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches ); if ( ! $matches ) { return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) ); } $file_array = array(); $file_array['name'] = basename( $matches[0] ); // Download file to temp location. $file_array['tmp_name'] = download_url( $file ); // If error storing temporarily, return the error. if ( is_wp_error( $file_array['tmp_name'] ) ) { return $file_array['tmp_name']; } // Do the validation and storage stuff. $id = media_handle_sideload( $file_array, $post_id, $desc ); // If error storing permanently, unlink. if ( is_wp_error( $id ) ) { @unlink( $file_array['tmp_name'] ); return $id; } return set_post_thumbnail( $post_id, $id ); }
-
Лучше всего использовать собственные функции WordPress,спасибо.Using the WordPress native functions are the best practice, Thank you.
- 1
- 2018-09-15
- Mostafa Soufi
-
По какой-то причине эта версия выдавала мне ошибку: «Действительный URL не был предоставлен».,тогда как [ответ Роба Вермеера] (https://wordpress.stackexchange.com/a/41300/122391) работал.For some reason, this version gave me errors saying "A valid URL was not provided." , whereas [Rob Vermeer's answer](https://wordpress.stackexchange.com/a/41300/122391) worked.
- 0
- 2019-08-28
- Flimm
-
- 2012-01-26
Попробуйте использовать
set_post_thumbnail()
.Правка Отто: Вы разъяснили свой вопрос,поэтому я уточню ответ,который дал Чип.
По сути,вам также нужно прикрепить к сообщению «вложение». Когда изображение загружается в медиа-библиотеку WordPress,для него создается специальная запись с типом вложения. Это вложение связано с определенной записью через идентификаторpost_parent.
Итак,если вы знаете идентификатор вложения,то вызов set_post_thumbnail с объектом или идентификатором сообщения и идентификатором вложения просто установит флаг миниатюры сообщения.
Если вы еще не создали вложение,вам нужно будет сделать это в первую очередь. Самый простой способ сделать это - использовать
wp_insert_attachment()
. Эта функция принимает массив из нескольких параметров,имени файла (файл уже должен находиться в соответствующем каталоге для загрузки) и идентификатора родительского сообщения,к которому вы хотите прикрепить вложение.Просто загрузка файла и прикрепление к сообщению ничего не делает автоматически. Это просто своего рода механизм категоризации. Механизм галереи,например,использует прикрепленные изображения сообщения для создания [галереи] для этого сообщения. Миниатюра для сообщения - это просто одно из прикрепленных изображений,которое должно быть миниатюрой.
Дополнительную информацию о том,как использовать wp_insert_attachment,можно найти в кодексе (ссылка выше).
Try using
set_post_thumbnail()
.Edit by Otto: You clarified your question, so I'll clarify the response Chip gave.
Basically, you need to make the 'attachment' for the post as well. When an image is uploaded into the WordPress media library, a special post entry is made for it with a post type of attachment. This attachment is linked to some specific post via the post_parent identifier.
So if you know the ID of the attachment, then calling set_post_thumbnail with the post object or ID and the attachment ID will simply set the post thumbnail flag.
If you have not created the attachment yet, then you will need to do that first. Easiest way to do that is with
wp_insert_attachment()
. This function takes an array of a few parameters, the filename (the file must already be in the proper uploads directory), and the post ID of the parent post that you want to attach the attachment to.Just having a file uploaded and attached to a post doesn't do anything automatically. This is simply a sort of categorization mechanism. The gallery mechanism, for example, uses the attached images of a post to build the [gallery] for that post. A thumbnail for a post is just one of the attached images which has be set to be the thumbnail.
More info on how to use wp_insert_attachment can be found in the codex (linked above).
-
Спасибо за ваш ответ!Но как мне получить идентификатор эскиза?Я начинаю с URL-адреса изображения,поэтому,думаю,мне нужно как-то добавить изображение в библиотеку wordpress,используя другую функцию?Thank you for your reply! How would I retrieve the thumbnail ID, though? I'm starting out with an image URL, so I guess I should somehow add an image to the wordpress library using another function?
- 0
- 2012-01-27
- Chris
-
Поскольку вы уже * вставляете * сообщение,я предполагал,что вы уже * прикрепляете изображения * к вставляемому сообщению.Разве это неверное предположение?As you are already *inserting* a post, I had assumed that you were already *attaching images* to the post you're inserting. Is that not a valid assumption?
- 0
- 2012-01-27
- Chip Bennett
-
Извините,но я еще не понял,как на самом деле прикреплять изображения к сообщению по URL-адресу.Кроме того,я бы не хотел,чтобы изображение отображалось в самом сообщении.В настоящее время я ищу функцию,которая вернет $thumbnail_id,и подумал,что,возможно,wp_insert_attachment () будет работать,пока я не заметил,что это уже требует,чтобы вложение находилось в каталоге загрузки.Я не знаю,как получить там файл изображения по его URL-адресу,и я не уверен,что это именно та функция,которую я ищу в первую очередь.Спасибо за помощь!Sorry, but I have not yet found out how to actually attach images to a post by URL. Also, I would not want the image to actually be displayed in the post itself. I'm currently looking for the function which will return the $thumbnail_id, and thought that maybe wp_insert_attachment() would work, until I noticed it already required the attachment to be in the upload directory. I don't know how to get an image file there by its URL, and I'm not sure whether this is the function I'm looking for in the first place. Thank you for your help!
- 0
- 2012-01-27
- Chris
-
Не могли бы вы ** переписать свой вопрос ** с этой информацией,чтобы лучше описать то,что вы пытаетесь достичь?(Или оставьте это как есть и начните новый вопрос,чтобы спросить,как получить идентификатор вложения при вставке сообщения?)Can you please **rewrite your question** with this information, to better-describe what you're trying to accomplish? (Or, leave this one as-is, and start a new question, to ask how to get the attachment ID when inserting a post?)
- 0
- 2012-01-27
- Chip Bennett
-
Исходный вопрос был отредактирован и частично перефразирован,пожалуйста,проверьте его :).The original question has been edited and partly rephrased, please check back :).
- 0
- 2012-01-27
- Chris
-
- 2012-02-06
set_post_thumbnail()
- лучшая функция для этого требования.Я думаю,вы можете найти идентификатор вложения через
get_children()
илиget_posts()
. У результата есть массив,и внутри этого массива находится идентификатор. Следующий пример для тестирования; надеюсь это работает; пишите без тестов,только на пустом месте.Для вашего требования важно,чтобы вы изменили
get_the_ID()
на свойpost-ID
; вернуть идентификатор вложения,и вы можете использоватьfothset_post_thumbnail()
.$attachments = get_children( array( 'post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' => 'image' ) ); foreach ( $attachments as $attachment_id => $attachment ) { echo wp_get_attachment_image($attachment_id); }
set_post_thumbnail()
is the best function for this requirement.I think, you find the ID of an attachment via
get_children()
orget_posts()
. The result have an array and inside this array is the ID. The follow example for testing; i hope it works; write without tests, only on scratch.For your requirement it is important, that you change
get_the_ID()
with yourpost-ID
; return the ID of the Attachment and this can you use fothset_post_thumbnail()
.$attachments = get_children( array( 'post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' => 'image' ) ); foreach ( $attachments as $attachment_id => $attachment ) { echo wp_get_attachment_image($attachment_id); }
-
- 2015-02-20
Я нашел это и сделал его намного проще,работает,но я не скруббер безопасности
if(!empty($_FILES)){ require_once( ABSPATH . 'wp-admin/includes/post.php' ); require_once( ABSPATH . 'wp-admin/includes/image.php' ); require_once( ABSPATH . 'wp-admin/includes/file.php' ); require_once( ABSPATH . 'wp-admin/includes/media.php' ); $post_ID = "your post id!"; $attachment_id = media_handle_upload( 'file', $post_ID ); set_post_thumbnail( $post_ID, $attachment_id ); }
просто что ли?после получения нужных файлов wordpress обработает медиафайлы и загрузит их,а затем установит в качестве эскиза.
Just found this and made it much simpler, works but I'm no security scrubber
if(!empty($_FILES)){ require_once( ABSPATH . 'wp-admin/includes/post.php' ); require_once( ABSPATH . 'wp-admin/includes/image.php' ); require_once( ABSPATH . 'wp-admin/includes/file.php' ); require_once( ABSPATH . 'wp-admin/includes/media.php' ); $post_ID = "your post id!"; $attachment_id = media_handle_upload( 'file', $post_ID ); set_post_thumbnail( $post_ID, $attachment_id ); }
simple or what? after getting the right files, wordpress will handle the media and upload it, then set it as a thumbnail.
Просматривая справочную запись функции для wp_insert_post () ,я заметил,что в требуемом массиве нет параметра что позволит мне установить "Featured Image" для сообщения,отображаемое как эскиз сообщения в моей теме.
Я изучал такие функции,как set_post_thumbnail () ,как предложил г-н Беннетт,но это,похоже,относительно новое дополнение к самому WordPress и кодексу WordPress. Таким образом,я не могу найти никаких источников,которые объясняли бы,как следует получить и предоставить параметр $thumbnail_id. Если это действительно та функция,которую нужно использовать,каким образом я могу предоставить ей действительный параметр $thumbnail_id,когда у меня есть только URL-адрес изображения?
Заранее спасибо!