問題描述
有人可以向我解釋這個功能如何工作?我知道它是什麼,但是當我查看 twenty_ten 模板中的源代碼時,我不知道如何在一個單獨的循環中收集所有循環 (我也看到了這個文件) 。
那麼例如,如何抽象出一些模板的常見部分,然後在其他模板中重用呢?
最佳解決方案
這裏有一些非常好的介紹性答案。
基本上,get_template_part()允許主題開發人員設置模板文件的特殊性順序。想像它適用於 CSS 選擇器時的特殊性。當設計某些東西時,您需要從最低限度的特定性開始,以便在需要個人關注的設計部分中輕鬆覆蓋它。
因此,例如,您正在設計一個博客,並創建一個 loop.php 文件,用於標記帖子。但是您提前計劃,稍後再使用其他上下文説明符將其稱為模板文件 – 例如,在索引頁上,您可以在單個模板上調用 get_template_part( 'loop', 'index' );,在歸檔頁面上調用 get_template_part( 'loop', 'single' );,調用 get_template_part( 'loop', 'archive' ); 等。當您決定在歸檔頁面上標記循環與主頁不同時,這樣就很容易:只需創建一個 loop-archive.php 模板,它將被使用而不是通用的 loop.php 。
但 get_template_part()背後的魔術是 locate_template()功能,它首先檢查主題目錄,然後檢查名為的文件的父目錄 (如果存在) 。這對於插件開發非常有用。在我的一個插件中,我定義了一個自定義的帖子類型,併為我的插件目錄中的自定義帖子類型創建了一個循環模板文件。但是,我想允許主題使用我的插件來覆蓋我的標記,如果他們選擇。這就是 locate_template()真正的奇蹟。
locate_template($template_names, $load = false, $require_once = true )
將在樣式表目錄中的 $ template_names 數組中的每個名稱,然後在模板目錄中查找。作為 $ load 參數傳遞’true’ 意味着它將需要找到第一個文件,如果沒有找到模板文件,它將返回一個空字符串。所以我可以在我的插件中做這樣的事情:
if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
include( 'loop-mycustomposttype.php' );
… 應該希望主題開發人員可以通過在主題中包含一個名為 loop-mycustomposttype.php 的文件來自定義我的插件。
次佳解決方案
不是所有的循環,主循環。 ;-) 無論你看你的頭版還是類別,或者知道什麼,你總是會有一個主循環。該主循環的內容由在您的模板被調用之前運行的查詢確定。
loop.php 模板僅在循環中的項目上運行,並對它們進行格式化。見 the documentation at the Codex 。
如果你看看 Twenty-Ten 的 loop.php,你可以看到,Twenty-Ten 然後在單個模板文件中多樣化。
get_template_part()僅加載一個模板部件並運行它。您也可以將 loop.php 的部分解壓縮到單獨的文件中,並通過 get_template_part('loop', 'category')等進行替換。
或者您可以在循環中為每個單獨的帖子設置一個 part-template,並使您的 loop.php 僅在 while... 子句中調用 get_template_part('loop','post'); 。一切由你決定。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。