50

In my child theme's archive.php, I have the following code for displaying the title of my archive pages:

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

But that displays my titles as "Category: Category Title" instead of simply the title without the prepended "Category: ".

My first instinct was to override get_the_archive_title() from wp-includes/general-template. But from what I've read, apparently I'm not supposed to ever alter wordpress core stuff, even with overrides from a child theme.

So what is the best-practice way to control the output of the_archive_title()?

2
  • Post your solution as a separate answer. You can also unaccept mine and accept your own if you wish :-) Jan 27, 2015 at 19:19
  • Oops, I thought I deleted this edit. Your method ended up being better, so I meant to delete mine. I'll do that now.
    – fildred13
    Jan 27, 2015 at 21:27

7 Answers 7

52

If you look at the source code of get_the_archive_title(), you will see that there is a filter supplied, called get_the_archive_title, through which you can filter the output from the function.

You can use the following to change the output on a category page

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

    if( is_category() ) {

        $title = single_cat_title( '', false );

    }

    return $title;

});
3
  • 6
    This doesn't work on an archive page with a title of Archive: Books (where Books is a custom post type). The single_cat_title() function only returns a page title if the type is a category or tag. Can you amend your answer to include a solution that works with all content types? Sep 25, 2015 at 19:58
  • @QuinnComendant Look at the source code, lines 1239 and 1240 :-). If you have an issue, simply ask a new question specific to your question Sep 25, 2015 at 20:03
  • 1
    Right, one must return an alternate title for each taxonomy or post type they want different titles for. I've posted an answer that excludes prefixes from all types. Sep 27, 2015 at 18:52
36

The accepted answer works to remove the Category: prefix from category archive titles, but not other taxonomy or post types. To exclude other prefixes, there are two options:

  1. Rebuild the title for all the variants used in the original get_the_archive_title() function:

    // 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;
    });
    
  2. Or, simply strip anything that looks like a title prefix (which may alter actual titles which contain a word followed by the colon character):

    // Simply remove anything that looks like an archive title prefix ("Archive:", "Foo:", "Bar:").
    add_filter('get_the_archive_title', function ($title) {
        return preg_replace('/^\w+: /', '', $title);
    });
    
1
  • 2
    For titles containing spaces like link type: tv the regex must be /^(\w|\s)+: /
    – aitor
    Apr 19, 2020 at 8:18
8

Another option is:

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

Replace Brand: with whatever text you are wanting to get rid of.

Its worth looking into the difference between get_the_archive_title() and the_archive_title() the_archive_title() returns an array get_the_archive_title() returns a string

1
  • 1
    the_archive_title() echoes the title and get_the_archive_title() does not, so they are basically the same. If you need to alter the content then you would use get. Aug 19, 2018 at 22:32
6

You could use

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';
2
  • This doesn't work on an archive page with a title of Archive: Books (where Books is a custom post type). Apr 26, 2017 at 15:36
  • @ThatBrazilianGuy single_cat_title uses single_term_title internally, which works on taxonomies as well. Make sure your theme doesn't have one of the following templates defined: taxonomy-book.php or taxonomy.php, because they have precendence over archive.php. Also, consider testing any of the methods in the other answers. This answer is quite old, it was working fine at the time I posted it, but I'm not developing for WordPress anymore.
    – tao
    Apr 26, 2017 at 20:55
2

Ben Gillbanks has a nice solution that handles all post types and taxonomies:

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' );
0

You can use post_type_archive_title() to get the title of an archive without the "Archives:" text.

1
  • How do you display the post type archive title if 'get_post_type_archive_title()' doesn't exist?
    – Krys
    Aug 24, 2021 at 9:42
0

Use this instead the_archive_title(). Works with CPTs and custom taxonomies.

<?php
$term = $wp_query->get_queried_object();
$term_title = $term->label //works with CPTs (Books)
?? $term->name //works with custom taxonomy terms (gets Small in size/small)
?? "untitled";
?>
<h1><?php echo $term_title; ?></h1>

Not the answer you're looking for? Browse other questions tagged or ask your own question.