Is this normal WordPress behaviour?
I have:
- Custom post type: "article"
- Custom taxonomy: "company" (hierarchical)
In the backend, when I go to the post list for "Articles", and constrain results by clicking on a "company" term, I expect to see only posts tagged with that specific company.
Instead, I see those plus posts tagged with its child companies as well.
Example: if I click my "AT&T" "company" term (9), I don't just see my "articles" tagged with "AT&T", but also those tagged with all downstream child terms across multiple descendent levels (42)...
- AT&T
- DirecTV
- WarnerMedia
- HBO
- Turner Broadcasting
- CNN
- WarnerMedia
- DirecTV
That doesn't feel like correct behaviour.
Here is how I register the "company" taxonomy...
/**
* ==============================================================================
* REGISTER TAXONOMY
* ==============================================================================
*/
if ( ! function_exists( 'register_taxonomy_company' ) ) {
function register_taxonomy_company() {
$labels = array(
'name' => _x( 'Organisations', 'Taxonomy General Name', 'text_domain' ),
'singular_name' => _x( 'Organisation', 'Taxonomy Singular Name', 'text_domain' ),
'menu_name' => __( 'Organisations', 'text_domain' ),
'all_items' => __( 'All Organisations', 'text_domain' ),
'parent_item' => __( 'Parent Organisation', 'text_domain' ),
'parent_item_colon' => __( 'Parent Organisation:', 'text_domain' ),
'new_item_name' => __( 'New Organisation Name', 'text_domain' ),
'add_new_item' => __( 'Add New Organisation', 'text_domain' ),
'edit_item' => __( 'Edit Organisation', 'text_domain' ),
'update_item' => __( 'Update Organisation', 'text_domain' ),
'view_item' => __( 'View Organisation', 'text_domain' ),
'separate_items_with_commas' => __( 'Separate Organisations with commas', 'text_domain' ),
'add_or_remove_items' => __( 'Add or remove Organisation', 'text_domain' ),
'choose_from_most_used' => __( 'Choose from the most used', 'text_domain' ),
'popular_items' => __( 'Popular Organisation', 'text_domain' ),
'search_items' => __( 'Search Organisation', 'text_domain' ),
'not_found' => __( 'Not Found', 'text_domain' ),
'no_terms' => __( 'No Organisation', 'text_domain' ),
'items_list' => __( 'Organisations list', 'text_domain' ),
'items_list_navigation' => __( 'Organisations list navigation', 'text_domain' ),
);
$rewrite = array(
'slug' => 'organisation',
'with_front' => true,
'hierarchical' => true,
);
$args = array(
'labels' => $labels, // as above
'public' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'hierarchical' => true,
'show_admin_column' => true,
'single_value' => false, // Use single-select radio button, only one Organisation per object
'show_tagcloud' => true,
'rewrite' => $rewrite, // as above
);
// Put it all together!
register_taxonomy(
/* taxonomy name */ 'company',
/* attach to object */ array( 'article','report','session','quote','post' ),
/* arguments */ $args
);
}
add_action( 'init', 'register_taxonomy_company', 0 );
}
And this is how I register the "article" post type...
/* Register custom post type */
function cpt_article() {
$labels = array(
'name' => 'Articles',
'singular_name' => 'Article',
'menu_name' => 'Articles',
'name_admin_bar' => 'Article',
'archives' => 'Article Archives',
'parent_item_colon' => 'Parent Article:',
'all_items' => 'All Articles',
'add_new_item' => 'Add New Article',
'add_new' => 'Add New',
'new_item' => 'New Article',
'edit_item' => 'Edit Article',
'update_item' => 'Update Article',
'view_item' => 'View Article',
'search_items' => 'Search Article',
'not_found' => 'Not found',
'not_found_in_trash' => 'Not found in Trash',
'featured_image' => 'Featured Image',
'set_featured_image' => 'Set featured image',
'remove_featured_image' => 'Remove featured image',
'use_featured_image' => 'Use as featured image',
'insert_into_item' => 'Insert into Article',
'uploaded_to_this_item' => 'Uploaded to this Article',
'items_list' => 'Articles list',
'items_list_navigation' => 'Articles list navigation',
'filter_items_list' => 'Filter Articles list',
);
$args = array(
'label' => 'Article',
'description' => 'Articles.',
'labels' => $labels,
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', /*'comments', 'revisions', 'post-formats',*/ ),
'taxonomies' => array( 'source', 'category', 'post_tag' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 6,
'menu_icon' => 'dashicons-media-text',
'show_in_admin_bar' => true,
'show_in_nav_menus' => true,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'capability_type' => 'post',
);
register_post_type( 'article', $args );
}
add_action( 'init', 'cpt_article', 0 );
hierarchical
had been set to true
. I have changed it to false
, but there is no effect.
UPDATE:
I have just checked another, separate WordPress install which runs hierarchical taxonomies and confirmed a second case - when viewing posts for a certain term, the WordPress admin post list seems to think it is appropriate behaviour to show posts for its sub-terms.
I can't believe that's correct.
Does anyone know a way to suppress this?
It makes it hard to manage things.
parse_tax_query
action, you need to ultimately modify theinclude_children
argument for those queries.