問題描述
我遇到了一個有趣的問題,關於 get_template_part()。
我創建了一個主題選項頁面 (命名為 sitewideSettings.php)
通常我會將它包含在 functions.php 中,如下所示:
include(TEMPLATEPATH."sitewideSettings.php");
工作正常
但現在我試圖使用 get_template_part();
get_template_part('sitewideSettings');
這也是正常工作,除了當點擊’update’ 更新設置時,我收到一條錯誤消息:「你確定要這樣做嗎?請再試一次」 。
「請再試一次」 鏈接回主題選項頁面,點擊更新可以讓您回到錯誤消息,讓您回到主題選項,並且我們走遍。
除了使用 get_template_part(); 之外,沒有其他的改變
有人遇到這個問題嗎?你是怎麼碰到的?我相信它的東西簡單明瞭,但完全是逃避了我。
(它不是在兩個實例中都創建的 nonce 問題)
最佳解決方案
我知道你説這不是一個問題,但顯然是。該通知是默認的 「這個 nonce 沒有簽出」 消息。我不知道為什麼隨機性失敗,但這是發生了什麼。
我會仔細檢查你的隨機數是如何創建和檢查的。如果您使用 wp_nonce_field(),請確保操作值和參數值都相同。此外,請雙重檢查變量的拼寫,或任何可能導致隨機數失敗的 scope-related 問題。
EDIT
跟隨你堅持認為這不是一個現在的問題 (這是現實的問題是由範圍問題引起的),這裏’s what’s 可能發生了。包含/必需的文件在其包含的範圍內執行。我猜想你正在使用一個變量來構建隨機數操作或隨機數字名稱。因為 get_template_part()在該函數的範圍內包含模板文件,所以不再在管理頁面的顯示回調範圍內執行。您需要在所有位置全局化這些變量,或者需要使用常量而不是變量。
次佳解決方案
請不要在管理員/後端使用 get_template_part() 。它被設計用於模板使用 (顯示主題,請參閲 codex),所以這是打算用於主題中的模板和 template-parts:
Function Reference/get template part
Load a template part into a template (other than header, sidebar, footer). Makes it easy for a theme to reuse sections of code in an easy to overload way for child themes.
該功能確實包括一般的源代碼,但是你所經歷的 (正如約翰指出的) 可能與範圍有關。因為我不知道你的代碼,所以我不能肯定地説,如果這是你所面臨的問題的確切原因 (可變範圍),所以我傾向於在我的答案中保持簡單:
該函數只是不按規定的 php 代碼替換,例如寫入管理頁面。
所以只要不要使用它,如果你的管理頁面,除非你真的知道你在做什麼。
更新:
如果要在查看子目錄和父主題目錄時將 php 文件加載到全局範圍內,可以使用為您搜索文件的功能:locate_template():
Retrieve the name of the highest priority template file that exists.
Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which inherit from a parent theme can just overload one file.
給定的例子包括 include(TEMPLATEPATH."sitewideSettings.php"); 這可以寫成:
include(locate_template('sitewideSettings.php'));
這允許您控制文件的包含位置和方式 (include /_once; require /_cone),並且阻止您在示例中發生破壞 NONCE 機制的範圍問題。
「請再試一次」 消息是因為 wp-admin 無法驗證請求,更具體地説是所謂的 nonce 。可能有兩個原因:請求中沒有 (例如,表單不提供任何信息,或者沒有被管理員代碼轉移或讀取) 或該隨機數是無效的。永遠代表一連串的動作,如果連鎖被打破,你會得到這個消息。但是這條消息並不告訴你那條鏈壞了。
管理員中的這些錯誤消息並不總是很豐富,甚至可能會導致誤導 (相關:#14060) 。要了解這裏發生了什麼,最有效的是在出現錯誤的系統上進行調試,因為它可能是相當具體的哪個鏈的哪個部分被破壞。
請參閲 codex,瞭解如何為您的主題或插件創建管理頁面以獲取更多有關隨機數,管理頁面等的 in-depth 信息。由於某些原因,管理員請求無法驗證該隨機數。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。