問題描述

有人可以向我解釋這個功能如何工作?我知道它是什麼,但是當我檢視 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。