問題描述

什麼是我最早可以採取的行動,我可以在哪裡可以訪問全域性 $post/$posts 變數在前端和後端?我試過看過 the Codex referenceAdam Brown’s reference 和撇去源頭幾次,但沒有多少運氣找到一個好的。

pre_get_posts 太早了如果要在回撥期間進行第二次 get_posts() 呼叫,則使用 posts_selection 不起作用; 而 template_redirect 不在管理端執行。 the_post 可能早於 template_redirect 為前端,但也不會在後端執行。理想情況下,我會想要在 get_post()/get_posts()返回之前執行的東西,但我沒有看到任何類似的東西。

過去我已經使用了 the_posts 過濾器,但是我更喜歡採用一種操作,因為它在技術上更正確。

現在我只是兩次掛著; 一旦使用 template_redirect 作為前端,並再次使用 admin_xml_ns 作為後端。我不太喜歡這個,因為我的邏輯與任何一個鉤子都沒有語義關聯,而且這似乎是一個非常常見的需求,應該有像”post_get_posts”(ala pre_get_posts) 這樣的鉤子雙方。

最佳解決辦法

對於除單獨的帖子編輯螢幕 (wp-admin/post.php) 之外的所有管理頁面和前端頁面,'wp'是獲取全域性值的最可靠的鉤子。

http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-includes/class-wp.php.source.html#l486

你可以看到它在 WP::main()觸發 WP::register_globals()後立即觸發。使用像 post_resultsget_posts 這樣的東西的問題是,每當你釋出查詢時,它都會執行。 'wp'僅在功能 WP::main()中觸發,這是 WP 核心用於執行頁面主要請求查詢的功能。

對於帖子編輯螢幕,看起來像您可以使用的第一個鉤子可以是'add_meta_boxes'。儘管它透過了全域性 $post 物件作為第二個引數 (第一個是當前帖子的 $post_type),但您只需要確保在掛起時處於核心頁面。

次佳解決辦法

posts_results 是原始查詢結果的過濾器。參見 wp-includes/query.php 第 2627 行。

參考文獻

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