Opened 14 years ago
Closed 10 years ago
#16863 closed defect (bug) (worksforme)
get_terms hierarchical/hide_empty incompatible with include/exclude args
Reported by: | martinshopland | Owned by: | |
---|---|---|---|
Milestone: | Priority: | normal | |
Severity: | normal | Version: | 3.1 |
Component: | Taxonomy | Keywords: | needs-unit-tests needs-refresh |
Focuses: | Cc: |
Description
$terms = get_terms('taxName', array( 'hierarchical' => true, 'hide_empty' => true, 'include' => array(1, 2, 3) ));
$terms will not contain a meaningful result set. In order for get_terms to process 'hierarchical' correctly it must recieve in 'include' a full list of term ids for all child terms that may have count > 0, this obviously negates the point of 'include' here.
'include/exclude' is processed at query level, 'hierarchical' is processed post query and expects the results of the query to be unfiltered.
The following patch seems to fix the issue in my application, I think this approach would need to take in 'child_of' also, which I haven't done here.
diff --git a/wp-includes/taxonomy.php b/wp-includes/taxonomy.php index 89532dc..2f51bea 100644 --- a/wp-includes/taxonomy.php +++ b/wp-includes/taxonomy.php @@ -1337,9 +1337,13 @@ function &get_terms($taxonomies, $args = '') { // Make sure we show empty categories that have children. if ( $hierarchical && $hide_empty && is_array($terms) ) { + + $taxTerms = !(empty($include) && empty($exclude) && empty($exclude_tree)) ? + get_terms($taxonomies) : $terms; + foreach ( $terms as $k => $term ) { if ( ! $term->count ) { - $children = _get_term_children($term->term_id, $terms, $taxonomies[0]); + $children = _get_term_children($term->term_id, $taxTerms, $taxonomies[0]); if ( is_array($children) ) foreach ( $children as $child ) if ( $child->count )
Attachments (2)
Change History (10)
#8
@
10 years ago
- Milestone Future Release deleted
- Resolution set to worksforme
- Status changed from new to closed
It appears that this is no longer a problem. See 16863-test.diff. I believe the problem was probably fixed by [27458], because the switch from _get_term_children()
to get_term_children()
means that the term hierarchy is now calculated independently of the 'hide_empty' query.
Related #16240