web-dev-qa-db-ja.com

分類フィルターすべての子供

選択した分類法のすべてのページをフィルタリングするカスタム分類法フィルターがあります。その分類法のページ、およびthousページの子を選択するためのコードが欲しいのです。

コードがあります。

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

編集

これが私のカスタム投稿タイプと分類機能です。

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

これは投稿の更新アクションにフックします。指定された一連の分類法のすべての用語を親からその子にコピーします。

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

内側のforeachループの最後の行に注意してください - あなたがTop Level Parent => Childrenだけを持っていて、Parent => Child => Grandchildを持っていないなら、私は次の行を削除することを強く勧めます。

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

これは再帰的な状況です。子をループして同じプロセスを実行し、ツリー全体が処理されるまで繰り返し続けます。

2
TheDeadMedic