在循环内获取POST固定链接,但不需要额外的数据库查询

时间:2015-07-23 作者:NJ.

我正在寻找创建一个自定义的“目录”页面,将链接到数千篇文章。由于数量很大,我正试图限制DB查询的数量。我注意到,要链接到每篇文章,我调用get\\u permalink(),这将为每篇文章创建一个额外的DB查询。

是否可以在不进行额外查询的情况下检索post permalink?我尝试传递$post对象,但似乎没有帮助。我还查看了核心函数,注意到传递整个对象以及$post->filter=\'sample\'值将避免额外的get\\u post()调用,如下所示:

Why does `get_permalink()` produces an add. DB request without $post->filter?

但它似乎仍在引发额外的质疑。有什么想法吗?

1 个回复
SO网友:Pieter Goosen

我注意到,要链接到每个帖子,我打电话get_permalink() 这是为每个帖子创建一个额外的DB查询。

不是真的。如果您检查到非常旧的链接trac ticket #18822 在您链接的帖子中,这个问题是由@kaiser在2011年提出的。问题由@scribu回答

例如:

$posts = get_posts();
foreach ( $posts as $post )
    var_dump( get_permalink( $post->ID ) );
不会导致额外的查询,因为所有这些帖子都已缓存。您还可以将整个$post对象传递给get\\u permalink,无需额外查询get_post() 接受对象。事实上get_post() 只有在对象设置了筛选器属性且尚未缓存帖子ID时,才传递对象,才会执行查询。

像往常一样,我不是在理论上,而是在事实上,我获取事实的方式是在测试中

使用以下查询进行设置并运行它,并记录时间和db调用

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    // REST TO COME LATER

}
echo \'<p>\' . get_num_queries() . \' queries in \' . timer_stop(1, 5) . \' seconds. </p>\';
在本地安装时,我得到以下结果:

0.02539秒内查询20次

注意:查询量不仅仅是查询量,还包括页面上运行的查询总量,包括菜单、小部件、自定义查询、主查询等。每次页面加载的时间可能不同)

现在,更改查询,如下所示

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    get_permalink( $post->ID );

}
echo \'<p>\' . get_num_queries() . \' queries in \' . timer_stop(1, 5) . \' seconds. </p>\';
这是我的结果

0.02539秒内查询20次。

正如您所看到的,正如我已经证明的,在进行trac票证中描述的查询之前,首先检查缓存。

结论

您可以使用get_permalink() 您不必担心Wordpress中的缓存系统会导致额外的db调用。你也应该慢慢来,仔细检查一下trac记录单

结束

相关推荐

正在尝试列出带有WP_QUERY的子页

我正在尝试列出我制作的自定义页面的所有子页面。在我的自定义页面中,我这样做是为了列出页面:<?php get_header(); ?> <?php $subpages = new WP_Query( array( \'post_type\' => \'page\', \'post_parent\' => $post->ID, \'posts_per_page\' => -1,&#x