選択した分類法のすべてのページをフィルタリングするカスタム分類法フィルターがあります。その分類法のページ、および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 );
}
これは投稿の更新アクションにフックします。指定された一連の分類法のすべての用語を親からその子にコピーします。
/**
* 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 ) );
これは再帰的な状況です。子をループして同じプロセスを実行し、ツリー全体が処理されるまで繰り返し続けます。