Include category title in wp_title

All we need is an easy explanation of the problem, so here it is.

I’m using this in functions.php to output my page <title>:

/**
 * Creates a nicely formatted and more specific title element text
 * for output in head of document, based on current view
 *
 * @param string $title Default title text for current view
 * @param string $sep Optional separator
 * @return string Filtered title
 */
function sitename_wp_title( $title, $sep ) {
    global $paged, $page;

    if ( is_feed() )
        return $title;

    // Adds the site name
    $title .= get_bloginfo( 'name' );

    // Adds the site description for the front page
    $site_description = get_bloginfo( 'description', 'display' );
    if ( $site_description && ( is_front_page() ) )
        $title = "$title $sep $site_description";

    // Adds a page number if necessary
    if ( $paged >= 2 || $page >= 2 )
        $title = "$title $sep " . sprintf( __( 'Page %s' ), max( $paged, $page ) );

    return $title;
}
add_filter( 'wp_title', 'sitename_wp_title', 10, 2 );

I’d like to include the top level category name on sub pages.

For example currently with a site structure of this:

  • Home
  • About
  • Work
    • Large
    • Small
  • Contact

Posts in the “Large” category will output a page title like this:

<title>$postname | $blog_name</title>

I’d like the output to be:

<title>$postname | Work | $blog_name</title>

So the top-level category name is added, but not the secondary level category (Large).

How to solve :

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Method 1

Create a helper function to get all parent categories (each post can be in multiple categories):

function parent_cat_names( $sep = '|' )
{
    if ( ! is_single() or array() === $categories = get_the_category() )
        return '';

    $parents = array ();

    foreach ( $categories as $category )
    {
        $parent = end( get_ancestors( $category->term_id, 'category' ) );

        if ( ! empty ( $parent ) )
            $top = get_category( $parent );
        else
            $top = $category;

        $parents[ $top->term_id ] = $top;
    }

    return esc_html( join( $sep, wp_list_pluck( $parents, 'name' ) ) );
}

Add the parent term with …

if ( '' !== $parent_cats = parent_cat_names( $sep ) )
    $title .= "$parent_cats $sep ";

Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply