什么是分类模板?

分类模板是 WordPress 主题中一个特殊的 PHP 文件,当用户访问某个分类法(最常见的是“分类”)的归档页面时,WordPress 会自动加载这个文件来显示该分类下的所有文章。

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

它就是某个分类的专属“首页”,你可以为不同的分类设置完全不同的布局和样式。


WordPress 模板加载机制(优先级)

要理解如何创建和使用分类模板,首先要明白 WordPress 的模板加载优先级,当访问一个分类页面时(https://example.com/category/news/),WordPress 会按以下顺序寻找并加载第一个存在的文件:

  1. category-{slug}.php - 最高优先级

    • 这是最灵活、最推荐的方式。
    • {slug} 是分类的“别名”(slug),你的分类别名是 news,WordPress 就会寻找 category-news.php 文件。
    • 如果你的分类别名是 tech-tips,WordPress 就会寻找 category-tech-tips.php
  2. category-{id}.php

    wordpress 分类模板
    (图片来源网络,侵删)
    • 这种方式基于分类的 ID。
    • 你的分类 ID 是 5,WordPress 就会寻找 category-5.php 文件。
    • 适用于别名可能改变,但 ID 是固定的情况。
  3. category.php

    • 这是一个通用的分类模板。
    • 如果上面两种特定命名的文件都不存在,WordPress 就会加载这个文件。
    • 所有分类页面都会使用这个模板,除非有更具体的模板覆盖它。
  4. archive.php

    • 这是一个更通用的归档模板。
    • category.php 也不存在,WordPress 就会加载 archive.php,它用于显示所有类型的归档页面,包括分类、标签、作者、日期等。
  5. index.php

    • 这是最后的后备模板,也是 WordPress 主题的默认主页模板。
    • 如果以上所有文件都不存在,WordPress 最终会加载 index.php

创建模板时,优先级从高到低,要为特定分类定制,就创建 category-{slug}.php;要为所有分类定制,就创建 category.php

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

如何创建一个分类模板

假设我们要为“新闻”这个分类(别名为 news)创建一个特殊的模板。

步骤 1:创建模板文件

在你的主题根目录下(wp-content/themes/your-theme/),创建一个新的 PHP 文件,命名为 category-news.php

步骤 2:添加模板头部注释

这是 WordPress 识别模板文件的关键,在文件的最顶部,添加以下注释:

<?php
/**
 * Template for displaying all posts in a category: News
 *
 * @package YourThemeName
 */
  • Template Name (可选): 如果你希望这个模板能在“外观 > 主题编辑器”中被选择和预览,可以加上这个,但对于分类模板,通常不需要,因为它是自动加载的。
  • @package: 填写你的主题名称,这是一个好习惯。

步骤 3:构建模板的基本结构

一个标准的 WordPress 模板文件通常包含以下几个部分:

  1. 调用 header.php: 加载网站头部。
  2. 主循环: 显示该分类下的文章。
  3. 调用 sidebar.php: 加载侧边栏(可选)。
  4. 调用 footer.php: 加载网站底部。

下面是一个完整的 category-news.php 示例:

<?php
/**
 * Template for displaying all posts in a category: News
 *
 * @package YourThemeName
 */
// 1. 调用头部模板
get_header(); ?>
    <div id="primary" class="content-area">
        <main id="main" class="site-main">
        <?php
        // 2. 开始 WordPress 主循环
        if ( have_posts() ) :
            // 如果是一个分类页面,显示分类标题和描述
            the_archive_title( '<h1 class="page-title">', '</h1>' );
            the_archive_description( '<div class="archive-description">', '</div>' );
            // 开始文章列表
            while ( have_posts() ) :
                the_post();
                // 加载内容模板,content.php 或 content-news.php
                get_template_part( 'template-parts/content', get_post_format() );
            endwhile;
            // 文章分页导航
            the_posts_pagination(
                array(
                    'prev_text' => __( 'Previous page', 'your-theme-textdomain' ),
                    'next_text' => __( 'Next page', 'your-theme-textdomain' ),
                )
            );
        else :
            // 如果没有文章,加载 no-content 模板
            get_template_part( 'template-parts/content', 'none' );
        endif;
        ?>
        </main><!-- #main -->
    </div><!-- #primary -->
<?php
// 3. 调用侧边栏
get_sidebar();
// 4. 调用底部模板
get_footer();

在模板中获取当前分类信息

在分类模板中,你经常需要获取当前分类的信息来进行个性化展示,可以使用以下全局函数:

  • get_queried_object(): 获取当前查询的对象,对于分类页面,这个对象就是 WP_Term 对象,包含了该分类的所有信息。
  • single_cat_title(): 直接输出当前分类的标题。
  • category_description(): 获取当前分类的描述。

示例:

<?php
// 获取当前分类对象
$current_category = get_queried_object();
// 输出分类标题
echo '<h1>' . esc_html( $current_category->name ) . '</h1>';
// 输出分类描述
echo '<p>' . esc_html( $current_category->description ) . '</p>';
// 输出分类链接
echo '<a href="' . esc_url( get_category_link( $current_category->term_id ) ) . '">查看所有 "' . esc_html( $current_category->name ) . '" 文章</a>';
?>

高级技巧:为不同分类使用完全不同的布局

这是分类模板最强大的功能。“新闻”分类是三栏布局,而“产品”分类是单栏大图布局。

  1. 为“新闻”分类创建 category-news.php:

    <?php get_header(); ?>
    <div class="news-layout three-columns">
        <main>文章列表...</main>
        <aside>侧边栏...</aside>
    </div>
    <?php get_footer(); ?>
  2. 为“产品”分类创建 category-products.php:

    <?php get_header(); ?>
    <div class="product-layout single-column">
        <main>产品列表...</main>
    </div>
    <?php get_footer(); ?>
  3. 为所有其他分类创建通用的 category.php:

    <?php get_header(); ?>
    <div class="default-layout two-columns">
        <main>默认文章列表...</main>
        <aside>默认侧边栏...</aside>
    </div>
    <?php get_footer(); ?>

这样,当用户访问不同分类时,WordPress 会自动加载对应的模板文件,实现完全不同的页面布局和设计。


最佳实践

  1. 使用子主题: 对主题文件进行任何修改前,强烈建议使用子主题,这样在主题更新时,你的修改不会被覆盖。
  2. 模块化: 使用 get_template_part() 来加载内容片段(如 content.php),而不是把所有 HTML 都写在主循环里,这样更容易维护和复用。
  3. 保持通用性: 创建一个功能完善的通用 category.php 作为基础,只为那些确实需要特殊布局的分类创建特定的 category-{slug}.php 文件,覆盖通用模板。
  4. 清晰命名: 给你的模板文件和函数起一个清晰、有意义的名字,方便自己和他人理解。
  5. 性能考虑: 分类页面可能会显示大量文章,确保你的分页功能正常工作,并考虑使用插件(如 WP-PageNavi)或优化 the_posts_pagination() 来提升用户体验。

希望这份详细的指南能帮助你完全掌握 WordPress 分类模板!