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

这是 WordPress 内置的、最标准也是最简单的方法,WordPress 有一个非常清晰的模板加载层级,它会根据特定的文件名来加载对应的模板。

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

工作原理

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

  1. category-{slug}.php
  2. category-{id}.php
  3. category.php
  4. archive.php
  5. index.php

这里的 {slug} 是你的分类别名{id} 是你的分类ID

操作步骤

  1. 找到你的分类别名和ID

    • 登录你的 WordPress 后台。
    • 进入「文章」>「分类目录」。
    • 找到你想要应用不同模板的分类,点击编辑。
    • 在浏览器地址栏中,你会看到类似 .../wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=7&post_type=post 的 URL。
      • tag_ID=7 中的 7 就是这个分类的 ID
      • 在「别名」输入框中,你可以看到一个由小写字母、数字和连字符组成的值,这就是 Slug,如果你的分类是“产品”,slug 可能是 products
  2. 创建新的模板文件

    wordpress不同分类不同模板
    (图片来源网络,侵删)
    • 通过 FTP 或你的主机文件管理器,访问你的主题文件夹 wp-content/themes/你的主题名/
    • 复制一个现有的模板文件作为基础,最理想的选择是复制 archive.php,因为这个文件就是用来显示归档页面的。
    • 将复制的文件重命名为 category-你的别名.php
      • 示例:如果你的分类别名为 news,那么文件名就应该是 category-news.php
      • 示例:如果你的分类别名为 products,那么文件名就应该是 category-products.php
  3. 编辑新模板文件

    • 打开你刚刚创建的新模板文件(category-news.php)。
    • 在文件顶部,你可以添加一个注释来标明这个模板的用途,但这不是必须的。
    • 你可以像编辑普通 PHP 文件一样,自由地修改这个模板的 HTML 结构、CSS 类和 PHP 代码,以实现你想要的独特布局。
      • 示例:你可以为“新闻”分类创建一个带有侧边栏的单列布局,而为“产品”分类创建一个无侧边栏的双列网格布局。
  4. 验证效果

    • 保存文件。
    • 访问你的网站,并点击该分类的链接,或者直接访问 你的网站域名/?cat=分类ID你的网站域名/category/分类别名/
    • 你应该能看到你自定义的新模板已经生效了。

优点

  • 简单直观,遵循 WordPress 核心规则。
  • 无需任何代码,只需创建和编辑文件即可。
  • 性能最好,是 WordPress 原生支持的方式。

使用 category.phpis_category() 条件标签 (更灵活)

如果你不想为每个分类都创建一个单独的文件,或者你的分类逻辑更复杂(多个分类共享同一个模板),可以使用这种方法。

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

工作原理

WordPress 有一个主模板文件 category.php,它负责处理所有分类归档页面,我们可以在这个文件中使用 is_category() 条件标签来判断当前正在显示的是哪个分类,然后根据判断结果加载不同的布局或内容。

操作步骤

  1. 打开或创建 category.php 文件

    • 在你的主题文件夹中,找到 category.php 文件,如果不存在,就复制 archive.php 并重命名为 category.php
  2. 使用条件标签进行判断

    • category.php 文件中,使用 is_category() 函数,它可以接受分类 ID、别名或名称作为参数。
    • if 语句中,编写对应分类的专属 HTML 和 PHP 代码。
  3. 添加 else 或其他条件

    • 你可以使用 else 来为不满足条件的分类(即所有其他分类)提供一个默认布局。

示例代码:

<?php
/**
 * Template Name: 分类归档页
 */
get_header(); ?>
<div id="primary" class="content-area">
    <main id="main" class="site-main" role="main">
    <?php
    // 检查是否是 "news" 分类 (通过别名)
    if ( is_category( 'news' ) ) {
        ?>
        <h1 class="page-title">新闻资讯</h1>
        <div class="news-grid">
            <?php if ( have_posts() ) : ?>
                <?php while ( have_posts() ) : the_post(); ?>
                    <article class="news-item">
                        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                        <p><?php echo wp_trim_words( get_the_excerpt(), 20 ); ?></p>
                        <a href="<?php the_permalink(); ?>" class="read-more">阅读更多</a>
                    </article>
                <?php endwhile; ?>
            <?php endif; ?>
        </div>
        <?php
    }
    // 检查是否是 "products" 分类 (通过ID)
    elseif ( is_category( 7 ) ) { // 假设产品分类的ID是7
        ?>
        <h1 class="page-title">我们的产品</h1>
        <div class="product-showcase">
            <?php if ( have_posts() ) : ?>
                <?php while ( have_posts() ) : the_post(); ?>
                    <div class="product-card">
                        <?php if ( has_post_thumbnail() ) : ?>
                            <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail( 'medium' ); ?></a>
                        <?php endif; ?>
                        <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                        <?php the_content(); ?>
                    </div>
                <?php endwhile; ?>
            <?php endif; ?>
        </div>
        <?php
    }
    // 如果以上条件都不满足,则显示默认布局
    else {
        ?>
        <h1 class="page-title"><?php single_cat_title(); ?></h1>
        <?php
        // 显示分类描述
        $category_description = category_description();
        if ( ! empty( $category_description ) ) :
            echo '<div class="taxonomy-description">' . $category_description . '</div>';
        endif;
        if ( have_posts() ) :
            while ( have_posts() ) : the_post();
                // 使用标准的文章循环
                get_template_part( 'template-parts/content', get_post_format() );
            endwhile;
            the_posts_pagination();
        else :
            get_template_part( 'template-parts/content', 'none' );
        endif;
        ?>
        <?php
    }
    ?>
    </main><!-- #main -->
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();

优点

  • 灵活性高,可以在一个文件内处理多种分类逻辑。
  • 适合需要根据分类显示不同内容块(在列表上方添加一个特定的广告位或介绍模块)的场景。

缺点

  • 如果分类很多,category.php 文件会变得非常臃肿和难以维护。

使用插件 (最简单,适合初学者)

如果你不想写代码,或者对文件操作感到不放心,可以使用插件来实现。

推荐插件

  • Category Page Templates: 这个插件允许你为任何分类分配一个页面模板,你可以在后台像编辑页面一样,为每个分类选择一个自定义模板。

操作步骤

  1. 在 WordPress 后台「插件」>「安装插件」,搜索 "Category Page Templates"。
  2. 安装并激活插件。
  3. 进入「文章」>「分类目录」,编辑一个分类。
  4. 在分类编辑页面的下方,你会看到一个「页面模板」的下拉菜单,在这里选择你想要应用的模板(通常是主题中已有的页面模板,或者插件生成的模板)。
  5. 保存即可。

优点

  • 完全可视化操作,无需代码。
  • 安装即用,非常方便。

缺点

  • 增加了一个插件,可能会对网站性能有微弱影响。
  • 功能不如前两种方法强大和灵活。

总结与选择建议

方法 优点 缺点 适用场景
category-{slug}.php 最佳实践、简单、高效、原生支持 需要创建多个文件,每个分类一个文件 强烈推荐,适用于绝大多数需要不同分类布局的情况。
category.php + 条件标签 灵活、可在一个文件内管理复杂逻辑 文件可能臃肿,代码稍复杂 适用于少数几个分类有特殊需求,或需要在一个页面上根据分类动态显示不同内容模块的情况。
使用插件 无需代码,可视化操作,极其简单 增加插件依赖,灵活性受限 适合初学者,或者只是临时需要为某个分类设置不同布局,不想动代码的情况。

对于绝大多数 WordPress 用户和开发者来说,方法一 (category-{slug}.php) 是最理想的选择,它既简单又强大,完全符合 WordPress 的设计哲学,是解决这个问题的标准答案。