ryan

wordpress模板层级

88 次阅读

WordPress 渲染页面时,会根据访问的 URL 类型去寻找对应的模板文件,从最具体到最通用依次查找,如果找不到就会回退到更通用的模板,最终会用 index.php 兜底。

首页

我们看wp的源码,template-loader.php:

$tag_templates = array(
    'is_embed'             => 'get_embed_template',
    'is_404'               => 'get_404_template',
    'is_search'            => 'get_search_template',
    'is_front_page'        => 'get_front_page_template',
    'is_home'              => 'get_home_template',
    ...
    'is_archive'           => 'get_archive_template',
);

这里的顺序 就是模板加载优先级。所以首页的模板顺序为:

1.front-page.php

2. home.php

3.index.php,

Page页面

page页面的加载顺序如下

1.自定义模板文件

2.page-{slug}.php // slug为页面别名

3.page-{id}.php // 页面的数据库ID,/wp-admin/post.php?post=15&action=edit

4. page.php

5. singular.php

6. index.php

page怎样使用自定义模板?例如新建一个custom-page.php

<?php
/**
 * Template Name: Custom My Page
 * description: this is custom my page
 *  */
get_header(); ?>

这里模板名称是写在注释里面,保存后,在 WordPress 后台 → 新建或编辑一个页面 → 右侧“模板”下拉框(Gutenberg 编辑器在“页面属性”里)会出现:Custom My Page 选项.

自定义模板的特点:

  • 不依赖文件名,多个页面都能用这个模板。
  • 一个模板可以被不同页面重复使用。
  • 模板文件可以随意命名(但必须带注释)。

Post(文章)


1.single-{post-type}.php
2.single.php
3.singular.php
4.index.php

自定义类型

什么是自定义类型?在functions.php中添加如下代码:

// 自定义文章类型 -> 博客
// 后台管理界面会出现 "博客"
function register_blog_post_type() {
    register_post_type('blog', [
        'label'         => 'Blog',             // 后台显示名称
        'public'        => true,               // 前后台都可见
        'has_archive'   => true,               // 启用归档页
        'rewrite'       => [
            'slug'       => 'blog',            // 自定义 URL 别名
            'with_front' => false              // 是否带上前缀
        ],
        'supports'      => [
            'title',                            // 标题
            'editor',                           // 内容编辑器
            'thumbnail',                        // 特色图片
            'excerpt'                           // 摘要
        ],
        'show_in_rest'  => true                 // 启用 Gutenberg 编辑器
    ]);
}
add_action('init', 'register_blog_post_type');

在wp后台就会出现一个Blog的菜单.此时blog对应的模板文件加载顺序为

1.archive-{slug}.php

2. archive.php

3. index.php

文章详情的模板为

1.single-{slug}.php

2. single.php

3. index.php.

Archive 归档页

分类(Category)的就是在后台->文章->分类目录里面的分类,其加载优先级如下:

1. category-{slug}.php

2. category-{id}.php

3. category.php

4. archive.php

5. index.php

自定义分类法(Taxonomy)

1.taxonomy-{taxonomy}-{term}.php

2.taxonomy-{taxonomy}.php

3.taxonomy.php

4.archive.php

5.index.php

首先弄清楚什么是自定义分类法?

自定义分类法是 WordPress 给你的一种扩展内容组织的方式,让你可以按自己的业务逻辑创建新的“分类体系”,而不仅限于默认的分类和标签。比如,有一个 电影 的文章类型,需要按 类型(喜剧 / 动作 / 恐怖)和 导演 进行分类,在这些情况下,默认的 category / tag 不够直观,你就可以创建自定义 taxonomy,比如:

// 注册自定义文章类型:电影
function register_movie_post_type() {
    register_post_type('movie', [
        'label'         => '电影',
        'public'        => true,
        'has_archive'   => true,
        'rewrite'       => [
            'slug' => 'movies'
        ],
        'supports'      => [
            'title',
            'editor',
            'thumbnail',
            'excerpt',
            'comments'
        ],
        'show_in_rest'  => true // 支持古腾堡编辑器
    ]);
}
add_action('init', 'register_movie_post_type');


// 注册自定义分类法:电影类型
function register_movie_genre_taxonomy() {
    register_taxonomy('genre', ['movie'], [
        'label'         => '类型',
        'hierarchical'  => true, // 像分类一样有层级
        'rewrite'       => [
            'slug' => 'genre'
        ],
        'show_in_rest'  => true
    ]);
}
add_action('init', 'register_movie_genre_taxonomy');


// 注册自定义分类法:导演
function register_movie_director_taxonomy() {
    register_taxonomy('director', ['movie'], [
        'label'         => '导演',
        'hierarchical'  => false, // 像标签一样无层级
        'rewrite'       => [
            'slug' => 'director'
        ],
        'show_in_rest'  => true
    ]);
}
add_action('init', 'register_movie_director_taxonomy');

如果访问/genre/xx/就会加载taxonomy-genre.php,同理访问/director/xx,就会加载taxonomy-director.php模板.

标签(Tag)

tag-{slug}.php

tag.php

archive.php

index.php

搜索结果:

1.search.php

2.index.php

404 错误页面

1.404.php

2. index.php

熟悉了模板文件的加载顺序,在开发网站的时候可以更清楚的规划目录结构.

5 Comments

  1. 三网 8 月 15, 2025

    学习了,特别适合新手

    1. 南昌-外贸 8 月 15, 2025

      区块主题跟这种php代码的有什么区别?

  2. hyuu@126.com 8 月 15, 2025

    刚试了一下,好像分类的有问题

回复 南昌-外贸 取消回复