media_sideload_image()でアップロードした後に$ image_idを取得します


10

画像をアップロードして、投稿の注目画像に設定したい。私が試したのはこれです:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

ただし、media_sideload_image()は返されませんimage_idが、レンダーHTMLイメージが返されます。どうすれば入手できimage_idますか?

回答:


28

アクション/フックを使用してこの制限を回避する方法の例を次に示します。

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

アイデアは、media_sideload_imageが実行されると、

  • 画像をダウンロードします
  • 添付ファイルとして追加します(タイプの投稿attachment
  • 次に、その添付ファイルを、指定したID($ post_id)の投稿に添付します

問題は、新しく作成された添付ファイル投稿IDを提供しないことです。

ただし、添付ファイルが作成されると、そのIDを含むアクションが発生します。添付ファイルを作成する前にこれにフックし、フィーチャーされたサムネイルに提供された投稿IDを付けて保存し、その後フックを解除できます。


1
鮮やかさ!それはとても役に立ちました。
m-torin 2014

2
これがあなたの質問に答えるなら、あなたはそれを正しいものとしてマークできますか?
トムJ

私はあなたの英語を読むことができません。誰かがこの投稿を編集できますか?
HiDd3N 2016

2
@ HiDd3N使用した英語の一部を簡略化しましたが、読書年齢が低い一般的な単語が含まれているはずです
トムJノーウェル

6

URLで検索し、DBからIDを取得する関数を作成しました。

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

4番目のパラメーターCodexに設定して、URL(htmlコードを含む)を取得できます'src' :media_sideload_image()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);


4

@トム・J・ノーウェルの答えはその場にあります。ここで説明されている別の代替(異なる機能を使用)を見つけましが、これがもう1つ気に入っています。

私の場合、挿入するすべての投稿を含む$ postsの配列と、メディアを含む個別の$ media($ postsと同じ$ nidキー)があります。私のコードはトムのソリューションと同じですが、無名関数を使用するようにリファクタリングされています。

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

私の場合、私は各$ media [$ nid] shuoldの最初のアイテムがその投稿の注目画像であると想定しています。

WordPressは確実にmedia_sideload_image()を変更して、$ idを返すようにします。実際、関数はそれを手元に持っていますここソースを参照してください。実際、これにトラックチケットがあり、必要に応じて、コアにこれを適用するためのパッチも用意されています。


4.8でパッチの適用が予定されているようです
Tom Auger

3

私は解決策を探していて、media_sideload_image()非常に簡単なコードを調べることにしました。それはmedia_handle_sideload()私たちに愛着を与えるものを使用しますid

id画像のhtmlソースの代わりに添付ファイルを返すように変更し、新しいファイル名を送信する方法を追加しました。

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $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 null;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.