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
熟悉了模板文件的加载顺序,在开发网站的时候可以更清楚的规划目录结构.
学习了,特别适合新手
谢谢
区块主题跟这种php代码的有什么区别?
区块可以可视化编辑
刚试了一下,好像分类的有问题