web-dev-qa-db-ja.com

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

wp_insert_post()の関数参照エントリ を見ているうちに、配列に必要なパラメータがないことに気付きました。これにより、投稿用の[Featured Image]を設定できるようになります。 サムネイルを投稿する 私のテーマです。

Bennett氏が示唆しているように、 set_post_thumbnail() のような関数を調べましたが、これはWordPress自体とWordPressコーデックスに比較的新しく追加されたようです。そのため、$ thumbnail_idパラメータを取得して提供する方法を説明する情報源はありません。これが実際に使用する機能である場合、私が持っているのが画像URLだけである場合、どのようにして有効な$ thumbnail_idパラメータを指定することができますか?

前もって感謝します!

57
Chris

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

104
Rob Vermeer

set_post_thumbnail() を使ってみてください。

オットーによる編集:あなたはあなたの質問を明確にしました、それで私はチップが与えた反応をはっきりさせます。

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

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

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

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

Wp_insert_attachmentの使用方法に関する詳細情報はコーデックス(上記リンク)にあります。

10
Chip Bennett

WPコア関数 download_url および media_handle_sideload を利用して、Robsの回答を改善したい

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

}
7
Jan Beck

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

添付ファイルのIDは get_children() または get_posts() で見つけられると思います。結果は配列を持ち、この配列の中にIDがあります。テストのための以下の例。私はそれがうまくいくことを願っています。テストをせずに、スクラッチで書くだけです。

あなたの要件にとって、あなたがあなたのpost-IDget_the_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);
}
3
bueltge

これを見つけて、はるかに簡単にしただけで動作しますが、セキュリティスクラバーではありません。

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

シンプルかな?適切なファイルを取得したら、ワードプレスはメディアを処理してアップロードし、それをサムネイルとして設定します。

3
Jesse Baker