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()?

  • Post your solution as a separate answer. You can also unaccept mine and accept your own if you wish :-) – Pieter Goosen Jan 27 '15 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 '15 at 21:27
up vote 32 down vote accepted

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;

});
  • 4
    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? – Quinn Comendant Sep 25 '15 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 – Pieter Goosen Sep 25 '15 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. – Quinn Comendant Sep 27 '15 at 18:52

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);
    });
    

You could use

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';
  • This doesn't work on an archive page with a title of Archive: Books (where Books is a custom post type). – That Brazilian Guy Apr 26 '17 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. – Andrei Gheorghiu Apr 26 '17 at 20:55

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

  • 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. – Robert Went Aug 19 at 22:32

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

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

protected by Pieter Goosen Feb 11 '16 at 9:41

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

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