web-dev-qa-db-fra.com

Taxonomie filtrer tous les enfants

J'ai un filtre de taxonomie personnalisé qui filtrera toutes les pages de la taxonomie sélectionnée. Je voudrais que le code sélectionne les pages de cette taxonomie et les enfants de mille pages.

Heres le code.

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;
}

MODIFIER

Voici ma fonction de type de message personnalisé et de taxonomie

/* 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 );
}
1
cnotethegr8

Cela est lié à l’action de mise à jour pour n’importe quel message. Il va copier tous les termes pour un ensemble donné de taxonomies d'un parent à ses enfants.

/**
 * 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 );

Notez la dernière ligne de la boucle foreach intérieure - si vous avez seulement Top Level Parent => Children, et non pas Parent => Child => Grandchild, je vous recommande fortement de supprimer la ligne suivante;

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

C'est une situation récursive, qui passe en boucle sur les enfants et exécute le même processus, en continuant d'itérer jusqu'à ce que tout l'arbre ait été traité.

2
TheDeadMedic