Wie lege ich bei Verwendung von wp_insert_post () ein ausgewähltes Bild (Miniaturbild) anhand der Bild-URL fest?
5 Antworten
- Stimmen
-
- 2012-02-05
Sie könnenein Bild als Post-Miniaturbildfestlegen,wennes sichin Ihrer Medienbibliothekbefindet. Umein Bildin Ihre Medienbibliothek aufzunehmen,müssen Siees auf Ihren Server hochladen. WordPress hatbereitseine Funktion zum Einfügen von Bildernin Ihre Medienbibliothek. Siebenötigen lediglichein Skript,das Ihre Datei hochlädt.
Verwendung:
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()
Funktion:
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
BEARBEITEN: Pfaderstellung hinzugefügt
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
-
Vielen Dankfür Ihre Bemühungen!Diesfunktioniertjedochnur,wenn $ upload_dir ['basedir'] (anstelle vonpath) verwendet wird,dabei der Überprüfung des Anhangs über die Nachbearbeitungsoberfläche auf .../uploads/FILENAME.EXT verwiesen wird,während $ upload_dir ['path'] würdeesin soetwas wie .../uploads/2012/02/FILENAME.EXT speichern. Esist vielleichtnochbesser,irgendwie zu ändern,wie auf die Datei verwiesen wird,aberich würdenicht wissen,wie.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
-
Pfaderstellungin meiner Antwort hinzugefügt.Added path creation in my answer.
- 1
- 2012-02-06
- Rob Vermeer
-
Schätzen Sie Ihre schnelle Antwort :).Icherhalteimmernoch dasgleiche Ergebnis. Hieristein Screenshot,dermein Problem zeigt: http://i.imgur.com/iKTNs.png.Der obere Bereichist das Ergebnis der Platzierungeines Echosin Ihrer Bedingung,nur um zu sehen,was losist.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
-
Es wurdeerneutgeändert undnicht der vollständige Pfad zu wp_insert_attachment und wp_generate_attachment_metadata übergeben.Hoffe das wird das Problem lösen.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
-
Funktionierteinwandfrei,vielen Dank!Dies hat auchein Größenproblembehoben,das anscheinend durchfalsche Pfade verursacht wurde (obwohl das Bild angezeigt werden würde).Könntenichtbesser sein!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
-
Vielen Dankfür Ihrentollen Code.Es warnureine Änderungerforderlich,damitesmit meinem CSV-Importfunktioniert. Dabei wurde die Post-ID dem Dateinamen vorangestellt,um sicherzustellen,dass die Bilddateieneindeutigbleiben.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
-
Lassen Siemich auch auf das Lob häufen.Ich liebe diesen Codeausschnitt.Danke,dass dumir Stundengespart hast!Let me also heap on the praise. Love this snippet of code. Thanks for saving me hours!
- 0
- 2013-02-11
- bkwdesign
-
Ichfragemichnur: Ist das sicher?Besteht die Gefahr,dassjemandein Bild verkleidet,oder kümmert sich wp_check_filetype () darum?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
-
Ich habe den obigen Code verwendet und leichtgeändert,um vorgestellte Bilder zuerhalten,die als Post-Slugbezeichnet werden (was ziemlich zeitaufwändigist,wenn Sie Tausende von Posts ausführen): `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
-
Die Verwendung von "file_get_contents"mit einer URLfunktioniertnicht,wenn "allow_url_fopen"in "php.ini" deaktiviertistverschiedene WP-Umgebungenusage 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
-
Warnung: Diese Antwort schreibt die Dateineu,wenn sie denselben Namen hat.Es sollte Namenmit $post_id oder zumindest uniqid ()generieren.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
-
Wennich dies verwende,haben diein "Uploads"erstellten Bildereine Dateigröße von Null.When I use this, the images created in "uploads" have a file size of zero.
- 0
- 2018-03-23
- PJ Brunet
-
- 2016-03-02
Ichmöchte die Robs-Antwort verbessern,indemich die WP-Kernfunktionen
download_url
verwende undmedia_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 ); }
-
Die Verwendung dernativen WordPress-Funktionenist diebeste Vorgehensweise. Vielen Dank.Using the WordPress native functions are the best practice, Thank you.
- 1
- 2018-09-15
- Mostafa Soufi
-
Ausirgendeinem Grundgabmir diese Version Fehlermit der Meldung "Einegültige URL wurdenicht angegeben.",während [Rob Vermeers Antwort] (https://wordpress.stackexchange.com/a/41300/122391)funktionierte.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
Versuchen Sie,
set_post_thumbnail()
zu verwenden.Bearbeiten von Otto: Sie haben Ihre Fragegeklärt,also werdeich die Antwort klären,die Chipgegeben hat.
Grundsätzlichmüssen Sie auch den 'Anhang'für den Beitragerstellen. Wennein Bildin die WordPress-Medienbibliothek hochgeladen wird,wirdein spezieller Post-Eintragmit einem Post-Anhangerstellt. Dieser Anhangist über die Kennungpost_parentmit einembestimmten Beitrag verknüpft.
Wenn Sie also die ID des Anhangs kennen,setzen Siebeim Aufrufen von set_post_thumbnailmit dem Post-Objekt oder der ID und der Anhang-IDeinfach das Post-Thumbnail-Flag.
Wenn Sie den Anhangnochnichterstellt haben,müssen Sie dies zuersttun. Ameinfachstengeht dasmit
wp_insert_attachment()
. Diese Funktion verwendetein Arrayeiniger Parameter,den Dateinamen (die Dateimuss sichbereitsim richtigen Upload-Verzeichnisbefinden) und die Beitrags-ID des übergeordneten Beitrags,an den Sie den Anhang anhängenmöchten.Nureine Datei hochzuladen und aneinen Beitrag anzuhängen,führtnicht automatisch zuetwas. Diesisteinfacheine Art Kategorisierungsmechanismus. Der Galeriemechanismus verwendetbeispielsweise die angehängten Bildereines Beitrags,um die [Galerie]für diesen Beitrag zuerstellen. Eine Miniaturansichtfüreinen Beitragistnureines der angehängten Bilder,die als Miniaturansichtfestgelegt wurden.
Weitere Informationen zur Verwendung von wp_insert_attachmentfinden Sieim Codex (oben verlinkt).
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).
-
Dankefür Ihre Antwort!Wie würdeich die Miniaturbild-ID abrufen?Ichbeginne miteiner Bild-URL,also sollteich der WordPress-Bibliothekmit einer anderen Funktionein Bild hinzufügen.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
-
Da Siebereitseinen Beitrag *einfügen *,hatteich angenommen,dass Siebereits * Bilder * an den Beitrag anhängen,den Sieeinfügen.Ist dasnichteine gültige Annahme?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
-
Entschuldigung,aberich habenochnicht herausgefunden,wie Bilderper URL aneinen Beitrag angehängt werden können.Außerdemmöchteichnicht,dass das Bildtatsächlichim Beitrag selbst angezeigt wird.Ich suche derzeitnach der Funktion,die die $thumbnail_id zurückgibt,und dachte,dass wp_insert_attachment ()möglicherweisefunktionieren würde,bisichbemerkte,dass sich der Anhangbereitsim Upload-Verzeichnisbefindenmusste.Ich weißnicht,wieich dorteine Bilddatei überihre URL abrufen kann,undichbin mirnicht sicher,ob dies die Funktionist,nach derich überhaupt suche.Dankefür deine Hilfe!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
-
Können Siebitte Ihre Fragemit diesen Informationen umschreiben,umbesser zubeschreiben,was Sieerreichenmöchten?(Oder lassen Sie diese unverändert undbeginnen Sieeine neue Frage,um zuerfahren,wie Siebeim Einfügeneines Beitrags die Anhangs-IDerhalten.)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
-
Die ursprüngliche Frage wurdebearbeitet undteilweise umformuliert,bitte versuchen Sieeserneut :).The original question has been edited and partly rephrased, please check back :).
- 0
- 2012-01-27
- Chris
-
- 2012-02-06
set_post_thumbnail()
ist diebeste Funktionfür diese Anforderung.Ich denke,Siefinden die IDeines Anhangs über
get_children()
oderget_posts()
. Das Ergebnis hatein Array undinnerhalb dieses Arraysbefindet sich die ID. Dasfolgende Beispiel zum Testen;ich hoffees klappt; Schreiben Sie ohne Tests,nur von Grund aufneu.Für Ihre Anforderungistes wichtig,dass Sie
get_the_ID()
mit Ihrerpost-ID
ändern. Geben Sie die ID des Anhangs zurück,und verwenden Sie dazufothset_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
Habe dasgeradegefunden undes vieleinfachergemacht,funktioniert,aberichbin kein Sicherheits-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 ); }
einfach oder was?Nachdem Sie die richtigen Dateienerhalten haben,verarbeitet WordPress das Medium und lädtes hoch. Anschließend wirdes als Miniaturbildfestgelegt.
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.
Beim Durchsuchen des Funktionsreferenzeintragsfür wp_insert_post () habeichfestgestellt,dass daserforderliche Array keinen Parameterenthält Dadurch kannich das "Ausgewählte Bild"füreinen Beitragfestlegen,dasin meinem Thema als Miniaturansicht des Beitrags angezeigt wird.
Ich habe Funktionen wie set_post_thumbnail () untersucht,wie von Mr. Bennett vorgeschlagen,aber dies scheinteine zu sein relativneue Ergänzung zu WordPress selbst und dem WordPress-Codex. Dahergibt es keine Quellen,dieerklären können,wie der Parameter $thumbnail_iderfasst undbereitgestellt werden soll. Wenn dies wirklich die zu verwendende Funktionist,wie könnteich sie dannmit einemgültigen Parameter $thumbnail_id versehen,wennichnureine Bild-URL habe?
Vielen Dankim Voraus!