問題描述

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。