Taxonomy filter all children

I have a custom taxonomy filter that will filter all the pages in the selected taxonomy. I would like the code to select the pages in that taxonomy, and the children of thous pages.

Heres the code.

Read More
add_action('restrict_manage_posts', 'restrict_manage_posts_section');
function restrict_manage_posts_section()
{
    global $post_type;
    if ( is_object_in_taxonomy( $post_type, 'section' ) )
    {
        $dropdown_options = array(
            'show_option_all' => __( 'View all sections' ),
            'hide_empty' => 0,
            'hierarchical' => 1,
            'name' => 'section',
            'show_count' => 0,
            'taxonomy' => 'section',
            'orderby' => 'name',
            'selected' => $cat
        );

        add_filter('wp_dropdown_cats', 'wp_dropdown_section_filter', 10);
        wp_dropdown_categories( $dropdown_options );
        remove_filter('wp_dropdown_cats', 'wp_dropdown_section_filter', 10);
    }
}

function wp_dropdown_section_filter($select)
{
    $terms  = get_terms('section', array('hide_empty' => false));   
    foreach( $terms as $term )
    {
        $select = str_replace('value="'.$term->term_id.'"', 'value="'.$term->slug.'"', $select);
        if (isset($_GET['section']) && $term->slug == $_GET['section']){
            $select = str_replace('value="'.$term->slug.'"', 'value="'.$term->slug.'" selected', $select);
        }
    }   
    return $select;
}

EDIT

Here is my Custom Post Type and Taxonomy Function

/* Register Custom Post Type and Taxonomy
---------------------------------------------------*/
add_action('init', 'register_module_type');
function register_module_type() {
    $labels = array(
        'name' => _x('Modules', 'post type general name'),
        'singular_name' => _x('Modules', 'post type singular name'),
        'add_new' => _x('Add Module', 'module item'),
        'add_new_item' => __('Add Module'),
        'edit_item' => __('Edit Module'),
        'new_item' => __('New Module'),
        'view_item' => __('View Module'),
        'search_items' => __('Search Module'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array( 'slug' => 'module', 'with_front' => false ),
        'capability_type' => 'post',
        'hierarchical' => true,
        'has_archive' => true,
        'can_export' => true,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail',/*'excerpt',*/'revisions','custom-fields','post-formats'/*,'page-attributes'*/)
        #'taxonomies' => array('category', 'post_tag')
    ); 

    register_post_type( 'module' , $args );
    #register_taxonomy_for_object_type('category', 'testimonial');
    #register_taxonomy_for_object_type('post_tag', 'testimonial');

    $labels = array(
        'name' => _x( 'Sections', 'taxonomy general name' ),
        'singular_name' => _x( 'Section', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Sections' ),
        'all_items' => __( 'All Sections' ),
        'parent_item' => __( 'Parent Section' ),
        'parent_item_colon' => __( 'Parent Section:' ),
        'edit_item' => __( 'Edit Section' ),
        'update_item' => __( 'Update Section' ),
        'add_new_item' => __( 'Add New Section' ),
        'new_item_name' => __( 'New Section Name' ),
    );  

    register_taxonomy( 'section', array( 'module' ), array(
        'hierarchical' => true,
        'labels' => $labels,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array( 'slug' => 'section' ),
    ));

    #add_theme_support( 'post-formats', array( 'chat','aside','gallery','link','image','quote','status','video' ));
    flush_rewrite_rules( false );
}

Related posts

Leave a Reply

1 comment

  1. This hooks into the update action for any post. It’ll copy all terms for a given set of taxonomies from a parent to it’s children.

    /**
     * Update all children of a post with the same terms as itself.
     * 
     * @param int $post_ID
     * @param object $post
     */
    function __update_children_with_terms( $post_ID, $post )
    {
        global $wpdb;
    
        // array of taxonomies to be copied to children, if the post type supports it
        $taxonomies = array( 'section' );
    
        if ( ! is_post_type_hierarchical( $post->post_type ) )
            return; // bail
    
        // all child IDs for current post
        $children = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_parent = " . ( int ) $post_ID );
    
        // loop over each taxonomy for the current post type
        foreach ( get_object_taxonomies( $post->post_type ) as $taxonomy ) {
    
            if ( ! in_array( $taxonomy, $taxonomies ) )
                continue; // bail, term copy not supported for this tax
    
            if ( ! $terms = wp_get_object_terms( $post_ID, $taxonomy, array( 'fields' => 'ids' ) ) )
                continue; // bail, no terms for this tax
    
            // essential, otherwise wp_set_object_terms treats them as strings and creates new terms!
            $terms = wp_parse_id_list( $terms );
    
            // loop over children and append the terms
            foreach ( $children as $child ) {
                wp_set_object_terms( $child, $terms, $taxonomy, true );
    
                // this will rescursively iterate down the tree but at a cost!!
                // remove it if you only need parent => direct child copying
                wp_update_post( array( 'ID' => ( int ) $child ) );
            }
    
        }
    }
    add_action( 'wp_insert_post', '__update_children_with_terms', 10, 2 );
    

    Note the last line of the inner foreach loop – if you only have Top Level Parent => Children, and not Parent => Child => Grandchild, I highly recommend removing the following line;

    wp_update_post( array( 'ID' => ( int ) $child ) );
    

    It’s a recursive situation, that will loop over children and run the same process, continuing to iterate until the whole tree has been processed.