在我的子主题archive.php中,我具有以下代码来显示存档页面的标题:

    <?php
        the_archive_title( '<h1 class="page-title">', '</h1>' );
    ?>


但是将我的标题显示为“类别:类别标题”我的第一个直觉是从get_the_archive_title()覆盖wp-includes/general-template。但是从我阅读的内容来看,即使使用子主题的替代,显然也不应该更改wordpress的核心内容。

那么,控制的输出的最佳做法是什么? the_archive_title()

评论

将您的解决方案作为单独的答案发布。如果愿意,您也可以不接受我的并接受自己的:-)

糟糕,我以为我删除了此修改。您的方法最终变得更好,所以我打算删除我的方法。我现在就做。

#1 楼

如果查看get_the_archive_title()的源代码,将会看到提供了一个名为get_the_archive_title的过滤器,您可以通过该过滤器过滤该函数的输出。

您可以使用以下代码来更改在类别页面上输出

add_filter( 'get_the_archive_title', function ( $title ) {

    if( is_category() ) {

        $title = single_cat_title( '', false );

    }

    return $title;

});


评论


这在标题为“存档:书籍”(其中“书籍”是自定义帖子类型)的存档页面上不起作用。如果类型是类别或标签,则single_cat_title()函数仅返回页面标题。您可以修改答案以包括适用于所有内容类型的解决方案吗?

– Quinn Comendant
2015年9月25日在19:58



@QuinnComendant查看源代码,第1239和1240行:-)。如果您有问题,只需问一个特定于您问题的新问题

–Pieter Goosen
2015年9月25日20:03在

正确,您必须为他们想要不同标题的每种分类法或帖子类型返回一个替代标题。我发布了一个答案,该答案排除了所有类型的前缀。

– Quinn Comendant
15年9月27日在18:52

#2 楼

接受的答案可以从类别存档标题中删除Category:前缀,但不能从其他分类法或帖子类型中删除。要排除其他前缀,有两个选项:



为原始get_the_archive_title()函数中使用的所有变体重建标题:

// Return an alternate title, without prefix, for every type used in the get_the_archive_title().
add_filter('get_the_archive_title', function ($title) {
    if ( is_category() ) {
        $title = single_cat_title( '', false );
    } elseif ( is_tag() ) {
        $title = single_tag_title( '', false );
    } elseif ( is_author() ) {
        $title = '<span class="vcard">' . get_the_author() . '</span>';
    } elseif ( is_year() ) {
        $title = get_the_date( _x( 'Y', 'yearly archives date format' ) );
    } elseif ( is_month() ) {
        $title = get_the_date( _x( 'F Y', 'monthly archives date format' ) );
    } elseif ( is_day() ) {
        $title = get_the_date( _x( 'F j, Y', 'daily archives date format' ) );
    } elseif ( is_tax( 'post_format' ) ) {
        if ( is_tax( 'post_format', 'post-format-aside' ) ) {
            $title = _x( 'Asides', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) {
            $title = _x( 'Galleries', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-image' ) ) {
            $title = _x( 'Images', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-video' ) ) {
            $title = _x( 'Videos', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) {
            $title = _x( 'Quotes', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-link' ) ) {
            $title = _x( 'Links', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-status' ) ) {
            $title = _x( 'Statuses', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) {
            $title = _x( 'Audio', 'post format archive title' );
        } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) {
            $title = _x( 'Chats', 'post format archive title' );
        }
    } elseif ( is_post_type_archive() ) {
        $title = post_type_archive_title( '', false );
    } elseif ( is_tax() ) {
        $title = single_term_title( '', false );
    } else {
        $title = __( 'Archives' );
    }
    return $title;
});



或者,简单地剥离任何看起来像标题前缀的内容(这可能会更改包含单词后跟冒号的实际标题): />


评论


对于包含空格(如链接类型:tv)的标题,正则表达式必须为/ ^(\ w | \ s)+:/

– aitor
20-4-19在8:18



#3 楼

另一个选择是:

<?php echo str_replace('Brand: ','',get_the_archive_title()); ?>


替换品牌:使用您想要删除的任何文本。

值得研究get_the_archive_title()和the_archive_title()之间的区别
the_archive_title()返回一个数组
get_the_archive_title()返回一个字符串

评论


the_archive_title()回显标题,而get_the_archive_title()不回显,因此它们基本相同。如果需要更改内容,则可以使用get。

– Robert Went
18年8月19日在22:32

#4 楼

您可以使用

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';


评论


这在标题为“存档:书籍”(其中“书籍”是自定义帖子类型)的存档页面上不起作用。

–那个巴西佬
17年4月26日在15:36

@ThatBrazilianGuy single_cat_title在内部使用single_term_title,它也适用于分类法。确保您的主题没有定义以下模板之一:taxonomy-book.php或taxonomy.php,因为它们优先于archive.php。另外,请考虑测试其他答案中的任何一种方法。这个答案已经很老了,在我发布它的时候还算不错,但是我不再为WordPress开发。

– tao
17-4-26在20:55



#5 楼

Ben Gillbanks有一个很好的解决方案,可以处理所有帖子类型和分类法:

function hap_hide_the_archive_title( $title ) {
// Skip if the site isn't LTR, this is visual, not functional.
// Should try to work out an elegant solution that works for both directions.
if ( is_rtl() ) {
    return $title;
}
// Split the title into parts so we can wrap them with spans.
$title_parts = explode( ': ', $title, 2 );
// Glue it back together again.
if ( ! empty( $title_parts[1] ) ) {
    $title = wp_kses(
        $title_parts[1],
        array(
            'span' => array(
                'class' => array(),
            ),
        )
    );
    $title = '<span class="screen-reader-text">' . esc_html( $title_parts[0] ) . ': </span>' . $title;
}
return $title;
}
add_filter( 'get_the_archive_title', 'hap_hide_the_archive_title' );


#6 楼

您可以使用post_type_archive_title()来获取没有“ Archives:”文本的存档标题。