3

I am trying to add the parent category class in post_class() of some posts from one of my subcatgories. I have an advanved theme so I need to style all the posts from the parent cateogry using it's class, not the subcategory class (too much hassle in CSS).

2 Answers 2

3

Perhaps something like:

function mytheme_get_post_class_parent_cats() {
    $parent_cat_classes = array();
    // Get parent categories
    $post_cats = wp_get_post_categories();
    // Loop through post categories
    foreach ( $post_cats as $post_cat ) {
        $cat_parents = get_category_parents( $post_cat , false, ',', true );
        // if there are any parent categories
        if ( $cat_parents ) {
            // create an array
            $cat_array = explode( $cat_parents, ',' );
            // First key of the array is the top-level category parent
            $parent_cat_id = $cat_array[0];
            // Get the name of the top-level parent category
            $parent_cat = get_cat_name( $parent_cat_id );
            // create the CSS class .category-parent-{categoryname}
            $parent_cat_classes[] = 'category-parent-' . $parent_cat;
        } else {
            // Otherwise, the category is a top-level cat, so use it
            $cat_name = get_cat_name( $post_cat );
            $parent_cat_classes[] = 'category-parent-' . $cat_name;
        }
    }
    // Return CSS class, or false
    return $parent_cat_classes;
}

Then, when you call post_class():

<?php post_class( mytheme_get_post_class_parent_cats() ); ?>
9
  • There seems to be a problem with your function, it's not working o_O
    – rats
    Jul 17, 2011 at 21:19
  • It's example code for implementing the two referenced functions. Can you provide more detail? What's not working. Jul 17, 2011 at 21:22
  • as this is for a post, the function should loop through the post's categories: codex.wordpress.org/Function_Reference/wp_get_post_categories
    – Michael
    Jul 17, 2011 at 21:30
  • Okay, see updates. Added parameters to get_category_parents(), and added an explode() call to create the array from which to get the top-level parent category. Jul 17, 2011 at 21:31
  • Oh, good call, @michael! Let me adjust things a bit... Jul 17, 2011 at 21:34
0

A friend found the perfect solution, so I think it's fair to share it with you guys:

function rats_class($classes){
 global $post;
 $cat=get_the_category(get_query_var('post'));
 if(is_array($cat)&&!empty($cat)){
  if($cat[0]->category_parent!=0){
   $parents=get_category_parents($cat[0]->term_id,false,'@',true);
   if(!empty($parents)){
    $parent=explode('@',$parents);
    $classes[]='category-'.$parent[0];
   }
  }
 }
 return $classes;
}
add_filter('post_class','rats_class');

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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