¿Cómo configuro una imagen destacada (miniatura) por URL de imagen cuando uso wp_insert_post ()?
5 respuestas
- votos
-
- 2012-02-05
Puedesestablecer unaimagen comominiatura de unapublicación cuandoestáen tubibliotecamultimedia. Para agregar unaimagen a subibliotecamultimedia,debe cargarlaen su servidor. WordPress yatiene unafunciónparaponerimágenesen subiblioteca demedios,solonecesita un script que cargue su archivo.
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()
Función:
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: Creación de ruta agregada
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
-
¡Graciasportusesfuerzos!Sinembargo,esto solofunciona cuando se usa $ upload_dir ['basedir'] (en lugar de ruta),porque cuandoinspeccionoel archivo adjunto através de lainterfaz deediciónposterior,se hace referencia a él como .../uploads/FILENAME.EXTmientras que $ upload_dir ['ruta'] lo almacenaríaen algo como .../uploads/2012/02/FILENAME.EXT. Podría serinclusomejor cambiar de algunamanera cómo se hace referencia al archivo,perono sabría cómo.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
-
Creación de ruta agregadaen mi respuesta.Added path creation in my answer.
- 1
- 2012-02-06
- Rob Vermeer
-
Agradezco su rápida respuesta :).Sinembargo,sigo obteniendoelmismo resultado,aquí hay una captura depantalla quemuestrami problema: http://i.imgur.com/iKTNs.png.La sección superioresel resultado de colocar unecoen su condicional,solopara ver quéestápasando.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
-
Lo cambié denuevo,nopasó la ruta completa a wp_insert_attachment y wp_generate_attachment_metadata.Espero queesto resuelvaelproblema.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
-
Funcionaperfectamente,¡muchasgracias!Estotambién solucionó unproblema detamaño,que aparentementefue causadopor rutasincorrectas (apesar de que laimagen aparecía).¡Nopodría sermejor!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
-
Graciasportugran código.Solo senecesitaba unaenmiendapara quefuncionara conmi importación CSV yera anteponerelpostid alnombre del archivoparagarantizar que los archivos deimagen sigan siendo únicos.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
-
Permítanmetambién acumularelogiosMeencantaestefragmento de código.¡Graciaspor ahorrarme horas!Let me also heap on the praise. Love this snippet of code. Thanks for saving me hours!
- 0
- 2013-02-11
- bkwdesign
-
Mepregunto: ¿Esesto seguro?¿Existeel riesgo de que alguien disfrace unaimagen,o wp_check_filetype () seencarga deeso?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
-
Utilicéel código anterior y lomodifiqué ligeramentepara obtenerimágenes destacadas que senombran como lababosa de lapublicación (que llevabastantetiempo siejecutamiles depublicaciones): `código`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
-
el uso de `file_get_contents` con una URLnofuncionará si` allow_url_fopen`está deshabilitadoen `php.ini` - [` wp_remote_get`] (https://codex.wordpress.org/Function_Reference/wp_remote_get) serámás compatibleendiferentesentornos de 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
-
Advertencia:esta respuesta reescribeel archivo sitiene elmismonombre,cuidado.Deberíagenerarnombres usando $post_id o almenos 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
-
Cuando utilizoesto,lasimágenes creadasen "cargas"tienen untamaño de archivo de cero.When I use this, the images created in "uploads" have a file size of zero.
- 0
- 2018-03-23
- PJ Brunet
-
- 2016-03-02
Megustaríamejorar la respuesta de Robs utilizando lasfuncionesprincipales de WP
download_url
ymedia_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 ); }
-
El uso de lasfuncionesnativas de WordPresses lamejorpráctica,gracias.Using the WordPress native functions are the best practice, Thank you.
- 1
- 2018-09-15
- Mostafa Soufi
-
Por alguna razón,esta versiónme dioerrores que decían "No seproporcionó una URL válida".,mientras que la [respuesta de Rob Vermeer] (https://wordpress.stackexchange.com/a/41300/122391)funcionó.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
Intente utilizar
set_post_thumbnail()
.Editarpor Otto: Aclaró supregunta,así que aclararé la respuesta que dio Chip.
Básicamente,también debes crearel 'archivo adjunto'para lapublicación. Cuando se carga unaimagenen labiblioteca demedios de WordPress,se crea unaentrada depublicaciónespecialparaella con untipo de archivo adjunto depublicación. Este archivo adjuntoestá vinculado a unapublicaciónespecífica através delidentificadorpost_parent.
Entonces,si conoceel ID del archivo adjunto,al llamar a set_post_thumbnail conel objeto o ID de lapublicación yel ID del archivo adjunto,simplemente seestableceráelindicador deminiatura de lapublicación.
Si aúnno ha creadoel archivo adjunto,deberá hacerloprimero. Laformamás sencilla de hacerloes con
wp_insert_attachment()
. Estafuncióntoma unamatriz de algunosparámetros,elnombre del archivo (el archivo ya debeestaren el directorio de cargas adecuado) yel ID de lapublicaciónprincipal a la que desea adjuntarel archivo adjunto.El solo hecho detener un archivo cargado y adjunto a unapublicaciónno hacenada automáticamente. Estoes simplemente unaespecie demecanismo de categorización. Elmecanismo de lagalería,porejemplo,usa lasimágenes adjuntas de unapublicaciónpara construir la [galería]paraesapublicación. Laminiatura de unapublicaciónes solo una de lasimágenes adjuntas que se ha configurado comominiatura.
Puedeencontrarmásinformación sobre cómo usar wp_insert_attachmenten el códice (vinculado arriba).
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).
-
¡Graciaspor su respuesta!Sinembargo,¿cómopuedo recuperar laidentificación de laminiatura?Estoy comenzando con una URL deimagen,así que supongo que de algunamanera debería agregar unaimagen a labiblioteca de wordpress usando otrafunción.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 yaestás *insertando * unapublicación,asumí que yaestabas * adjuntandoimágenes * a lapublicación queestásinsertando.¿Noes una suposición 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
-
Lo siento,perotodavíano he descubierto cómo adjuntarimágenes a unapublicaciónpor URL.Además,no quisiera que laimagen semostrara realmenteen lapublicación.Actualmenteestoybuscando lafunción que devolveráel $thumbnail_id,ypensé quetal vez wp_insert_attachment ()funcionaría,hasta queme di cuenta de que ya requería queel archivo adjuntoestuvieraen el directorio de carga.No sé cómo obtener un archivo deimagen allípor su URL,ynoestoy seguro de siestaes lafunción queestoybuscandoen primer lugar.¡Graciasportu ayuda!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
-
¿Puede ** reescribir supregunta ** conestainformaciónpara describirmejor lo queestátratando de lograr?(O déjelo comoestá y comience unanuevapreguntaparapreguntar cómo obtenerel ID del archivo adjunto alinsertar unapublicación).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
-
Lapregunta original ha sidoeditada y reformuladaparcialmente,vuelva a consultar :).The original question has been edited and partly rephrased, please check back :).
- 0
- 2012-01-27
- Chris
-
- 2012-02-06
set_post_thumbnail()
es lamejorfunciónparaeste requisito.Creo queencuentrael ID de un archivo adjunto através de
get_children()
oget_posts()
. El resultadotiene unamatriz y dentro deestamatrizestáel ID. El siguienteejemplo deprueba;espero quefuncione;escribe sinpruebas,solo desde cero.Para su requerimiento,esimportante que cambie
get_the_ID()
por supost-ID
; devuelvael ID del adjunto yestopuede usarfothset_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
Acabo deencontraresto y lo hicemuchomás simple,funcionaperono soy un depurador de seguridad
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 o qué?después de obtener los archivos correctos,wordpressmanejará losmedios y los cargará,luego los configurará comominiatura.
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.
Mientras revisaba la entrada de referencia defunciónpara wp_insert_post () ,noté queno hayningúnparámetroen lamatriz que requiere lo queme permitiráestablecer la 'Imagen destacada'para unapublicación,que semuestra como la miniatura de lapublicación en mitema.
Heexaminadofunciones como set_post_thumbnail () ,como sugirióel Sr. Bennett,peroestoparece ser una adición relativamentenueva alpropio WordPress y al códice de WordPress. Comotal,no hayningunafuente quepuedaencontrar queexplique cómo se debe adquirir y suministrarelparámetro $thumbnail_id. Siestaes realmente lafunción a usar,¿de quémanerapodríaproporcionarle unparámetro $thumbnail_id válido cuandotodo lo quetengoes una URL deimagen?
¡Gracias de antemano!