分析 WordPress `get_archive_title()` 函数的源码:不同归档页面的标题是如何生成的。

嘿,各位代码界的艺术家们,今天咱们来聊聊 WordPress 里一个看似不起眼,实则暗藏玄机的函数:get_archive_title()。它就像一位百变魔术师,能根据不同的归档页面,变出各种各样的标题。咱们要做的,就是揭开它的神秘面纱,看看它到底是怎么“变”出来的。

开场白:认识一下主角

首先,让我们和 get_archive_title() 见个面。它位于 WordPress 核心文件中,主要负责根据当前访问的归档页面的类型(比如分类目录、标签、日期等等),生成相应的标题。简单来说,就是告诉你现在正在看什么类型的文章列表。

源码剖析:从入口到核心

我们先来瞅瞅 get_archive_title() 的源码(简化版,去掉了部分过滤器和注释):

function get_archive_title() {
    $title = '';

    if ( is_category() ) {
        $title = sprintf( __( 'Category: %s' ), single_cat_title( '', false ) );
    } elseif ( is_tag() ) {
        $title = sprintf( __( 'Tag: %s' ), single_tag_title( '', false ) );
    } elseif ( is_author() ) {
        $title = sprintf( __( 'Author: %s' ), '<span class="vcard">' . get_the_author() . '</span>' );
    } elseif ( is_year() ) {
        $title = sprintf( __( 'Year: %s' ), get_the_date( _x( 'Y', 'yearly archives date format' ) ) );
    } elseif ( is_month() ) {
        $title = sprintf( __( 'Month: %s' ), get_the_date( _x( 'F Y', 'monthly archives date format' ) ) );
    } elseif ( is_day() ) {
        $title = sprintf( __( 'Day: %s' ), get_the_date( _x( 'F j, Y', 'daily archives date format' ) ) );
    } elseif ( is_post_type_archive() ) {
        $title = sprintf( __( 'Archives: %s' ), post_type_archive_title( '', false ) );
    } elseif ( is_tax() ) {
        $tax = get_taxonomy( get_queried_object()->taxonomy );
        /* translators: 1: Taxonomy singular name, 2: Current taxonomy term label. */
        $title = sprintf( __( '%1$s: %2$s' ), $tax->labels->singular_name, single_term_title( '', false ) );
    } elseif ( is_search() ) {
        $title = sprintf( __( 'Search Results for: %s' ), '<span>' . get_search_query() . '</span>' );
    } elseif ( is_home() ) {
        $title = __( 'Latest Posts' );
    } else {
        $title = __( 'Archives' );
    }

    /**
     * Filters the archive title.
     *
     * @since 4.1.0
     *
     * @param string $title Archive title.
     */
    return apply_filters( 'get_the_archive_title', $title );
}

怎么样?是不是有点眼花缭乱? 别担心,咱们一步一步来。

核心逻辑:条件判断,各个击破

get_archive_title() 的核心逻辑就是一系列的 if...elseif...else 判断。它会根据当前页面是否是分类目录、标签、作者、日期等等,来决定使用哪种方式生成标题。

咱们用一个表格来总结一下:

条件判断 标题生成方式 涉及函数 备注
is_category() Category: [分类目录名称] single_cat_title() 获取当前分类目录的名称。 single_cat_title('', false) 中的 false 参数表示不显示 HTML 标签,只返回名称。
is_tag() Tag: [标签名称] single_tag_title() 获取当前标签的名称。
is_author() Author: [作者名称] get_the_author() 获取当前作者的名称。用 <span> 包裹是为了方便样式控制。
is_year() Year: [年份] get_the_date() 获取当前年份。 _x( 'Y', 'yearly archives date format' ) 定义了年份的日期格式。
is_month() Month: [月份 年份] get_the_date() 获取当前月份和年份。 _x( 'F Y', 'monthly archives date format' ) 定义了月份和年份的日期格式。
is_day() Day: [月份 日, 年份] get_the_date() 获取当前日期。 _x( 'F j, Y', 'daily archives date format' ) 定义了日期的格式。
is_post_type_archive() Archives: [文章类型名称] post_type_archive_title() 获取当前文章类型的名称。例如,如果是自定义文章类型 "book",那么标题可能是 "Archives: Books"。
is_tax() [分类法名称]: [分类法术语名称] get_taxonomy(), single_term_title() 获取自定义分类法的名称和术语名称。例如,如果有一个自定义分类法 "genre",术语是 "fiction",那么标题可能是 "Genre: Fiction"。
is_search() Search Results for: [搜索关键词] get_search_query() 获取用户输入的搜索关键词。
is_home() Latest Posts 如果是首页,则显示 "Latest Posts"。
else Archives 如果以上条件都不满足,则显示 "Archives"。 这种情况通常是未知的归档类型或者错误配置。

重点函数详解:single_cat_title(), get_the_date(), post_type_archive_title()

  • single_cat_title( string $prefix = '', bool $display = true ) : string

    这个函数专门用来获取分类目录的标题。它的第一个参数 $prefix 可以指定一个前缀,比如 "Category: ",但通常我们直接在 sprintf() 中处理。第二个参数 $display 决定是否直接输出标题。 如果设置为 false,则函数返回标题字符串,方便我们进行进一步处理,比如用 sprintf() 格式化。

    // 示例:获取分类目录标题,不显示,而是返回字符串
    $category_title = single_cat_title( '', false );
    echo '当前分类目录:' . $category_title;
  • get_the_date( string $format = '', int|WP_Post $post = 0 ) : string

    这个函数用来获取文章的日期。 它的第一个参数 $format 指定日期的格式。WordPress 提供了一些预定义的日期格式,比如 ‘Y’ (年份), ‘F’ (月份), ‘j’ (日)。 你也可以自定义日期格式,比如 ‘Y-m-d’。

    // 示例:获取当前文章的年份
    $year = get_the_date( 'Y' );
    echo '文章年份:' . $year;
    
    // 示例:自定义日期格式
    $formatted_date = get_the_date( 'Y-m-d H:i:s' );
    echo '格式化后的日期:' . $formatted_date;
  • post_type_archive_title( string $prefix = '', bool $display = true ) : string

    这个函数用来获取文章类型的归档标题。 类似于 single_cat_title(),它的第一个参数 $prefix 可以指定一个前缀,第二个参数 $display 决定是否直接输出标题。

    // 示例:获取文章类型归档标题,不显示,而是返回字符串
    $post_type_title = post_type_archive_title( '', false );
    echo '文章类型归档标题:' . $post_type_title;

自定义:让标题更个性

WordPress 提供了强大的过滤器(filter)机制,允许我们自定义 get_archive_title() 的输出。

  • get_the_archive_title 过滤器

    这是最常用的过滤器,可以修改最终的归档标题。

    add_filter( 'get_the_archive_title', 'my_custom_archive_title' );
    
    function my_custom_archive_title( $title ) {
        if ( is_category() ) {
            $title = '分类:' . single_cat_title( '', false ) . ' (文章列表)';
        } elseif ( is_tag() ) {
            $title = '标签:' . single_tag_title( '', false ) . ' (相关文章)';
        }
        return $title;
    }

    这段代码会将分类目录的标题修改为 "分类:[分类目录名称] (文章列表)",将标签的标题修改为 "标签:[标签名称] (相关文章)"。

  • 其他过滤器

    除了 get_the_archive_title,还有一些其他的过滤器可以用来修改相关的标题。 例如,你可以使用 single_cat_title 过滤器来修改分类目录的标题,或者使用 get_the_date 过滤器来修改日期的格式。

    但是,直接修改这些底层函数可能会影响到其他地方,所以建议优先使用 get_the_archive_title 过滤器。

最佳实践:清晰易懂,方便维护

  • 使用 sprintf() 格式化标题

    sprintf() 可以让我们更灵活地控制标题的格式,并且方便进行本地化(i18n)。

    // 示例:使用 sprintf() 格式化标题
    $title = sprintf( __( 'Category: %s' ), single_cat_title( '', false ) );
  • 合理使用过滤器

    使用过滤器可以让我们在不修改核心代码的情况下,自定义标题的输出。 但是,要注意避免过度使用过滤器,以免影响性能和可维护性。

  • 注意本地化

    在生成标题时,要使用 WordPress 的本地化函数,比如 __()_x(),以便支持多语言。

  • 考虑用户体验

    标题应该清晰易懂,能够准确地描述当前页面的内容。 避免使用过于复杂或晦涩的标题。

实战演练:自定义文章类型归档标题

假设我们有一个自定义文章类型 "book",我们想让它的归档标题显示为 "图书列表"。

add_filter( 'get_the_archive_title', 'my_custom_book_archive_title' );

function my_custom_book_archive_title( $title ) {
    if ( is_post_type_archive( 'book' ) ) {
        $title = __( '图书列表' );
    }
    return $title;
}

这段代码会判断当前页面是否是 "book" 文章类型的归档页面,如果是,则将标题修改为 "图书列表"。

常见问题解答:疑难杂症一网打尽

  • 为什么我的归档标题没有显示?

    • 检查你的主题是否正确调用了 get_archive_title() 函数。
    • 检查你的 WordPress 版本是否支持 get_archive_title() 函数(4.1.0 及以上版本)。
    • 检查你的 is_category(), is_tag() 等条件判断是否正确。
  • 如何修改所有归档页面的标题格式?

    可以使用 get_the_archive_title 过滤器,并根据不同的条件判断来修改标题。

  • 如何修改特定分类目录的标题?

    可以使用 single_cat_title 过滤器,但是要注意只修改特定分类目录的标题,避免影响其他分类目录。

  • _x() 函数是什么?

    _x() 是 WordPress 的本地化函数,用于指定上下文(context),以便翻译人员能够更准确地翻译字符串。它的用法是 _x( $text, $context, $domain ),其中 $text 是要翻译的字符串,$context 是上下文,$domain 是文本域。

总结:掌握魔法,玩转标题

get_archive_title() 函数就像一位默默奉献的幕后英雄,它根据不同的归档页面,生成相应的标题,让用户能够清晰地了解当前页面的内容。 通过深入了解它的源码和使用方法,我们可以掌握这种“变标题”的魔法,让我们的 WordPress 网站更加个性化和用户友好。

希望今天的讲座对大家有所帮助。 如果有什么问题,欢迎随时提问。 祝大家编程愉快!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注