下面我将从简单到复杂,为你详细介绍几种实现方法。

wordpress 分类不同模板
(图片来源网络,侵删)

使用 category-{slug}.php 模板文件(最推荐、最标准)

这是 WordPress 内置的、最官方、最简洁的方法,WordPress 会根据分类的 Slug(别名) 自动寻找并加载对应的模板文件。

工作原理

WordPress 在加载分类页面时,会按照以下优先级顺序查找模板文件:

  1. category-{slug}.php (category-news.php)
  2. category-{id}.php (category-7.php)
  3. category.php
  4. archive.php
  5. index.php

实施步骤

第1步:确定分类的 Slug

  1. 登录你的 WordPress 后台。
  2. 进入「文章」->「分类目录」。
  3. 找到你想要应用不同模板的分类,点击「编辑」。
  4. 在「分类目录别名」(Slug) 字段中,你会看到一个 URL 友好的名称,如果你的分类是“产品教程”,其 Slug 可能是 product-tutorial请记住这个 Slug

第2步:创建新的模板文件

wordpress 分类不同模板
(图片来源网络,侵删)

在你的主题文件夹(wp-content/themes/your-theme/)中,复制一份现有的 category.php 文件,并将其重命名为 category-{你的slug}.php

  • 示例:
    • 如果你的分类 Slug 是 news,你就创建一个名为 category-news.php 的文件。
    • 如果你的分类 Slug 是 products,你就创建一个名为 category-products.php 的文件。

第3步:编辑新模板文件

你可以自由地编辑 category-news.php 这个文件,你可以修改 HTML 结构、CSS 类、循环(The Loop)的查询参数,或者引入完全不同的组件。

一个简单的 category-news.php 示例:

wordpress 分类不同模板
(图片来源网络,侵删)
<?php
/**
 * Template for displaying all posts in a category called "News"
 *
 * @link https://developer.wordpress.org/themes/basics/template-hierarchy/
 *
 * @package YourThemeName
 */
get_header(); ?>
<div id="primary" class="content-area">
    <main id="main" class="site-main">
    <?php if ( have_posts() ) : ?>
        <header class="page-header">
            <?php
            the_archive_title( '<h1 class="page-title">', '</h1>' );
            the_archive_description( '<div class="archive-description">', '</div>' );
            ?>
        </header><!-- .page-header -->
        <?php
        // Start the Loop.
        while ( have_posts() ) :
            the_post();
            /*
             * Include the Post-Type-specific template for the content.
             * If you want to override this in a child theme, then include a file
             * called content-___.php (where ___ is the Post Type name) and that will be used instead.
             */
            get_template_part( 'template-parts/content', get_post_type() );
        endwhile;
        // Previous/next page navigation.
        the_posts_pagination(
            array(
                'prev_text' => '<span class="nav-prev">' . __( 'Previous page', 'your-theme-textdomain' ) . '</span>',
                'next_text' => '<span class="nav-next">' . __( 'Next page', 'Next page', 'your-theme-textdomain' ) . '</span>',
            )
        );
    else :
        get_template_part( 'template-parts/content', 'none' );
    endif;
    ?>
    </main><!-- #main -->
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();

你可以在这个文件里做任何你想做的改变,比如改变布局、添加侧边栏、或者只显示某种格式的文章等。


使用 category-{id}.php 模板文件

这种方法与方法一类似,但它使用的是分类的 ID 而不是 Slug。

实施步骤

  1. 找到分类的 ID:在「文章」->「分类目录」中,将鼠标悬停在某个分类上,浏览器状态栏会显示其链接,如 ...wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=7&post_type=post,这里的 7 就是该分类的 ID。
  2. 创建模板文件:在你的主题文件夹中,创建一个名为 category-7.php 的文件(将 7 替换为你的分类 ID)。
  3. 编辑文件:和方法一一样,编辑这个新文件来实现自定义布局。

注意category-{slug}.php 的优先级高于 category-{id}.php,所以如果一个分类同时有 category-news.phpcategory-7.php,WordPress 会加载 category-news.php


使用插件(适合初学者或非开发者)

如果你不想修改代码,或者你的主题结构比较复杂,使用插件是最简单的方法。

推荐插件:Category Page Templates

这个插件允许你像创建页面模板一样,为分类创建模板。

  1. 安装并激活插件:在 WordPress 后台搜索 "Category Page Templates" 并安装激活。
  2. 创建模板文件
    • 在你的主题文件夹中创建一个 PHP 文件,my-category-template.php
    • 在文件开头添加一个注释,告诉插件这是一个模板:
      <?php
      /*
      Template Name: My Custom Category Template
      */
      ?>
    • 在这个文件中,编写你的自定义模板代码(可以复制 archive.phpcategory.php 的内容进行修改)。
  3. 为分类分配模板
    • 进入「文章」->「分类目录」,编辑你想要应用模板的分类。
    • 在右侧的「分类页面模板」下拉菜单中,选择你刚刚创建的 "My Custom Category Template"。
    • 点击「更新」。

优点:非常直观,无需记住复杂的命名规则,后台操作即可完成。 缺点:增加了一个插件,可能会对网站有轻微的性能影响。


使用 is_category() 条件标签(在现有模板中判断)

如果你不想创建多个文件,只是想在同一个 category.php 文件中根据不同分类显示不同内容,可以使用 is_category() 条件标签。

实施步骤

  1. 打开你主题的 category.php 文件。
  2. 在 The Loop 循环之前或内部,使用 is_category() 函数进行判断。

示例代码:

<?php get_header(); ?>
<div id="primary" class="content-area">
    <main id="main" class="site-main">
    <?php if ( have_posts() ) : ?>
        <?php
        // 判断是否是 "news" 分类
        if ( is_category('news') ) {
            // 如果是,显示 "新闻" 分类特有的标题
            echo '<h1>最新资讯</h1>';
            echo '<p>这里是我们的新闻动态...</p>';
        } 
        // 判断是否是 "products" 分类
        elseif ( is_category('products') ) {
            // 如果是,显示 "产品" 分类特有的布局
            echo '<h1>我们的产品</h1>';
            // 可以在这里加载一个完全不同的布局文件
            get_template_part('template-parts/category-layout-products');
        }
        // 其他所有分类
        else {
            // 显示默认的标题
            the_archive_title( '<h1 class="page-title">', '</h1>' );
        }
        ?>
        <?php
        // 开始正常的文章循环
        while ( have_posts() ) : the_post();
            get_template_part( 'template-parts/content', get_post_format() );
        endwhile;
        the_posts_pagination();
        ?>
    <?php else : ?>
        // ... 没有找到文章时的显示
    <?php endif; ?>
    </main>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

优点:文件数量少,逻辑集中。 缺点:当分类和样式变多时,category.php 文件会变得臃肿且难以维护。


总结与最佳实践

方法 优点 缺点 适用场景
category-{slug}.php 官方标准、性能最佳、代码清晰、易于维护 需要修改文件、重命名 强烈推荐,绝大多数情况下的首选方法。
category-{id}.php 官方支持、直观 优先级低于 Slug、ID 改变后失效 当 Slug 不确定或包含特殊字符时作为备选。
插件 无需代码、后台操作简单 增加插件依赖、可能有轻微性能开销 适合不熟悉代码的初学者或快速实现。
is_category() 文件少、逻辑集中 代码臃肿、维护困难 只需对少数几个分类做微小调整时。

最佳实践建议:

  1. 优先使用 category-{slug}.php,这是最干净、最 WordPress 的方式。
  2. 在编辑模板文件前,先备份你的主题,特别是 functions.php 和主要的模板文件。
  3. 保持模板文件的命名规范和结构清晰,方便自己和他人日后维护。
  4. 如果你的主题是商业主题或你计划长期使用,避免使用插件来实现核心功能,以免主题更新或插件失效导致问题。