Como faço para definir uma imagem em destaque (miniatura) por URL da imagem ao usar wp_insert_post ()?
5 respostas
- votos
-
- 2012-02-05
Vocêpode definir umaimagem comopós-miniatura quandoestiverem suabiblioteca demídia. Para adicionar umaimagemna suabiblioteca demídia,vocêprecisaenviá-lopara o seu servidor. O WordPressjátem umafunçãopara colocarimagensem suabiblioteca demídia,você sóprecisa de um script que carrega seu arquivo.
Uso:
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()
Função:
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
editar: Criação de caminho adicionado
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
-
Obrigadopor seusesforços!Isso sófunciona ao usar $ upload_dir ['BEGEDIR'] (em vez de caminho),porque quandoeuinspecionar o anexo através dainterface Post Edit,é referenciada como .../Uploads/filename.extenquanto $ upload_dir ['caminho'] Levariaem algo como .../Upload/2012/02/filename.ext. Pode ser aindamelhormudar de algumaforma como o arquivo é referenciado,maseunão saberia como.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
-
Acrescentou criação de caminhonaminha resposta.Added path creation in my answer.
- 1
- 2012-02-06
- Rob Vermeer
-
Aprecie sua resposta rápida :).Eu ainda recebo omesmo resultado,porém,aquiestá uma captura detelaexibindomeuproblema: http://i.imgur.com/iktns.png.A seção superior é o resultado de colocar umecoem seu condicional,sópara ver o queestá acontecendo.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
-
Mudounovamente,nãopassou o caminho completopara wp_insert_attachmente wp_generate_attachment_metadata.Espero queisso resolva oproblema.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
-
Funcionaperfeitamente,muito obrigado!Issotambém consertou uma questão de dimensionamento,que aparentementefoi causadapor caminhosincorretos (mesmo que aimagem aparecesse).Nãopoderia sermelhor!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
-
Obrigadopelo seugrande código.Apenas uma alteraçãoeranecessáriaparafuncionar com aminhaimportação do CSVe que sepreparou opostidpara onome do arquivoparagarantir que os arquivos deimagempermaneçamexclusivos.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
-
Deixe-metambém amontoar sobre o louvor.Ameestetrecho de código.Obrigadoporme salvar horas!Let me also heap on the praise. Love this snippet of code. Thanks for saving me hours!
- 0
- 2013-02-11
- bkwdesign
-
Apenas seperguntando:isso é seguro?Existe um risco de alguém disfarçar umaimagem,ou o WP_CHECK_FILETYPE () cuida disso?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
-
Eu usei o código acimae ligeiramente alteradopara obterimagensem destaque que sãonomeadas como opós-slug (o que ébastante demorado se vocêexecutarmilhares depostagens): `código` Php. $ slug=basename (get_permalink ()); $ FeaturedEmageUrl='[seu caminho]/wp-conte content/uploads/entrega/contribui/'.$ slug.'.png'; Generate_Feature_Image ($ FaturedImageurl,$post_id); ?>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
-
Uso de `file_get_contents` com um URLnãofuncionará se 'Allow_url_fopen'está desativadoem`php.ini` - [`wp_remote_get`] (https://codex.wordpress.org/function_reference/wp_remote_get) serámais altamente compatívelambientes diferentes da WP.usage 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
-
Aviso: Esta resposta reescreve o arquivo setiver omesmonome,cuidado.Devegerarnomes usando $post_id oupelomenos 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
-
Quandoeu usoisso,asimagens criadasem "uploads"têm umtamanho de arquivo de zero.When I use this, the images created in "uploads" have a file size of zero.
- 0
- 2018-03-23
- PJ Brunet
-
- 2016-03-02
Eugostaria demelhorar a resposta de ROBs utilizando asfunções donúcleo WP
download_url
emedia_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 ); }
-
Usando asfunçõesnativas do WordPress são asmelhorespráticas,obrigado.Using the WordPress native functions are the best practice, Thank you.
- 1
- 2018-09-15
- Mostafa Soufi
-
Por alguma razão,esta versãome deuerros dizendo "Um URL válidonãofoifornecido".,enquanto a resposta do [Rob Vermeer] (https://wordpress.stackexchange.com/a/41300/122391)funcionou.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
tente usar
set_post_thumbnail()
.editarpor Otto: Vocêesclareceu suapergunta,entãoeu vouesclarecer o chip de resposta deu.
Basicamente,vocêprecisafazer o "anexo"para oposttambém. Quando umaimagem é carregadanabiblioteca demídia do WordPress,umaentrada depostagemespecial éfeitaparaele com umtipo de anexo. Este anexoestá vinculado a algumpostespecífico através doidentificadorpost_parent.
Então,se você souber o ID do anexo,então chamando set_post_thumbnail com o objeto depostagem ou IDe o ID do anexo simplesmente definirá o sinalizador deminiaturaspostais.
Se você aindanão criou o anexo,então vocêprecisaráfazerissoprimeiro. Maneiramaisfácil defazerisso é com
wp_insert_attachment()
. Estafunção leva umamatriz de algunsparâmetros,onome do arquivo (o arquivojá deveestarno diretório de uploads apropriados),e o ID POST do POSTpai que você deseja anexar.Apenaster um arquivo carregadoe anexado a umpostnãofaznada automaticamente. Isso é simplesmente umaespécie demecanismo de categorização. Omecanismo degaleria,porexemplo,usa asimagens anexadas de umpostpara construir a [Galeria]paraessepost. Umaminiaturapara umpost é apenas uma dasimagens anexadas que são definidaspara ser aminiatura.
Maisinformações sobre como usar wp_insert_attachmentpodem serencontradosno Codex (ligado acima).
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).
-
Obrigadopor sua resposta!Comoeu recuperaria o ID daminiatura,noentanto?Estou começando com um URL daimagem,então acho que devo adicionar umaimagem àbiblioteca do WordPress usando outrafunção?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
-
Como vocêjáestá * Inserindo * Umpost,eu assumi que vocêjáestava anexandoimagens * aopost que vocêestáinserindo.Issonão é uma suposição válida?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
-
Desculpe,mas aindanão descobri como anexarimagens a umpostpor URL.Além disso,eunãogostaria que aimagem seja realmenteexibidanopostem si.Atualmenteestouprocurando afunção que retornará a $thumbnail_id,e pensei quetalvez wp_insert_attachment ()funcionaria,até queeunotei quejáexigia que o anexoestejano diretório de upload.Eunão sei como obter um arquivo deimagem lápor sua URL,e nãotenho certeza seesta é afunção queestouprocurandoem primeiro lugar.Obrigadopela ajuda!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
-
Vocêpodeporfavor ** Reescreva suapergunta ** Comestainformação,para descrevermelhor o que vocêestátentando realizar?(Ou,deixeeste como é,e iniciar umanovapergunta,paraperguntar como obter o ID do anexo aoinserir umpost?)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
-
Apergunta originalfoieditadae parcialmente reformulada,porfavor,volte :).The original question has been edited and partly rephrased, please check back :).
- 0
- 2012-01-27
- Chris
-
- 2012-02-06
set_post_thumbnail()
é amelhorfunçãoparaeste requisito.Eu acho que vocêencontra o ID de um anexo via
get_children()
ouget_posts()
. O resultadotem umamatrize dentro destamatriz é o ID. O seguinteexemploparatestes;euespero que dê certo; Escreva semtestes,apenasno zero.Para o seu requisito éimportante,que você altera
get_the_ID()
com o seupost-ID
; Retorna o ID do anexoe issopode usar o 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
Acabei deencontrarissoe tornoumuitomais simples,funciona,masnão sou lavador de segurança
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 ); }
Simples ou o quê?Depois de obter os arquivos corretos,o WordPressmanipulará amídiae o upload,depois configurá-lo como umaminiatura.
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.
enquanto olha através do Entrada de referência defunçãopara wp_insert_post () ,notei quenão háparâmetrosnamatriz que requer O quepermitirá queeu defina a 'imagemem destaque'para umpost,exibido como o Post Thumbnail nomeutema.
Eu olheiparafunções como set_post_thumbnail () ,como sugeridopelo Sr. Bennett,masissoparece ser um A adição relativamentenova aopróprio WordPresse ao WordPress Codex. Comotal,não háfontes queeupossaencontrar quaisexplicar como oparâmetro $thumbnail_id deve ser adquiridoe fornecido. Seesta é realmente afunção de usar,de quemaneirapossofornecer umparâmetro válido $thumbnail_id quandotudo queeutiver é um URL deimagem?
Obrigado antecipadamente!