Search code examples
phpwordpresscategorieswp-admin

How to hide specific Main Cagtegory and all associated child categories in Wordpress Admin (Backend)


Im using the following function to hide specific categories from a certain user role in the wp backend edit post / product page. The category ID 330 has multiple child categories. Any idea how to hide the main category (330) and all child categories at once regardless of the amount of child categories?

    /*
     * Hide Specified Categories (by ID) from shop_manager Role
    */

    add_action( 'admin_init', 'wpse_55202_do_terms_exclusion_shop_manager_role' );
    function wpse_55202_do_terms_exclusion_shop_manager_role() {
        global $current_user;
        // if( current_user_can('editor') ) {
        if ( in_array('shop_manager', $current_user->roles) )
            add_filter( 'list_terms_exclusions', 'wpse_55202_list_terms_exclusions_shop_manager_role', 10, 2 );
        }

    function wpse_55202_list_terms_exclusions_shop_manager_role($exclusions,$args) {
        return $exclusions . " AND ( t.term_id <> 330 )  AND ( t.term_id <> 430 )"; 
    }

Hide all of them at once...

enter image description here


Solution

  • The following code excludes the parent and all child categories.

        /*
         * Hide Specified Categories (by ID) from shop_manager Role
        */
        add_action( 'admin_init', 'wpse_55202_do_terms_exclusion_shop_manager_role' );
        function wpse_55202_do_terms_exclusion_shop_manager_role() {
            global $current_user;
            // if( current_user_can('editor') ) {
            if ( in_array('shop_manager', $current_user->roles) )
                add_filter( 'list_terms_exclusions', 'wpse_55202_list_terms_exclusions_shop_manager_role', 10, 2 );
            }
        function wpse_55202_list_terms_exclusions_shop_manager_role($exclusions,$args) {
            $children_of_parent_cat = implode(',',get_term_children(458,'product_cat')); // get all child categories
            $children_of_parent_cat = (empty($children_of_parent_cat) ? '' : ",$children_of_parent_cat"); // if childs empty or not
            // return $exclusions . " AND (t.term_id NOT IN (458{$children_of_parent_cat}))";
            return $exclusions . " AND (t.term_id NOT IN (458 ".$children_of_parent_cat." ))"; // Exlculde parent and all child cats
        }