WordPress 模板层级:为什么改了首页文件没反应

· wordpress · 阅读 13
摘要

改主题最常撞的墙:明明改了 front-page.php,打开首页没变化。 不是缓存。是 WordPress 根本没走这个文件。 模板层级是一串候选,从具体到笼统 访问一个地址时,WordPress 不是找「这个页面对应的文件」,而是拿一串

改主题最常撞的墙:明明改了 front-page.php,打开首页没变化。

不是缓存。是 WordPress 根本没走这个文件。

模板层级是一串候选,从具体到笼统

访问一个地址时,WordPress 不是找「这个页面对应的文件」,而是拿一串候选文件去比对,谁先存在就用谁。

首页那串最典型:

  1. front-page.php
  2. home.php(如果后台设置了静态首页)
  3. page.php(静态页面)
  4. index.php

顺序是从上往下。第一个存在的文件被选中,后面的不再看。

所以如果你主题里已经有 home.php,你新建的 front-page.php 会排在它前面。这次能生效了。但如果反过来,你先有 front-page.php,后来往里面加东西没反应,八成是被更靠前的某个文件截走了。

静态首页那两种情况最容易混

后台「设置 → 阅读」里,首页可以设成「最新文章」或者「一个静态页面」。

设成最新文章时,首页走的是 home.php,没有就退到 index.php。这时候 front-page.php 也会被优先考虑——它优先级最高,能盖住 home.php。

设成静态页面时,首页先找 front-page.php,没有就找 page-{slug}.php,再找 page-{id}.php,再找 page.php,最后 index.php。

我遇到过一次:客户把首页设成了静态页面,slug 是 home,我建了一个 page-home.php 去改样式,改完没生效。查了半天,因为主题里有个 front-page.php,它排在 page-home.php 前面。

删掉 front-page.php,立刻变了。

怎么快速确认当前走的是哪个文件

不想装调试插件的话,最土的办法:在每个模板文件第一行加一句注释,页面源码里搜一下。

<!-- template: single.php -->

打开页面,右键看源码,Ctrl+F 搜 template:。一眼就知道。

这办法零成本,缺点是加完得记得删。我有一次忘了删,上线后被客户问「页面上那个 template 是什么」。

正式点的做法是看 body_class() 输出的类名。WordPress 会自动往 body 上加一堆语义类:

<body class="home blog logged-in ...">

单篇页面会带 single single-post postid-123,分类页带 archive category。这些类本质上是模板层级的语义化版本,看它们就能反推走的是哪串。

分类页和标签页的命名规则

这几个容易记混:

  • category-{slug}.php —— 指定别名的分类
  • category-{id}.php —— 指定 ID 的分类
  • category.php —— 所有分类
  • archive.php —— 所有归档(含分类、标签、日期、作者)
  • index.php —— 兜底

标签页是 tag-{slug}.php 和 tag.php。自定义分类法换成 taxonomy-{taxonomy}.php 和 taxonomy-{taxonomy}-{term}.php。

注意 archive.php 只有一个,分类和标签共用。想分开写样式就得用更具体的 category.php 和 tag.php。

自定义文章类型的坑

注册了 book 这个 post type 之后,模板文件应该叫 single-book.php 和 archive-book.php。

这里有个顺序细节:archive-book.php 找不到时,会退到 archive.php;但如果 post_type 注册时 has_archive 设成了 false,归档页压根不存在,那串候选也不会走。

我有一次去改 archive-book.php,怎么改都没反应,最后发现注册参数里 has_archive => false。文件本身没有问题。

一句话总结这套机制

模板层级不是「配置」,是「候选队列」。你新建一个文件,等于往队列前面插了一个更具体的选项。没生效,只可能是队列里已经有比你更靠前的文件。

所以下次改文件没反应,先别清缓存。先查这个位置上都有哪些文件。