子目录中的 Wordpress 模板文件

Posted

技术标签:

【中文标题】子目录中的 Wordpress 模板文件【英文标题】:Wordpress template files in subdirectory's 【发布时间】:2017-10-30 21:52:02 【问题描述】:

不久前,我开始了一个新的 Wordpress 项目。但我遇到了一个问题。由于有多种设计,我需要为不同的页面模板上的页面、帖子和文本格式输出创建多个模板。

因此,由于模板文件太多,我想创建一些子目录。我知道,从 Wordpress 3.4 及更高版本开始,您可以将子目录名称 page-templates 用于所有页面模板,但我如何将其用于格式文件和发布文件。

是的,我确实尝试添加以下功能:

 get_template_part('/template-parts/page-templates' , 'page');

require( get_template_directory() . '/template-parts/template-tags.php' );

我想创建的理想目录结构如下:

wp-content/themes/mytheme
- archive
- 404
- CSS
- JS
- Images 
- template-parts (dir)
-- page-templates (dir for page-template files.)
-- format-templates (dir for format-templates.)
-- post-templates (dir for post-templates.)
- header
- footer

所以要清楚。我想为上面的模板文件创建结构。不要介意CSS 等文件夹。这些设置正确。目的是,在我成功创建结构后,能够从/wp-admin 编辑页面部分选择像页面寺庙这样的模板。

【问题讨论】:

这个对同一问题的回答解释了它在 wordpress 中的硬编码位置。 wordpress.stackexchange.com/a/250024。但是,弄乱核心 wordpress 文件并不是一个好主意。 如果您可以为您的页面使用自定义帖子类型,您可能喜欢使用apply_filters( "theme_$post_type_templates", $post_templates, $this, $post, $post_type );,在这里您可以编写代码深入到目录级别。 【参考方案1】:

WP_Theme 类包含提供此过滤器的方法 get_page_templates()

apply_filters( "theme_$post_type_templates", $post_templates, $this, $post, $post_type );

line 1103 of class-wp-theme.php

请记住,在 wordpress 中 postpagepost_types,

add_filter( "theme_post_templates", ...add_filter( "theme_page_templates",... 应该是有效的。

Under the codex's "Used By" section 对于该方法,它声明:

wp-admin/includes/template.php: page_template_dropdown()

wp-admin/includes/meta-boxes.php: page_attributes_meta_box()

这让我相信这会让它们在 /wp-admin/ 编辑页面部分可用。

核心文件中有关过滤器的信息:

 * Filters list of page templates for a theme.
 *
 * The dynamic portion of the hook name, `$post_type`, refers to the post type.
 * @since 4.7.0 Added the `$post_type` parameter.
 *
 * @param array        $post_templates Array of page templates. Keys are filenames,
 *                                     values are translated names.
 * @param WP_Theme     $this           The theme object.
 * @param WP_Post|null $post           The post being edited, provided for context, or null.
 * @param string       $post_type      Post type to get the templates for.

我不确定相对 uri 是否在这里有效,或者您是否需要 get_theme_file_path(),但我假设是前者。

function deep_templates( $post_templates, $theme, $post, $post_type )
   $post_templates['/folder/folder/folder/file.php'] = "Page Style One";
   $post_templates['/folder/other-folder/file.php']  = "Page Style Two";
   return $post_templates;
add_filter( 'theme_page_templates', 'deep_templates' );

与/或

add_filter( 'theme_post_templates', 'deep_templates' );
add_filter( 'theme_my-custom-cpt_templates', 'deep_templates' );

【讨论】:

谢谢,这确实工作得很好。为了给其他人一个好的答案,我将在一秒钟内编辑你的答案,说明我如何更新我的 functions.php 以完成 sub > sub 目录模板。【参考方案2】:

这是您需要做的一个示例。

- directory1 (dir)
-- directory2 (dir)
--- template-file.php

要使用get_template_part 访问此模板,您可以这样做:

get_template_part( 'directory1/directory2/template', 'file' );

'directory1/directory2 定义目录结构。 template' 是模板名称中- 之前的字符串。 'file' 是模板名称中dash 后面的字符串。

因此,如果您在 page-templates 目录中有一个名为 page-contact.php 的模板文件,您会使用。

get_template_part('template-parts/page-templates/page' , 'contact');

【讨论】:

好的,我明白了,你能告诉我我可以把这段代码放在哪里,以便/wp-admin 后端可以在编辑页面时读取我的模板。 哦,好吧,我想我误解了。我以为您指的是模板部分而不是完整的页面模板。我相信您可以将模板文件放在自己的模板结构中(尽管只有 1 级深),只要您在模板文件顶部添加 /* Template Name: my fancy template name */ 作为 PHP 注释,管理员就会选择它。 我已经知道了,很抱歉我已经编辑了我的问题。但是两层深呢? Wordpress 仅搜索 1 级深度的模板。这是硬编码到 wordpress 核心的,遗憾的是无法更改。 我不确定您是否是这种情况,但我制作的模板通常只是结构框架。我的大部分重要代码都保存在模板部分中,您可以将其放入您想要的任何目录结构中,然后在模板文件中使用get_template_part 调用它们。【参考方案3】:

我知道这是一个已经有答案的老问题,但这不是我正在寻找的解决方案。添加另一个选项,以防其他人正在寻找将所有 WordPress 模板文件移动到子文件夹的方法。在 Reddit 上找到了这个 code for changing the default folder for WordPress template files 并做了一些小的调整。这段代码可以放在你的主题或子主题的functions.php中。

/**
 * Tell WordPress that we have moved default template files to the page-templates folder.
 * Based on code from: https://www.reddit.com/r/Wordpress/comments/ffhjvw/moving_wordpress_theme_template_files_to/
 *
 * Related posts with other solutions:
 * https://***.com/questions/60589503/moving-wordpress-theme-template-files-to-subdirectory
 * https://wordpress.stackexchange.com/questions/17385/custom-post-type-templates-from-plugin-folder
 * https://wordpress.stackexchange.com/questions/291725/store-page-template-files-in-a-subfolder
 * https://wordpress.stackexchange.com/questions/312159/how-to-move-page-template-files-like-page-slug-php-to-a-sub-directory/312611#312611
 * 
 * Template hierarchy info: 
 * https://developer.wordpress.org/reference/hooks/type_template_hierarchy/
 * https://core.trac.wordpress.org/browser/tags/5.8.1/src/wp-includes/template.php
 * https://developer.wordpress.org/themes/basics/organizing-theme-files/#page-templates-folder
 *
 * @param array $templates A list of candidates template files.
 * @return string Full path to template file.
 */
function change_template_path($templates) 

  // The custom sub-directory for page templates in your theme. 
  $custom_sub_dir = 'page-templates';

  // Don't use the custom template directory in unexpected cases.
  if(empty($templates) || ! is_array($templates)) 
    return $templates;
  

  $page_template_id = 0;
  $count = count( $templates);
  if($templates[0] === get_page_template_slug()) 
    // if there is a custom template, then our page-slug.php template is at the next index
    $page_template_id = 1;
  

  // The last one in $templates is page.php, single.php, or archives.php depending on the type of template hierarchy being read.
  // Paths of all items starting from $page_template_id will get updated
  for($i = $page_template_id; $i < $count ; $i++) 
    $templates[$i] = $custom_sub_dir . '/' . $templates[$i];
  

  return $templates;


// Add filters to override the path for each WP template hierarchy.
// These are all the template hierarchy filters. You should probably only override the ones you need.
add_filter('404_template_hierarchy', 'change_template_path');
add_filter('archive_template_hierarchy', 'change_template_path');
add_filter('attachment_template_hierarchy', 'change_template_path');
add_filter('author_template_hierarchy', 'change_template_path');
add_filter('category_template_hierarchy', 'change_template_path');
add_filter('date_template_hierarchy', 'change_template_path');
add_filter('embed_template_hierarchy', 'change_template_path');
add_filter('frontpage_template_hierarchy', 'change_template_path');
add_filter('home_template_hierarchy', 'change_template_path');
// If you override the index hierarchy, be sure to add an index.php template in your custom template folder.
add_filter('index_template_hierarchy', 'change_template_path'); 
add_filter('page_template_hierarchy', 'change_template_path');
add_filter('paged_template_hierarchy', 'change_template_path');
add_filter('privacypolicy_template_hierarchy', 'change_template_path');
add_filter('search_template_hierarchy', 'change_template_path');
add_filter('single_template_hierarchy', 'change_template_path');
add_filter('singular_template_hierarchy', 'change_template_path');
add_filter('tag_template_hierarchy', 'change_template_path');
add_filter('taxonomy_template_hierarchy', 'change_template_path');

【讨论】:

【参考方案4】:

get_template_part will only work as part of a WordPress THEME.

您要做的是创建自己的 WordPress 主题(位于 wp-content/themes/ 中),然后您可以将其用于您想要的任何 PHP 模板、CSS 资源等。

您可以查看如何构建 WordPress 主题并包含所有内容in the codex here.

【讨论】:

是的,这是我自己的构建主题。它已经构建并与模板文件等一起使用。我遇到的唯一问题是重新组织主题。正如我所说,我只需要知道如何使用自定义目录。完整的 wordpress 代码的链接不是解决方案。 我的意思是在主题文件夹之外使用 get_template_part 是行不通的,因为无法找到该文件。在这种情况下,您需要使用 WordPress 框架之外的传统 PHP 包含/要求。 这一切都在主题文件夹中。不在外面。 你的问题不清楚,你应该有: - wp-content -- 主题 --- CSS .... WizardCoder 上面的回答应该有效【参考方案5】:

您需要为每个不同的设计创建一个模板文件(在“page-templates”目录中)。

要创建可从 de Backend(wp-admin) 访问的模板文件,您需要添加:

<?php
/*
Template Name: TEMPLATE-NAME
*/
?>

在每个文件(模板)的顶部。然后在每个文件中,您可以使用 get_template_part() 函数添加设计的块或模块。

【讨论】:

这不是问题。我在我的问题中告诉过我已经意识到这一点并且我正在使用它。我要创建的是一种在子>子目录中使用page-templates的方法。 抱歉,我没有注意到您希望模板位于主题的 2 深度目录中。不修改WP核心恐怕没办法。

以上是关于子目录中的 Wordpress 模板文件的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress-包含模板文件夹中的PHP文件

我可以在模板文件中的 WordPress 中获取“基本 URL”吗?

jQuery中WordPress模板目录的路径?

我正在编写一个 PHP 函数来搜索 Wordpress 模板文件中的邮政编码数组。为啥我的函数不返回值?

Wordpress主题安装问题

WordPress使用自定义文章类型实现任意模板的方法和怎么做邮件回复