打开一个主题目录,先看有没有 templates/ 文件夹,里面是不是 .html 文件。
templates/index.html → 区块主题(FSE)index.php、single.php 这些 → 经典主题我自己的 caogenbj 属于后者:11 个 PHP 文件,一个 .html 模板都没有。
这两类主题的差别,不是”新写法旧写法”的区别,而是整个页面的组装方式换了。
我现在的首页(简化过):
<?php get_header(); ?>
<div class="container">
<div class="jumbotron">
<h1>...</h1>
<p>...</p>
</div>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php endwhile; endif; ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
页面的骨架是 HTML 标签,动态部分是 PHP 函数。 想改结构,改 PHP 文件。
同样一个首页,在区块主题里长这样(templates/index.html):
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group">
<!-- wp:query {"query":{"perPage":10,"postType":"post"}} -->
<div class="wp-block-query">
<!-- wp:post-template -->
<!-- wp:post-title /-->
<!-- /wp:post-template -->
</div>
<!-- /wp:query -->
</div>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer"} /-->
看着像 HTML,其实是“注释包裹的块声明”。WordPress 读这些注释,才知道这里放什么。
所以两个关键区别:
| 经典主题 | 区块主题 | |
|---|---|---|
| 页面结构 | PHP 文件 | templates/*.html |
| 循环写法 | while ( have_posts() ) |
<!-- wp:query --> |
| 改样式的方式 | CSS 文件 | 后台”站点编辑器”可视化调 |
| 页头页脚 | header.php |
parts/header.html |
最本质的区别在最后一行:区块主题的页面结构,用户可以自己在后台改。 不用碰代码。
区块主题必须有一个 theme.json,它是”设计系统的配置文件”:
{
"version": 3,
"settings": {
"color": {
"palette": [
{ "slug": "primary", "color": "#2b6cb0", "name": "主色" }
]
},
"typography": {
"fontSizes": [
{ "slug": "small", "size": "14px", "name": "小" },
{ "slug": "normal", "size": "16px", "name": "正文" },
{ "slug": "large", "size": "22px", "name": "大" }
]
},
"layout": { "contentSize": "760px" }
}
}
三个作用:
--wp--preset--color--primary 这样的变量,你的 CSS 直接用;contentSize 就是正文最大宽度,不用再在 CSS 里写 max-width。对主题作者来说,theme.json 最大的价值是约束:它让”用户能改的东西”和”不能改的东西”有了明确边界。
my-theme/
├── style.css ← 必须有(身份证)
├── theme.json ← 设计系统
├── templates/ ← 页面级模板
│ ├── index.html
│ ├── single.html
│ ├── page.html
│ └── archive.html
├── parts/ ← 可复用的区块片段
│ ├── header.html
│ └── footer.html
└── patterns/ ← 预设的区块组合(用户可插入)
templates/ 对应经典主题的 single.php、page.php;parts/ 对应 header.php、footer.php;patterns/ 是新增的东西,经典主题里没有对应物。
模板层级的规则还是一样的:WordPress 先找 single-{post_type}.html,再找 single.html,再找 index.html。卷一讲的那套层级逻辑,在这里依然成立,只是后缀从 .php 变成了 .html。
这是很多人不知道的:一个主题可以同时有 index.php 和 templates/index.html。
WordPress 的规则是:如果 templates/ 里有对应模板,就用块模板;没有,就退回 PHP 模板。
所以你可以:
single.php(因为有复杂的自定义逻辑);templates/front-page.html(让用户在后台调);对老站来说,这是最现实的迁移路径——不是一次性全换,而是一页一页换。
说结论:我这个站短期内不会转区块主题。 三个理由:
一、我的页面结构是”算出来的”,不是”排出来的”。
比如分类页的标题要拼上分类名,文章页的相关文章要按标签查。这些逻辑区块系统表达起来很别扭——要么写自定义块,要么还是得回到 PHP。
二、转过去之后,我原来那套 SEO 代码要重写。
我现在的 head-seo.php 是挂在 wp_head 上手动输出的。区块主题有自己的 head 生成机制,硬塞进去容易冲突。
三、收益不明显。
区块主题最大的好处是”用户能在后台改页面”。我这个站只有我一个人维护,这个好处对我等于零。
反过来说,三种情况值得:
一句话:页面结构要”算”的,用经典主题;页面结构要”排”的,用区块主题。
一句话记住:区块主题把”页面结构”从 PHP 搬到了 HTML 注释里,代价是复杂逻辑更难写,收益是用户能可视化编辑。老站不急,新站可以考虑。
下一篇聊安全:三个最常见的漏洞,以及主题作者该在哪一层拦。