問題描述

問題:我試圖阻止執行自定義類別模板的默認 WordPress 查詢。我找到了一個可能的解決方案,但是看起來像是阻止所有帖子查詢的執行:

function _cancel_query( $query ) {
    if ( !is_admin() && !is_feed() && is_search() ) {
        $query = false;
    }
    return $query;
}
add_action( 'posts_request', '_cancel_query' );

資料來源:http://vadimk.com/2010/05/11/disable-wordpress-search-query/

‘@query->is_main_query()’ 不能與’posts_request’ 動作配合使用。有沒有任何優雅的方式來防止只有默認的 WordPress 查詢,允許我的代碼處理獲取帖子,而不執行無用的操作?

為什麼:我必須得到精選帖子,然後固定數量的正常帖子沒有重複的內容,這意味着後期查詢依賴於特色查詢結果,因為不能保證在後期查詢我找到足夠的特色帖子填充功能框。畢竟,我將不得不添加 AJAX 分頁 – 仍然沒有重複的內容。

編輯#2:如果您嘗試以 Rarst 建議 (How to prevent execution of default query, while preserving ability to use WP_Query in template?) 在’pre_get_posts’ 中執行 WP_Query:

「pre_get_posts 運行在 WP_Query 已經被設置之前,依賴於 WP_Query 的一些模板標籤和條件函數將不起作用,例如, is_front_page() 將不起作用,儘管 is_home() 將會工作,在這種情況下,您需要直接使用查詢 vars 作為參數傳遞給 pre_get_posts 鈎子 (在此頁面的示例中為 $ query) 。

資料來源:https://codex.wordpress.org/Class_Reference/WP_Query

WP_Query 將在這個階段進行初始化,在主查詢之前,為避免這樣的結果 (檢出日誌),你必須包裝它:

if ($query->is_main_query()) {
    $args = array();
    $query = new WP_Query( $args );
}

日誌:

[30-Apr-2013 17:07:12 UTC] PHP Fatal error:  Maximum function nesting level of '100' reached, aborting! in C:UsersserwisDropboxwwwXYZwp-includesfunctions.php on line 2769

[30-Apr-2013 17:07:12 UTC] PHP Stack trace:

[30-Apr-2013 17:07:12 UTC] PHP   1. {main}() C:UsersserwisDropboxwwwXYZindex.php:0

[30-Apr-2013 17:07:12 UTC] PHP   2. require() C:UsersserwisDropboxwwwXYZindex.php:17

[30-Apr-2013 17:07:12 UTC] PHP   3. wp() C:UsersserwisDropboxwwwXYZwp-blog-header.php:14

[30-Apr-2013 17:07:12 UTC] PHP   4. WP->main() C:UsersserwisDropboxwwwXYZwp-includesfunctions.php:779

[30-Apr-2013 17:07:12 UTC] PHP   5. WP->query_posts() C:UsersserwisDropboxwwwXYZwp-includesclass-wp.php:549

[30-Apr-2013 17:07:12 UTC] PHP   6. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesclass-wp.php:485

[30-Apr-2013 17:07:12 UTC] PHP   7. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP   8. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP   9. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  10. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  11. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  12. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  13. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  14. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  15. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  16. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  17. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  18. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  19. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  20. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  21. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  22. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  23. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  24. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  25. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  26. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  27. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  28. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  29. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  30. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  31. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  32. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  33. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  34. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  35. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  36. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  37. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  38. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  39. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  40. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  41. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  42. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  43. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  44. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  45. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  46. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  47. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  48. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  49. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  50. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  51. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  52. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  53. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  54. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  55. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  56. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  57. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  58. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  59. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  60. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  61. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  62. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  63. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  64. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  65. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  66. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  67. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  68. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  69. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  70. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  71. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  72. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  73. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  74. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  75. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  76. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  77. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  78. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  79. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  80. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  81. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  82. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  83. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  84. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  85. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  86. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  87. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  88. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  89. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  90. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  91. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  92. do_action_ref_array() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  93. call_user_func_array() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  94. gs_pre_get_posts() C:UsersserwisDropboxwwwXYZwp-includesplugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  95. WP_Query->__construct() C:UsersserwisDropboxwwwXYZwp-contentthemesroots-XYZlibcustom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  96. WP_Query->query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  97. WP_Query->get_posts() C:UsersserwisDropboxwwwXYZwp-includesquery.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  98. WP_Query->parse_query() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1922

[30-Apr-2013 17:07:12 UTC] PHP  99. absint() C:UsersserwisDropboxwwwXYZwp-includesquery.php:1442

最佳解決方案

完全取消主查詢是幾乎非常高級的瘋狂,涉及 wp 類的子類化。

我會:

  1. is_main_query()檢查卡入 pre_get_posts

  2. 運行特徵查詢 (仍然在鈎子中) 並將結果存在某處

  3. 使用這些結果在主查詢中設置排除的帖子

次佳解決方案

我知道答案可能遲到,但是在進行測試項目時遇到了類似的問題。這是我如何解決它。

/* apply this filter only on relevant to you pages */
function mb_bail_main_wp_query( $sql, WP_Query &$wpQuery ) {
    if ( $wpQuery->is_main_query() ) {
        /* prevent SELECT FOUND_ROWS() query*/
        $wpQuery->query_vars['no_found_rows'] = true;

        /* prevent post term and meta cache update queries */
        $wpQuery->query_vars['cache_results'] = false;

        return false;
    }
    return $sql;
}
add_filter( 'posts_request', 'mb_bail_main_wp_query', 10, 2 );

@UPDATE:

更改代碼以使用正常功能而不是匿名的,並使得代碼返回’false’ 而不是 「SELECT 0 AS ID」,因為它返回一個虛擬的空 WP_Post 對象。返回’false’ 使 $ wpdb-> get_results() 提前保留,因此不會進行任何查詢。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。