web-dev-qa-db-ja.com

1回のクエリで複数の投稿から注目の画像(サムネイル)のURLを取得する

投稿IDのリストがあり、すべての標準データと投稿のサムネイルを取得する必要があります。数百の投稿があるので、すべてのIDをループしてhas_thummbnailを使用するだけでデータを検索する効率的な方法が必要です。そして同じ 'one by one'アプローチの他のすべてのバージョンでは、十分に速く動作しません。

問題は次のとおりです。

どのように私は各IDのための1つのクエリをせずに彼らのサムネイルのURLで複数の記事を取得することができます

更新:

Cybmetaがリンクされた投稿で指摘したように、 get_post_meta は追加のDBクエリを作成せず、その関数で投稿のカスタムフィールドを取得することが可能です。

_ but _ それでも、サムネイルのURLは表示されず、サムネイルのIDだけが表示されます。可能な方法( wp_get_attachment_image_srcwp_get_attachment_metadata 、...)のいずれかでURLを取得する場合は、サムネイルごとに追加のDBクエリを作成します。これらの関数は複数のIDを使用しません。

より具体的な質問:

1回のクエリで複数のサムネイルのURLをそれらのIDで取得する方法

2
Larzan

_説明_

上記の私の更新で述べたように、サムネイルの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_idpost_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 MonitorDebug Bar を使用しました。

3
Larzan