I'm trying to exclude one category from the category list widget on the Shop and product archive pages for users other than the administrator. But for some reason it doesn't work.
Any help, thanks.
function exclude_category( $terms, $taxonomies, $args ) {
$new_terms = array();
/*if ( !is_admin() && ( is_product() || is_shop() || is_product_category() || is_product_tag() ) ){ */
if ( !is_admin() || is_product() || is_shop() || is_product_category() || is_product_tag() ){
foreach ( $terms as $key => $term ) {
if( is_object ( $term ) ) {
if ( 'some-category' == $term->slug && $term->taxonomy = 'product_cat' ) {
unset($terms[$key]);
}
}
}
}
return $terms;
}
add_filter( 'get_terms', 'exclude_category', 10, 3 );
I was inspired by this: https://stackoverflow.com/a/48849931/16275280
Use the following conditional checks instead:
roles property of the user object returned from wp_get_current_userDocs function.is_product() || is_shop() || is_product_category() || is_product_tag()), you could simply use this is_woocommerce() function.So the entire code would be:
add_filter('get_terms', 'exclude_category', 10, 3);
function exclude_category($terms, $taxonomies, $args)
{
$roles = wp_get_current_user()->roles;
if
(
!in_array('administrator', $roles)
&&
is_woocommerce()
)
{
foreach ($terms as $key => $term)
{
if (is_object($term))
{
if ('decor' == $term->slug && $term->taxonomy == 'product_cat')
{
unset($terms[$key]);
}
}
}
}
return $terms;
}
Note:
'decor' as the category slug to test this snippet on my site, so don't forget to replace it with your own category slug.And here's the result:
add_filter('get_terms', 'exclude_category', 10, 3);
function exclude_category($terms, $taxonomies, $args)
{
$roles = wp_get_current_user()->roles;
if (
!in_array('administrator', $roles)
)
{
foreach ($terms as $key => $term)
{
if (is_object($term))
{
if ('uncategorized' == $term->slug && $term->taxonomy == 'category')
{
unset($terms[$key]);
}
}
}
}
return $terms;
}
Note:
'uncategorized' as the category slug to test this snippet on my site, so don't forget to replace it with your own category slug.You could set up an array and use in_array function for the conditional check. Like this:
$excluded_cat_slugs = array ('hoodies', 'decor');
if(in_array($term->slug, $excluded_cat_slugs) && $term->taxonomy == 'product_cat')
$excluded_cat_slugs = array ('uncategorized', 'test-category');
if(in_array($term->slug, $excluded_cat_slugs) && $term->taxonomy == 'category')