問題描述

(通過 「頁面模板」,我的意思是一個主題文件與“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_templatethis WPSE thread

我想我只需要了解模板數組和自定義字段如何一起工作 (我也隱藏了隱藏的自定義元字段的工作模糊) 。

=======

更新 II:10/8/12 主題後端已被重新修改,因為這個問題被問及以上 $ templates 數組不再存在。

最佳解決方案

我仍然渴望做這樣的事情,並且已經解決了我在 OP 中提出的以下解決方案,並且有幾個原因:

  1. 它非常透明,與保持主題邏輯相一致。

  2. 它使得如果需要,稍後自定義模板非常容易。

自定義模板

如果我不需要任何自定義標記,這是整個模板文件。假設它在/wp-content/themes/my-theme/templates/my-template.php

<?php
/**
 * Template Name: My Template
 */
get_template_part( 'page' );

使用它

這給了我們兩個”hooks” 來做各種各樣的事情:

  1. 適用於 CSS 的.page-template-my-template 身體類。

  2. 使用 if( is_page_template( 'templates/my-template.php' ) ) {... 的能力

我用#1 來改變佈局,顏色等,我用#2 來過濾 the_content(),添加 post_class es,用 ACF 設置自定義字段等等。有時候,我們將它們組合使用,就像一個仍然需要側邊欄的 full-width 模板。如果您沒有自己設置,它非常強大,但非常容易設置和理解。

這仍然限於一個主題 (你不能使用插件),但為了我的問題的目的,這對我來説是一個很好的答案。

參考文獻

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