wp_insert_post()を使用するときに、画像URLで注目画像(サムネイル)を設定するにはどうすればよいですか?


61

wp_insert_post()関数参照エントリを調べていると、私のテーマの投稿サムネイルとして表示される投稿の 'Featured Image'を設定するために必要なパラメーターが配列にないことに気付きました。

Bennett氏が提案したset_post_thumbnail()のような関数を調べましたが、これはWordPress自体とWordPressコーデックへの比較的新しい追加のようです。そのため、$ thumbnail_idパラメーターを取得して提供する方法を説明するソースは見つかりません。これが本当に使用する関数である場合、画像URLのみが存在する場合に、有効な$ thumbnail_idパラメーターをどのように提供できますか?

前もって感謝します!

回答:


107

メディアライブラリにあるときに、画像を投稿のサムネイルとして設定できます。メディアライブラリーに画像を追加するには、サーバーにアップロードする必要があります。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


編集:パスの作成を追加

http://codex.wordpress.org/Function_Reference/wp_mkdir_p


ご尽力ありがとうございました!これは、(パスではなく)$ upload_dir ['basedir']を使用する場合にのみ機能します。これは、編集後のインターフェイスを介して添付ファイルを検査すると、... / uploads / FILENAME.EXTとして参照されるためです$ while load_dir ['path' ]は、... / uploads / 2012/02 / FILENAME.EXTのように保存します。ファイルの参照方法を何らかの方法で変更することはさらに良いかもしれませんが、方法はわかりません。
クリス

1
私の答えにパスの作成を追加しました。
ロブフェルメール

迅速な対応に感謝します:)。それでも同じ結果が得られますが、ここに問題を表示するスクリーンショットがあります:i.imgur.com/iKTNs.png。上のセクションは、何が起こっているのかを確認するために、条件にエコーを配置した結果です。
クリス

もう一度変更しましたが、wp_insert_attachmentとwp_generate_attachment_metadataへのフルパスを渡しませんでした。これで問題が解決することを願っています。
ロブフェルメール

1
警告:この回答は、同じ名前のファイルを書き換えますので注意してください。これは、$ post_idのか、少なくともuniqid()を使用して名前を生成する必要があります
イワンCastellanosの

10

を使用してみてくださいset_post_thumbnail()

Ottoによる編集:あなたは質問を明確にしたので、Chipの応答を明確にします。

基本的に、投稿の「添付」も行う必要があります。画像がWordPressメディアライブラリにアップロードされると、添付ファイルの投稿タイプで特別な投稿エントリが作成されます。この添付ファイルは、post_parent識別子を介して特定の投稿にリンクされています。

添付ファイルのIDがわかっている場合、投稿オブジェクトまたはIDと添付ファイルIDを指定してset_post_thumbnailを呼び出すと、投稿サムネイルフラグが設定されます。

添付ファイルをまだ作成していない場合は、最初に作成する必要があります。それを行う最も簡単な方法は、wp_insert_attachment()です。この関数は、いくつかのパラメーターの配列、ファイル名(ファイルは既に適切なアップロードディレクトリに存在する必要があります)、および添付ファイルを添付する親投稿の投稿IDを受け取ります。

ファイルをアップロードして投稿に添付するだけでは、自動的には何も行われません。これは、単に分類メカニズムの一種です。たとえば、ギャラリーメカニズムは、投稿の添付画像を使用して、その投稿の[ギャラリー]を構築します。投稿のサムネイルは、サムネイルに設定されている添付画像の1つにすぎません。

wp_insert_attachmentの使用方法の詳細については、コーデックス(上記リンク)をご覧ください。


お返事ありがとうございます!ただし、サムネイルIDはどのように取得しますか?私は画像のURLから始めているので、別の関数を使用して何らかの形で画像をワードプレスライブラリに追加する必要があると思いますか?
クリス

すでに投稿を挿入しているので、挿入する投稿に既に画像添付していると想定していました。それは有効な仮定ではありませんか?
チップベネット

申し訳ありませんが、URLで実際に画像を投稿に添付する方法はまだわかりません。また、投稿自体に画像を実際に表示したくないでしょう。現在、$ thumbnail_idを返す関数を探していますが、アップロードディレクトリに添付ファイルが必要であることに気付くまで、wp_insert_attachment()が動作する可能性があると考えました。URLで画像ファイルを取得する方法がわからないので、そもそもこれが私が探している機能かどうかはわかりません。ご協力ありがとうございました!
クリス

あなたが達成しようとしていることをより良く説明するために、この情報で質問書き換えてください。(または、これをそのままにして、投稿を挿入するときに添付ファイルIDを取得する方法を尋ねる新しい質問を開始しますか?)
チップベネット

元の質問は編集され、部分的に言い換えられています。もう一度ご確認ください:)。
クリス

9

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 );

}

1
WordPressのネイティブ機能を使用することがベストプラクティスです。ありがとうございます。
モスタファスーフィ

何らかの理由で、このバージョンでは「有効なURLが提供されませんでした」というエラーが表示されました。、一方、ロブ・フェルメールの答えはうまくいきました。
Flimm

3

set_post_thumbnail() この要件に最適な関数です。

get_children()またはを介して添付ファイルのIDを見つけると思いますget_posts()。結果には配列があり、この配列内にIDがあります。テスト用の次の例。私はそれがうまくいくことを望みます。テストなしで、スクラッチのみで書き込みます。

あなたの要件については、あなたが変更get_the_ID()することが重要post-IDです。AttachmentのIDを返すと、これでfothを使用できます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);
}

3

これを見つけて、ずっと簡単になりましたが、私はセキュリティスクラバーではありません

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はメディアを処理してアップロードし、サムネイルとして設定します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.