Comment définir une image sélectionnée (vignette) par URL d'image lors de l'utilisation de wp_insert_post ()?
5 réponses
- votes
-
- 2012-02-05
Vouspouvez définir uneimage commeminiature depublication lorsqu'elle setrouve dans votrebibliothèquemultimédia. Pour ajouter uneimage dans votrebibliothèquemultimédia,vous devez latélécharger sur votre serveur. WordPress a déjà unefonctionpourmettre desimages dans votremédiathèque,vousn'avezbesoin que d'un script quitélécharge votrefichier.
Utilisation:
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()
Fonction:
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
MODIFIER: Ajout de la création de chemin
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
-
Mercipour vosefforts!Celane fonctionne que lorsque vous utilisez $ upload_dir ['basedir'] (plutôt quepath),car lorsquej'inspecte lapiècejointe via l'interface depost-édition,elleest référencée comme .../uploads/FILENAME.EXTtandis que $ upload_dir ['path'] le stockerait dans quelque chose comme .../uploads/2012/02/FILENAME.EXT. Il seraitpeut-êtreencoremieux de changer lafaçon dont lefichierest référencé,maisje ne sauraispas comment.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
-
Ajout de la création de chemin dansma réponse.Added path creation in my answer.
- 1
- 2012-02-06
- Rob Vermeer
-
Appréciez votre réponse rapide :).J'obtienstoujours lemême résultat cependant,voici une capture d'écran affichantmonproblème: http://i.imgur.com/iKTNs.png.La section supérieureest le résultat deplacer un écho dans votre conditionnel,justepour voir ce qui sepasse.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
-
Je l'aiencore changé,je n'aipaspassé le chemin complet vers wp_insert_attachmentet wp_generate_attachment_metadata.J'espère que cela résoudra leproblème.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
-
Fonctionneparfaitement,mercibeaucoup!Cela a également résolu unproblème de dimensionnement,qui était apparemment causépar des cheminsincorrects (même si l'image apparaîtrait).Çane pourraitpas êtremieux!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
-
Mercipour votreexcellent code.Un seul amendement a éténécessairepour lefairefonctionner avecmonimportation CSVet qui ajoutait lepostid aunom defichierpourgarantir que lesfichiersimage restent uniques.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
-
Permettez-moi également d'accumuler les éloges.J'adore cetextrait de code.Merci dem'avoirfaitgagner des heures!Let me also heap on the praise. Love this snippet of code. Thanks for saving me hours!
- 0
- 2013-02-11
- bkwdesign
-
Jeme demande simplement:est-ce sûr?Y a-t-il un risque que quelqu'un déguise uneimage ouest-ce que wp_check_filetype () s'en charge?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
-
J'ai utilisé le code ci-dessuset légèrementmodifiépour obtenir desimagesen vedette qui sontnommées comme le slug depublication (ce quiprendbeaucoup detemps si vousexécutez desmilliers demessages): `code`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
-
l'utilisation de `file_get_contents` avec une URLne fonctionnerapas si` allow_url_fopen`est désactivé dans `php.ini` - [` wp_remote_get`] (https://codex.wordpress.org/Function_Reference/wp_remote_get) seraplus hautement compatibledifférentsenvironnements 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
-
Attention: cette réponse réécrit lefichier s'ilporte lemêmenom,attention.Il devraitgénérer desnomsen utilisant $post_id ou aumoins 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
-
Lorsquej'utilise ceci,lesimages créées dans "uploads" ont unetaille defichier de zéro.When I use this, the images created in "uploads" have a file size of zero.
- 0
- 2018-03-23
- PJ Brunet
-
- 2016-03-02
Je voudrais améliorer la réponse de Robsen utilisant lesfonctions debase WP
download_url
etmedia_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 ); }
-
L'utilisation desfonctionsnatives de WordPressest lameilleurepratique,merci.Using the WordPress native functions are the best practice, Thank you.
- 1
- 2018-09-15
- Mostafa Soufi
-
Pour une raison quelconque,cette versionm'a donné deserreurs disant "Une URL validen'apas étéfournie.",alors que [la réponse de Rob Vermeer] (https://wordpress.stackexchange.com/a/41300/122391) afonctionné.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
Essayez d'utiliser
set_post_thumbnail()
.Éditépar Otto: Vous avez clarifié votre question,je vais donc clarifier la réponse donnéepar Chip.
Engros,vous devez également créer la «piècejointe»pour lemessage. Lorsqu'uneimageesttéléchargée dans lamédiathèque WordPress,uneentrée depublication spécialeest crééepourelle avec untype depiècejointe. Cettepiècejointeest liée à unmessage spécifique via l'identifiantpost_parent.
Donc,si vous connaissez l'ID de lapiècejointe,appeler set_post_thumbnail avec l'objet ou l'ID de l'articleet l'ID de lapiècejointe définira simplement l'indicateur deminiature de l'article.
Si vousn'avezpasencore créé lapiècejointe,vous devrez d'abord lefaire. Lemoyen leplus simple de lefaireest d'utiliser
wp_insert_attachment()
. Cettefonctionprend untableau de quelquesparamètres,lenom defichier (lefichier doit déjà être dans le répertoire detéléchargement approprié)et l'ID depublication dumessageparent auquel vous souhaitez attacher lapiècejointe.Le simplefait detélécharger unfichieret de lejoindre à unmessagene fait rien automatiquement. Il s'agit simplement d'une sorte demécanisme de catégorisation. Lemécanisme degalerie,parexemple,utilise lesimagesjointes d'un articlepour créer la [galerie]pour cemessage. Une vignettepour un articlen'est que l'une desimagesjointes qui a été définie comme vignette.
Voustrouverezplus d'informations sur l'utilisation de wp_insert_attachment dans le codex (lien ci-dessus).
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).
-
Mercipour votre réponse!Mais comment récupérer l'ID de laminiature?Je commence avec une URL d'image,doncje suppose queje devraisen quelque sorte ajouter uneimage à labibliothèque wordpressen utilisant une autrefonction?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
-
Comme vous *insérez * déjà unmessage,j'avais supposé que vous étiez déjà *en train dejoindre desimages * aumessage que vousinsérez.N'est-cepas une hypothèse valable?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
-
Désolé,maisje n'aipasencoretrouvé commentjoindre desimages à unmessagepar URL.Deplus,je ne voudraispas que l'image soit réellement affichée dans lemessage lui-même.Je suis actuellement à la recherche de lafonction qui renverra le $thumbnail_id,et j'aipensé quepeut-être wp_insert_attachment ()fonctionnerait,jusqu'à ce queje remarque qu'ilfallait déjà que lapiècejointe soit dans le répertoire detéléchargement.Jene saispas comment y obtenir unfichierimagepar son URL,et jene saispas si c'est lafonction queje rechercheen premier lieu.Merci de votre aide!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
-
Pouvez-vous s'il vousplaît ** réécrire votre question ** avec cesinformations,pourmieux décrire ce que vousessayez d'accomplir?(Ou laissez celui-citel quelet commencez unenouvelle question,pour demander comment obtenir l'ID depiècejointe lors de l'insertion d'unmessage?)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
-
La question originale a étémodifiéeet partiellement reformulée,veuillez revenir :).The original question has been edited and partly rephrased, please check back :).
- 0
- 2012-01-27
- Chris
-
- 2012-02-06
set_post_thumbnail()
est lameilleurefonctionpour cetteexigence.Jepense que voustrouvez l'ID d'unepiècejointe via
get_children()
ouget_posts()
. Le résultat a untableauet à l'intérieur de cetableau setrouve l'ID. L'exemple suivantpour lestests; J'espère que çamarche; écrire sanstests,uniquement sur scratch.Pour vosbesoins,ilestimportant que vous changiez
get_the_ID()
avec votrepost-ID
; renvoyez l'ID de lapiècejointeet vouspouvez utiliserpour celaset_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
Je viens detrouver çaet je l'ai rendubeaucoupplus simple,çamarchemaisje ne suispas unnettoyeur de sécurité
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 ou quoi?après avoir obtenu lesbonsfichiers,wordpressgérera lemédiaet letéléchargera,puis le définira commeminiature.
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.
Enparcourant l 'entrée de référence de lafonctionpour wp_insert_post () ,j'ai remarqué qu'iln'y apas deparamètre dans letableau requis ce quime permettra de définir l '"Imageen vedette"pour unmessage,affiché sous laforme de miniature dumessage dansmonthème.
J'aiexaminé desfonctions comme set_post_thumbnail () ,comme suggérépar M. Bennett,mais cela semble être un ajout relativementnouveau à WordPress lui-mêmeet au codex WordPress. Entant quetel,iln'y a aucune source queje puissetrouver quiexplique comment leparamètre $thumbnail_id doit être acquiset fourni. Si c'est vraiment lafonction à utiliser,commentpourrais-je luifournir unparamètre $miniature_id valide alors queje n'ai qu'une URL d'image?
Merci d'avance!