問題描述
(通過 「頁面模板」,我的意思是一個主題文件與“Template Name” header,可以在頁面管理員的”Template” 下拉字段中選擇。)
在多個實例中,我已經構建了可以通過掛接到 the_content 或 pre_get_posts 或類似的東西來實現的頁面模板。這讓我想知道是否有辦法”register” functions.php 中可選擇的主題模板或插件,而不創建主題文件本身。
為什麼我想這樣做的原因:
-
在我想到的情況下,我通常只是逐字地複製 page.php 。這意味着任何未來的更改 page.php 需要做兩次。這對兒童主題的更新更為痛苦。
-
我喜歡”Template” 字段 UI 。對於我的客户來説,我可以想到的一些替代方案 (見下文) 是有道理的。
在我的情況下,我可以想到一些解決方法,如使用自定義元框或短代碼 (插入另外保存在模板中的內容) 。我甚至可以做到這一點 (我剛剛想到但還沒有測試):
/*
Template Name: My Template
*/
get_template_part( 'page' );
但最後,我不斷回到這個想法,所以我很好奇是否有人知道如何做。如果你認為這是一個可怕的想法,我也對這個意見感興趣。
=======
更新:我應該補充一點:
-
我知道 this support forums thread 的每個主題都有一個
$templates數組,它基本上與我想要做的相反。 -
我知道有一個隱藏的自定義字段
_wp_page_template從 this WPSE thread 。
我想我只需要了解模板數組和自定義字段如何一起工作 (我也隱藏了隱藏的自定義元字段的工作模糊) 。
=======
更新 II:10/8/12 主題後端已被重新修改,因為這個問題被問及以上 $ templates 數組不再存在。
最佳解決方案
我仍然渴望做這樣的事情,並且已經解決了我在 OP 中提出的以下解決方案,並且有幾個原因:
-
它非常透明,與保持主題邏輯相一致。
-
它使得如果需要,稍後自定義模板非常容易。
自定義模板
如果我不需要任何自定義標記,這是整個模板文件。假設它在/wp-content/themes/my-theme/templates/my-template.php
<?php
/**
* Template Name: My Template
*/
get_template_part( 'page' );
使用它
這給了我們兩個”hooks” 來做各種各樣的事情:
-
適用於 CSS 的
.page-template-my-template身體類。 -
使用
if( is_page_template( 'templates/my-template.php' ) ) {...的能力
我用#1 來改變佈局,顏色等,我用#2 來過濾 the_content(),添加 post_class es,用 ACF 設置自定義字段等等。有時候,我們將它們組合使用,就像一個仍然需要側邊欄的 full-width 模板。如果您沒有自己設置,它非常強大,但非常容易設置和理解。
這仍然限於一個主題 (你不能使用插件),但為了我的問題的目的,這對我來説是一個很好的答案。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。