Make all subcategories use the template of its category parent?

How can I make all subcategories use the template of its category parent?

Related posts

Leave a Reply

3 comments

  1. Here is a code I used to do it:

    // make category use parent category template
    function load_cat_parent_template($template) {
    
        $cat_ID = absint( get_query_var('cat') );
        $category = get_category( $cat_ID );
    
        $templates = array();
    
        if ( !is_wp_error($category) )
            $templates[] = "category-{$category->slug}.php";
    
        $templates[] = "category-$cat_ID.php";
    
        // trace back the parent hierarchy and locate a template
        if ( !is_wp_error($category) ) {
            $category = $category->parent ? get_category($category->parent) : '';
    
            if( !empty($category) ) {
                if ( !is_wp_error($category) )
                    $templates[] = "category-{$category->slug}.php";
    
                $templates[] = "category-{$category->term_id}.php";
            }
        }
    
        $templates[] = "category.php";
        $template = locate_template($templates);
    
        return $template;
    }
    add_action('category_template', 'load_cat_parent_template');
    
  2. Daniel Crabbe had the same issue I had. Found this site that has some code that will look for and use a parent category’s template file whilst showing the appropriate posts.

    I’ve updated it to support slugs in the file name (not just the category ID).

    // Use a parent category slug if it exists
    function child_force_category_template($template) {
        $cat = get_query_var('cat');
        $category = get_category($cat);
    
        if ( file_exists(TEMPLATEPATH . '/category-' . $category->cat_ID . '.php') ) {
            $cat_template = TEMPLATEPATH . '/category-' . $category ->cat_ID . '.php';
        } elseif ( file_exists(TEMPLATEPATH . '/category-' . $category->slug . '.php') ) {
            $cat_template = TEMPLATEPATH . '/category-' . $category ->slug . '.php';
        } elseif ( file_exists(TEMPLATEPATH . '/category-' . $category->category_parent . '.php') ) {
            $cat_template = TEMPLATEPATH . '/category-' . $category->category_parent . '.php';
        } else {
            // Get Parent Slug
            $cat_parent = get_category($category->category_parent);
    
            if ( file_exists(TEMPLATEPATH . '/category-' . $cat_parent->slug . '.php') ) {
                $cat_template = TEMPLATEPATH . '/category-' . $cat_parent->slug . '.php';
            } else {
                $cat_template = $template;
            }
    
        }
    
        return $cat_template;
    }
    add_action('category_template', 'child_force_category_template');
    
  3. Actually it’s a filter hook

    https://developer.wordpress.org/reference/functions/get_category_template/

    /**
     * Retrieve path of category-videos.php template for 'videos' subcategories
     * Filtered via 'category_template' hook
     *
     * @param string Full path to category template file.
     *
     * @return string Full path to category template file.
     */
    function get_category_videos_template( $template ) {
      $category_ID = intval( get_query_var('cat') );
      $category = get_category( $category_ID );
      $parent_ID = $category->parent;
      $parent_category = get_category( $parent_ID );
      /**
       * Check wheter the $parent_category object is not a WordPress Error and its slug is 'videos'
       */
      if ( !is_wp_error( $parent_category ) AND $parent_category->slug == 'videos' ) {
        /**
         * Check if the template file exists
         *
         */
        if ( file_exists( TEMPLATEPATH . '/category-' . $parent_category->slug . '.php' )) {
          return TEMPLATEPATH . '/category-' . $parent_category->slug . '.php';
        }
      } else {
        return $template;
      }
    }
    add_filter( 'category_template', 'get_category_videos_template' );