很多人不敢碰主题开发,是因为觉得“主题好复杂”——几十个文件、一堆函数,不知道从哪下手。
但如果我问你:一个能用的 WordPress 主题,最少要几个文件?
答案是 两个。
不是二十个,是两个。剩下那几十个文件,都是“按需加”的——需要什么功能,才加什么文件。
WordPress 认一个主题,只看两个东西:
有这两个,主题就能被后台识别、能激活、能显示文章列表。
新建一个文件夹,比如叫 my-first-theme,里面放两个文件。
/*
Theme Name: 我的第一个主题
Author: 你的名字
Version: 1.0
Description: 一个用来学习的最小主题
*/
就这一段注释。注意 Theme Name 是必填的,没有它 WordPress 根本不认这个主题。其他字段可以省,但填全更好(第六篇专门讲这段注释的每个字段)。
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<title><?php bloginfo( 'name' ); ?></title>
<?php wp_head(); ?>
</head>
<body>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
<?php endwhile; endif; ?>
<?php wp_footer(); ?>
</body>
</html>
这段代码不用逐行背,只要认识三个关键点:
wp_head() 和 wp_footer():这两个是必须的。少了它们,插件全都失效(第七篇细讲)。if ( have_posts() ) : while ( have_posts() ) : the_post();:这就是“主循环”,用来把文章一条条吐出来(卷二细讲)。the_title()、the_permalink()、the_excerpt():模板标签,分别输出标题、链接、摘要。把这两个文件放进 wp-content/themes/my-first-theme/,去后台“外观 → 主题”,你就能看到它,激活,网站能正常显示文章列表。
一个能跑的主题,就这么点东西。
那 caogenbj 为什么有十几个文件?因为它是“按需加”出来的。每加一个文件,是为了解决一个具体问题:
| 加这个文件 | 为了什么 |
|---|---|
| header.php | 把页头抽出来,所有页面共用一份 |
| footer.php | 页脚同理 |
| sidebar.php | 侧栏抽出来 |
| single.php | 文章页要跟首页长得不一样 |
| page.php | 独立页面(“关于”之类)要单独排版 |
| category.php | 分类页要显示分类名、子分类 |
| searchform.php | 搜索框想自己控制样式 |
| functions.php | 要注册菜单、注册侧栏、加一些小功能 |
你发现没有——每一个文件都是因为“有需求”才加的,不是“标准主题必须有”。
所以正确的学法是:先跑起来(两个文件),再按需加(一个需求加一个文件)。别一上来就想着写一个“完整的主题”,那样只会把自己吓住。
把 caogenbj 的文件摊开看,其实一眼就能对上号:
| 文件 | 管哪个页面 |
|---|---|
| index.php | 首页 + 所有兜底页面 |
| single.php | 文章页 |
| page.php | 独立页面 |
| category.php | 分类页 |
| category-liupangketang.php | “刘胖课堂”这个分类的专用模板 |
| searchform.php | 搜索输入框 |
| sidebar.php | 侧栏 |
| header.php | 页头(全站共用) |
| footer.php | 页脚(全站共用) |
| functions.php | 功能层(不是模板) |
| head-seo.php | 我自己加的,管 head 里的 SEO 标签 |
十一个文件,每一个都能用一句话说清“它为什么存在”。如果你读一个主题,读不出这句话,说明你还没读懂它。
一句话记住:两个文件就能跑(style.css + index.php),剩下的文件都是按需加的。
先跑起来,再完善。这个顺序很重要——它决定了你是“越学越有信心”,还是“越学越怕”。
下一篇讲一个特别容易误解的机制:get_header() 到底干了什么。它不是函数调用,是“搬文件”。