使用一个查询从多个帖子中检索特色图像(缩略图)URL

时间:2015-01-08 作者:Larzan

我有一个帖子ID列表,需要获取所有标准数据以及帖子的缩略图。由于将有数百篇帖子,我需要一种有效的方法来检索数据,只需在所有ID上循环并使用has\\u thummbnail。。。同样的“一个接一个”方法的所有其他版本都无法足够快地工作。

So the question is:

如何使用多篇文章的缩略图url检索多篇文章,而不必对每个id进行一次查询

UPDATE:

正如cybmeta在相关帖子中指出的,get_post_meta 不创建额外的DB查询,使用该函数可以检索帖子的自定义字段。

BUT 这仍然没有给我缩略图的URL,只有缩略图的ID。当通过一种可能的方法检索URL时(wp_get_attachment_image_src, wp_get_attachment_metadata, ...) 我为每个缩略图创建了一个额外的DB查询,因为这些函数不需要多个ID!

More specific question:

如何在一个查询中通过多个缩略图的id检索其url

2 个回复
最合适的回答,由SO网友:Larzan 整理而成

EXPLANATION

如上所述,要检索缩略图的IDget_post_meta 函数可以在没有任何额外DB开销的情况下使用。获取缩略图id的url的“常规”方法是wp_get_attachment_image_src 或类似的函数,但这些函数不接受ID数组。

我注意到,使用wp\\u get\\u attachment\\u image\\u src时,每次调用都会创建两个查询(每个缩略图的遍历),一个用于获取帖子数据,另一个用于实际url。

SOLUTION

我发现的同时检索多个url的唯一解决方案是通过wpdb.

对于关系post->缩略图,有一个postmeta条目,该条目带有meta\\u键,缩略图id为meta\\u值,然后每个缩略图有两个以上的条目,其中meta\\u标记为wp\\u attachment\\u metadata和wp\\u attached\\u file,缩略图id为post\\u id。

因此,Posteta表中有趣的部分如下所示:

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\\u id与本例无关。

由于缩略图id链接到post\\u id,因此可以通过get\\u post\\u meta检索,但由于实际url存储在缩略图id下,因此必须单独检索。

因此,我所做的是通过get\\u post\\u meta检索每个帖子的所有缩略图ID,然后创建对WP数据库的postETA表的查询:

$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页面。

这样,只使用一个额外的DB调用来检索所有帖子的所有URL。

p.s.: 我用过Query MonitorDebug Bar 分析DB查询。

SO网友:Zaheer Abbas Aghani

更清晰的代码实现了帖子缩略图的完整URL。获取帖子缩略图后,只需使用word press内置方法wp_get_attachment_url( get_post_thumbnail_id( $id ) ); 实现完整URL。

全球wpdb美元;

            $to = "2017/10/25";
            $from = "2017/10/27";
            $tablename = $wpdb->prefix . "posts";
            $sql = $wpdb->prepare( "SELECT * FROM $tablename 
            /*JOIN $wpdb->term_relationships tr ON (p.ID = tr.object_id)
            JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
            JOIN $wpdb->terms t ON (tt.term_id = t.term_id)*/
            Where post_type =%s AND  post_date BETWEEN %s AND %s  ",\'post\',$to, $from);
            $results = $wpdb->get_results( $sql , ARRAY_A );
            //print_r($results);
            foreach ( $results as $post )
            {

                $id = $post[\'ID\'];
                //echo  $post[\'parent\'].\'<br/>\';
                echo wp_get_attachment_url( get_post_thumbnail_id( $id ) );


            }

结束

相关推荐

Add CPT values to Database

我不确定这是不是件容易的事。我有一个插件,具有定制帖子类型所需的所有功能:过滤器、导航。。。我需要为这个CPT创建很多帖子(使用分类法)(需要做很多工作才能正确创建它)。所以我只想添加一次这个自定义帖子,而不是每次我想利用我在其他网站的插件。。。实现这一目标的最佳方式是什么?我是不是每次都要进行某种形式的进出口贸易?我应该利用wp\\u insert\\u post并对帖子的内容进行硬编码吗?为我的英语道歉,我不知道我是否已经解释过了。。。谢谢