1回のクエリで複数の投稿から注目の画像(サムネイル)のURLを取得する
投稿IDのリストがあり、すべての標準データと投稿のサムネイルを取得する必要があります。数百の投稿があるので、すべてのIDをループしてhas_thummbnailを使用するだけでデータを検索する効率的な方法が必要です。そして同じ 'one by one'アプローチの他のすべてのバージョンでは、十分に速く動作しません。
問題は次のとおりです。
どのように私は各IDのための1つのクエリをせずに彼らのサムネイルのURLで複数の記事を取得することができます
更新:
Cybmetaがリンクされた投稿で指摘したように、 get_post_meta は追加のDBクエリを作成せず、その関数で投稿のカスタムフィールドを取得することが可能です。
_ but _ それでも、サムネイルのURLは表示されず、サムネイルのIDだけが表示されます。可能な方法( wp_get_attachment_image_src 、 wp_get_attachment_metadata 、...)のいずれかでURLを取得する場合は、サムネイルごとに追加のDBクエリを作成します。これらの関数は複数のIDを使用しません。
より具体的な質問:
1回のクエリで複数のサムネイルのURLをそれらのIDで取得する方法
_説明_
上記の私の更新で述べたように、サムネイルのIDを取得するために get_post_meta 関数を追加のDBオーバーヘッドなしで使用することができます。サムネイルIDへのURLを取得するための「通常の」方法は wp_get_attachment_image_src または同様の関数を使用することですが、それらはIDの配列を受け付けません。
私がwp_get_attachment_image_srcを使用して気づいたのは、1回の呼び出しにつき2回のクエリ(サムネイル毎のエルゴ)でさえ作成したということです。
_ソリューション_
同時に複数のURLを取得することがわかった唯一の解決策は、 wpdb を介してDB postmetaテーブルを直接クエリすることでした。
meta_key_thumbnail_idを持つリレーションpost-> thumbnailとmeta_valueとしてのサムネイルIDのためのpostmetaエントリがありますmeta_tags_wp_attachment_metadataおよび_wp_attached_fileと、サムネイルのID(post_id)を使用して、サムネイルごとのエントリ数を増やす。
したがって、postmetaテーブルの興味深い部分は次のようになります。
meta_id post_id meta_key meta_value
328 136 _wp_attached_file 2015/01/Dog-w-Glasses.jpg
329 136 _wp_attachment_metadata a:5{s:5:"width";i:...
...
335 138 _thumbnail_id 136
138は投稿のID、meta_idはこの例では関係ありません。
_thumbnail_idはpost_idにリンクされているため、get_post_metaを介して取得することができますが、実際のURLはサムネイルidの下に格納されているため、個別に取得する必要があります。
それで、私はget_post_metaを介して各投稿のすべてのサムネイルIDを取得してから、WPデータベースのpostmetaテーブルへのクエリを作成しました。
$thumb_ids = '( 23, 89, 24, 69 )'; // just an example
global $wpdb;
$qstr =
"SELECT post_id, meta_value
FROM $wpdb->postmeta
WHERE post_id IN " . $thumb_ids. ' AND meta_key = "_wp_attached_file"';
$results = $wpdb->get_results( $qstr, ARRAY_N );
これは結果を非連想配列の形式で返します。その関数のパラメータについての詳細はwpdbページをご覧ください。
このようにして、すべての投稿のすべてのURLを取得するために1つの追加のDB呼び出しのみが使用されています。
p.s .: DBクエリの分析に Query Monitor と Debug Bar を使用しました。