wp_insert_post()を使用する場合、画像のURLで注目の画像(サムネイル)を設定するにはどうすればよいですか?
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']を使用する場合にのみ機能します.これは、編集後のインターフェイスを介して添付ファイルを検査すると、$ upload_dir ['path'が.../uploads/FILENAME.EXTとして参照されるためです.]それを.../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インポートで機能させるために必要な修正は1つだけで、画像ファイルが一意のままになるようにファイル名の前に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
-
`php.ini`で` allow_url_fopen`が無効になっている場合、URLでの `file_get_contents`の使用は機能しません-[` wp_remote_get`](https://codex.wordpress.org/Function_Reference/wp_remote_get)は、全体でより高い互換性がありますさまざまな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
-
警告:この回答は、ファイルが同じ名前の場合、ファイルを書き換えます.注意してください.$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
を利用して、Robsの回答を改善したいと思います. および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が提供されていません」というエラーが表示されました.、[Rob Vermeerの回答](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識別子を介して特定の投稿にリンクされています.
したがって、添付ファイルのIDがわかっている場合は、投稿オブジェクトまたはIDと添付ファイルIDを指定してset_post_thumbnailを呼び出すと、投稿サムネイルフラグが設定されます.
添付ファイルをまだ作成していない場合は、最初に作成する必要があります.これを行う最も簡単な方法は、
wp_insert_attachment()
を使用することです.この関数は、いくつかのパラメータ、ファイル名(ファイルはすでに適切なアップロードディレクトリにある必要があります)、および添付ファイルを添付する親投稿の投稿IDの配列を取ります.ファイルをアップロードして投稿に添付しただけでは、自動的には何も起こりません.これは単に一種の分類メカニズムです.たとえば、ギャラリーメカニズムは、投稿の添付画像を使用して、その投稿の[ギャラリー]を構築します.投稿のサムネイルは、サムネイルとして設定されている添付画像の1つにすぎません.
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).
-
お返事ありがとうございます!ただし、サムネイルIDを取得するにはどうすればよいですか?私は画像のURLから始めているので、別の関数を使用してワードプレスライブラリに画像を追加する必要があると思いますか?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
-
あなたが達成しようとしていることをよりよく説明するために、この情報で**質問を書き直して**ください.(または、これをそのままにして、新しい質問を開始し、投稿を挿入するときに添付ファイルIDを取得する方法を尋ねますか?)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()
は、この要件に最適な関数です.添付ファイルのIDは、
get_children()
<で見つけることができると思います./a>またはget_posts()
要件については、
get_the_ID()
をpost-ID
に変更することが重要です.添付ファイルのIDを返します.これにより、set_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()の関数参照エントリを調べていると、必要な配列にパラメータがないことに気付きました.これにより、テーマに投稿サムネイルとして表示される投稿の「注目画像」を設定できます.
ベネット氏が提案したように、 set_post_thumbnail()のような関数を調べましたが、これはWordPress自体とWordPressコーデックスへの比較的新しい追加.そのため、$thumbnail_idパラメーターを取得して提供する方法を説明するソースは見つかりません.これが本当に使用する関数である場合、私が持っているのが画像のURLだけである場合、どのようにして有効な$thumbnail_idパラメーターを提供できますか?
よろしくお願いします!