Collection of Useful Wordpress Category FunctionsA collection of useful Wordpress category functions. Get parent category, and detect if current category is a subcategory or child category.
These are some Wordpress category functions that I found on the web years ago and have been using ever since. They appear on all my WordPress websites.
Get Parent Category ID
Firstly we have a function to get the ID of the parent category of the current category.
function get_parent_category()
{
foreach ((get_the_category()) as $cat)
{
if ($cat->category_parent)
return $cat->category_parent;
else
return $cat->cat_ID;
}
}
Is Post in Category or Sub Category of Specified ID?
Next we have two functions which form one of the most useful functions ever. It will allow you to pass in a category id and it will tell you if the current post or category is contained within that category, either directly or through child/sub categories.
function in_category_or_subcategory_of($cat_id=0)
{
$cats = get_the_category();
if (!count($cats))
return false;
foreach ((array)$cats as $cat)
{
if ($cat->cat_ID == $cat_id)
return true;
if (in_category_dig_parents($cat->category_parent, $cat_id))
return true;
}
return false;
}
function in_category_dig_parents($cat_id, $look_for)
{
if ( !$cat_id )
return false;
if ( $cat_id == $look_for )
return true;
$cat = get_category($cat_id);
return in_category_dig_parents($cat->category_parent, $look_for);
}
To use it, simply call 'in_category_or_subcategory_of' specifying a category id and it will return true or false depending on the category hierarchy.
These functions were not written by myself, and I do not know who did write them. If you know the author, please let me know so I can give credit where credit is due.
Prevent WordPress Showing Posts of Sub Categories
In some types of website, you may wish to display ONLY the posts of a category and not posts of sub categories on a Wordpress blog. Let's say you had a parent category of "Weather" with sub-categories "America" and "United Kingdom". When a user clicks on the weather category, Wordpress will automatically display posts from the Weather category AS WELL AS the posts of America and the United Kingdom.
If this is not the behaviour you are after, there is a template tag trick that you can use in your theme to show posts of the current category ONLY.
If you have an archive.php or category.php open that, otherwise open index.php. Don't forget to back them up just in case things go wrong!
Find the line similar to (start of the loop):
<?php while (have_posts()) : the_post(); ?>
and add after it on the next line:
<? if ((is_category()) && in_category($wp_query->get_queried_object_id())) { ?>
This line checks if we are viewing a category and that the post being processed is a member of the category being viewed. If it is then we will show the post.
$wp_query->get_queried_object_id()
returns an integer ID of the category being viewed.
in_cagegory()
tests if the current post in the loop is a member of the specified category, in this case, we pass it the current category.
Next need to find the line:
<?php endwhile; ?>
Which is the end of the loop, and add a line BEFORE it containing:
<?php } ?>
This small modification will stop posts of child categories from showing when a parent category is selected. Of course, you will need some posts in Weather otherwise you will have a blank page. You can also use the information on the Wordpress Codex template tags to create static pages for each category if you wish.
If you only wish to stop sub-category posts from showing on one particular parent category you can specify the required category in the is_category()
method. Simply insert the numerical id of the parent category in the brackets, e.g. is_category(10)
will stop sub-category posts from showing only if we are viewing the category with ID of 10. All other categories will retain their default setting.