From bdd898045d29d27838abb877943552427e404b6c Mon Sep 17 00:00:00 2001 From: Boone Gorges Date: Sat, 11 Mar 2017 02:27:44 +0000 Subject: [PATCH] Don't run 'get_terms' filter when querying for terms within `get_term_by()`. Historically, it has been possible to call `get_term_by()` within a 'get_terms' filter callback. Since `get_term_by()` was refactored to use `get_terms()` internally [38677], callbacks of this nature have resulted in infinite loops. As a workaround, we introduce a 'suppress_filter' option to `get_terms()`, and use it when calling the function from within `get_term_by()`. Props ocean90. See #21760. Built from https://develop.svn.wordpress.org/trunk@40275 git-svn-id: http://core.svn.wordpress.org/trunk@40192 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/taxonomy.php | 19 +++++++++++++++++-- wp-includes/version.php | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/wp-includes/taxonomy.php b/wp-includes/taxonomy.php index a67d52a9af..100758ddc6 100644 --- a/wp-includes/taxonomy.php +++ b/wp-includes/taxonomy.php @@ -849,6 +849,7 @@ function get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter 'taxonomy' => $taxonomy, 'update_term_meta_cache' => false, 'orderby' => 'none', + 'suppress_filter' => true, ); switch ( $field ) { @@ -1012,6 +1013,7 @@ function get_term_to_edit( $id, $taxonomy ) { * a list of WP_Term objects. * @since 4.5.0 Changed the function signature so that the `$args` array can be provided as the first parameter. * Introduced 'meta_key' and 'meta_value' parameters. Introduced the ability to order results by metadata. + * @since 4.8.0 Introduced 'suppress_filter' parameter. * * @internal The `$deprecated` parameter is parsed for backward compatibility only. * @@ -1083,6 +1085,7 @@ function get_term_to_edit( $id, $taxonomy ) { * @type string $meta_type Type of object metadata is for (e.g., comment, post, or user). * Default empty. * @type string $meta_compare Comparison operator to test the 'meta_value'. Default empty. + * @type bool $suppress_filter Whether to suppress the {@see 'get_terms'} filter. Default false. * } * @param array $deprecated Argument array, when using the legacy function parameter format. If present, this * parameter will be interpreted as `$args`, and the first function parameter will @@ -1095,6 +1098,10 @@ function get_terms( $args = array(), $deprecated = '' ) { $term_query = new WP_Term_Query(); + $defaults = array( + 'suppress_filter' => false, + ); + /* * Legacy argument format ($taxonomy, $args) takes precedence. * @@ -1108,10 +1115,10 @@ function get_terms( $args = array(), $deprecated = '' ) { if ( $do_legacy_args ) { $taxonomies = (array) $args; - $args = wp_parse_args( $deprecated ); + $args = wp_parse_args( $deprecated, $defaults ); $args['taxonomy'] = $taxonomies; } else { - $args = wp_parse_args( $args ); + $args = wp_parse_args( $args, $defaults ); if ( isset( $args['taxonomy'] ) && null !== $args['taxonomy'] ) { $args['taxonomy'] = (array) $args['taxonomy']; } @@ -1125,6 +1132,10 @@ function get_terms( $args = array(), $deprecated = '' ) { } } + // Don't pass suppress_filter to WP_Term_Query. + $suppress_filter = $args['suppress_filter']; + unset( $args['suppress_filter'] ); + $terms = $term_query->query( $args ); // Count queries are not filtered, for legacy reasons. @@ -1132,6 +1143,10 @@ function get_terms( $args = array(), $deprecated = '' ) { return $terms; } + if ( $suppress_filter ) { + return $terms; + } + /** * Filters the found terms. * diff --git a/wp-includes/version.php b/wp-includes/version.php index 497dc9f3cf..1cd4227b6f 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.8-alpha-40271'; +$wp_version = '4.8-alpha-40275'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.