我正在寻找一种有效的方法,从给定分类法类型的每个术语中检索最新的帖子。我发现this question, 这与我自己的解决方案是一样的:
$terms = get_terms( \'my_taxonomy\' );
foreach( $terms as $term) {
$args = array(
\'posts_per_page\' => 1,
\'post_type\' => \'any\',
\'my_taxonomy\' => $term -> slug
);
$termQuery = new WP_Query( $args );
while ( $termQuery -> have_posts() ) : $termQuery -> the_post(); ?>
// display post
endwhile;
}
基本上,获取所有术语,然后针对每个术语执行WordPress查询以检索最近的帖子。
我看不出有什么理由不能像预期的那样工作,但我无法摆脱这样一种感觉,即它效率低下得令人痛苦。有没有更好的方法?
最合适的回答,由SO网友:Pieter Goosen 整理而成
你是对的,这是无效的,而且你对此也无能为力。我认为唯一的其他方法可能是使用一个非常大(也不有效)的自定义SQL查询,不幸的是,我无法帮助您。如果你有10或20个条款,影响不会那么大,但如果你有更多条款,效果会非常明显。
唯一有效的方法是将结果放入trancient,然后在发布、删除或更新新帖子时刷新并重置该瞬态(使用transition_post_status
挂钩)。如果你在短时间内没有发布很多帖子,这将非常有效。如果您每天要发布一到两次以上的内容,那么不幸的是,如果您只有几个术语,那么我不会费心走这条路线,因为设置瞬态比实际查询本身更昂贵。
参考文献
Transient API
transition_post_status
其他资源
这里有一些帖子,你可以看看我最近做的关于瞬变和使用瞬变的帖子
transition_post_status
Transient not working for custom loops
Get all categories and posts in those categories
Custom query - alternate posts by category
在您的代码上添加一些注释,您可以通过添加\'no_found_rows\' => true,
到您的查询参数。默认情况下,如果你要求一个帖子,WP_Query
检索这一篇文章,但它也会检查完整数据库中与查询参数匹配的所有文章。这样做是为了分页。为了避免在像您这样的查询中出现这种情况,no_found_rows
已使用。这将使WP_Query
寻找第一个匹配的职位,然后在找到匹配的职位后立即退出您首先要检查$terms
在使用它之前是否实际具有有效值。get_terms
成功时返回术语数组,或WP_Error
或失败时为空阵列。如果您的代码失败,省略这些检查将导致php错误和通知,这是您应该避免的错误。您需要记住,如果有任何代码可能失败(几乎是任何代码),您需要确保代码以预期的受控方式失败。在这种情况下,您需要检查$terms
不是空的或$terms
未返回WP_Error
对象
您需要重置的每个实例WP_Query
. 的一个实例WP_Query
可能会对的下一个实例产生意外影响WP_Query
. 如果忽略重置每个查询,可能会使您在出现代码故障和bug时陷入白费力气。Always 确保重置所有自定义查询。应通过添加wp_reset_postdata()
就在之后endwhile
但之前endif
在您的循环中。
你应该使用合适的tax_query
作为{tax}
语法按单据折旧
最后的想法为了测试代码的有效性,请在本地安装上设置一个测试页面,如我在中所述this post. 这将让您通过返回db调用的数量以及特定代码进行这些调用所花费的时间来了解代码的效率。我always 这样测试我的代码。
在本地安装上安装以下插件也是一个好主意:(不要在生产/实时站点上安装这些插件。一旦安装,你就会明白原因。)
(注意:我与这些插件没有任何关联:-))这些插件对于开发人员来说是必须的,它会将调试错误打印到屏幕上,向您显示页面加载时间、查询的总量和所用的时间,还将分解这些查询等。