1

I want to display a number of articles in a certain category which is hooked to a menu item. It should look like Bootstrap's "badge" component. Now I've got:

Current - without

and what I want to achieve:

What I want

Do I have to modify WP's code, or is there a plugin for it? I've tried to find one, but none of the ones I saw addresses this specific situation.

It would be best if the counter showed only published articles, but it's a minor thing - it's probably a matter of adding a condition when retrieving the number of articles from the database.

1

I think it would be useful to create a custom walker for your menu. In the following code example I made use of the Menu Item Object. You can take a look at the object output here.

An object type is specified for every menu item. So I just compare if the object is a category. If yes I made use of the specified object ID to get the category + category count. Last but not least I just wrap the category count with a span at the end of the link. I hope it works for you.

Here the code example:

class Menu_Category_Count extends Walker_Nav_Menu {

    var $number = 1;

    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
        $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

        $output .= $indent . '<li' . $id . $value . $class_names .'>';

        $atts = array();
        $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
        $atts['target'] = ! empty( $item->target )     ? $item->target     : '';
        $atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
        $atts['href']   = ! empty( $item->url )        ? $item->url        : '';

        $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );

        $attributes = '';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= ' ' . $attr . '="' . $value . '"';
            }
        }

        // Get Category + Category Count
        $category_count = "";
        if ($item->object == "category") {
            $category = get_category($item->object_id);
            $category_count = $category->category_count;
        }

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= ($item->object == "category") ? '<span class="count">'.$category_count.'</span>': '';
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }

}

Than just call the custom nav walker where you get your nav menu like this:

wp_nav_menu(
    array(
        ....,
        "walker"            => new Menu_Category_Count(),
    )
);

If you never dealed with a custom nav walker take a look at this tutorial at tutsplus

2
  • Cool, thanks! I only had to change $category['category_count'] to $category->category_count. I also had to change ($item_object = "category") to ($item->object == "category"). Now I get "Projekty4" which is fine, it's just a matter of styling the number properly with CSS. Thanks a lot!
    – PiotrK
    Dec 20 '14 at 18:01
  • Ok sorry for the mistakes, my bad. But glad that I could help you.
    – propz
    Dec 20 '14 at 19:21
0

Hey by using the code snippet you can get the number of article within the category

$postsInCat = get_term_by('name','NAMEOFCATEGORY','category');
$postsInCat = $postsInCat->count;
echo $postsInCat;

I think it help you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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