我注意到,要链接到每个帖子,我打电话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记录单