问题描述

Possible Duplicate:
When to use WP_query(), query_posts() and pre_get_posts

我刚才注意到,the documentation for query_posts()提到了一些使用 query_posts 改变主循环的”disadvantages”,特别是:「引起额外的 SQL 查询」 。

这似乎意味着有另一种方式/更好的方式。显然,有二次循环使用了 get_posts() 和 WP_Query,但是我没有看到它们是在 Codex 文档中列出的”disadvantages” 。

我可以看到,等到你进入模板运行 query_posts 之前,WordPress 已经运行了一次查询,现在是第二个查询,第一个被忽略 (第一个被基本忽略) 。这绝对没有效果 (尽管也许并不重要,谁知道?)

我的问题是:是否有替代 query_posts 不添加 「附加 SQL 查询」 或 Codex 文档是否只是欺骗?

最佳解决方案

当我加入法典的缺点时,我主要考虑使用’request’ 过滤器作为 query_posts() 的替代品。

该筛选器仅针对主查询运行,以便解决每个查询触发的’pre_get_posts’ 问题。

缺点是您无法访问像 is_single() 等查询标志。

这里有一种方法可以访问它们,而不会实际执行 SQL 查询:

function alter_the_query( $request ) {
    $dummy_query = new WP_Query();  // the query isn't run if we don't pass any query vars
    $dummy_query->parse_query( $request );

    // this is the actual manipulation; do whatever you need here
    if ( $dummy_query->is_home() )
        $request['category_name'] = 'news';

    return $request;
}
add_filter( 'request', 'alter_the_query' );

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。