2016-09-12 23 views
0

我是WordPress新手,最近一直在學習很多關於pre_get_posts的知識。我理解這個基本概念,但是在文檔的一部分中被絆倒了。你可以在主查詢之外使用pre_get_posts嗎?

codex

「同樣,如果在模板文件(例如,archive.php)使用pre_get_posts將無法正常工作,因爲查詢完成後,他們被稱爲」

如果你不能在模板文件中使用它,這是否意味着它只對index.php有用?如果是這樣的話,爲什麼pre_get_posts被用來改變存檔顯示方式的頁面還有一個例子呢?

我明白pre_get_posts的功能(特別是query_posts),但我很難在一個站點上多次使用它。我看到的所有內容都顯示它僅用於主循環。

任何指導,非常感謝。

回答

0

archive.php,category.php這樣的文件就是WordPress所謂的模板文件。正如documentation所述,頁面模板通常具有高度的特異性。這可以解釋爲什麼在調用模板文件之前查詢已經初始化,因此pre_get_posts會錯過它在模板文件上的位置。

您可以顯示不帶模板文件的存檔,如archive.php,category.php,但pre_get_posts實際上只是用於在主查詢中調用。這意味着,如果您將add_action('pre_get_posts', 'my_callback_function')添加到您的functions.php文件中,它將會改變整個查詢網站。您可以在特定的頁面類型過濾回調裏面,像這樣:

function my_callback_function($query){ 

    // Only if page type is category 
    if(is_category()){ 
     $query->set('posts_per_page', 7); 
    } 

    // Always except for search page types 
    if(!is_search()){ 
     $query->set('posts_per_page', 4); 
    } 
} 

這樣就沒有必要打電話pre_get_posts兩次。

如果要執行多個查詢或指定archive.php查詢,請使用WP_Query()的實例。

More details

+0

非常感謝您的回覆,我非常感謝。我唯一的後續問題是:如果pre_get_posts是爲主查詢而設的, – Travis

+0

非常感謝您的回覆,我非常感謝。在我看來,我在WP上開發的大部分內容都會有一個主要查詢,然後幾乎所有其他頁面請求都會傳遞到模板文件,我可以像使用WP_Query()那樣使用實例。有沒有一種場景可以在同一個網站上多次使用pre_get_posts?再次感謝您的幫助,我試着加快響應速度,但我還沒有足夠的聲譽來註冊。 – Travis

+0

這真的讓我想到了,我想我需要咖啡......如果你想影響每一種頁面請求的主要查詢,你必須在你的'functions.php'文件中加入帶有回調函數的'add_action',這實際上適用於例如'archive.php','category.php'和所有的子模板文件,如'category-category-a.php'。你可以在'functions.php'中創建不同的回調函數,就像'is_category()',然後'add_action('pre_get_posts','my_category_callback_function')',但不止一次調用它是多餘的,因爲它隻影響一個查詢,主要查詢。 – Joachim

相關問題