问题描述

(通过 「页面模板」,我的意思是一个主题文件与“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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。