Make WordPress Core

Ticket #35495: 35495.3.diff

File 35495.3.diff, 6.7 KB (added by flixos90, 9 years ago)
  • src/wp-includes/taxonomy.php

     
    10771077 * @since 4.4.0 Introduced the ability to pass 'term_id' as an alias of 'id' for the `orderby` parameter.
    10781078 *              Introduced the 'meta_query' and 'update_term_meta_cache' parameters. Converted to return
    10791079 *              a list of WP_Term objects.
    1080  * @since 4.5.0 Introduced 'meta_key' and 'meta_value' parameters. Introduced the ability to order results by metadata.
     1080 * @since 4.5.0 Changed the function signature so that the `$args` array can be provided as the first parameter.
     1081 *              Introduced 'meta_key' and 'meta_value' parameters. Introduced the ability to order results by metadata.
    10811082 *
    10821083 * @global wpdb  $wpdb WordPress database abstraction object.
    10831084 * @global array $wp_filter
    10841085 *
    1085  * @param string|array $taxonomies Taxonomy name or list of Taxonomy names.
    10861086 * @param array|string $args {
    10871087 *     Optional. Array or string of arguments to get terms.
    10881088 *
     1089 *     @type string|array $taxonomy               Taxonomy name, or array of taxonomies, to which results should
     1090 *                                                be limited.
    10891091 *     @type string       $orderby                Field(s) to order terms by. Accepts term fields ('name', 'slug',
    10901092 *                                                'term_group', 'term_id', 'id', 'description'), 'count' for term
    10911093 *                                                taxonomy count, 'include' to match the 'order' of the $include param,
     
    11441146 *     @type string       $meta_value             Limit terms to those matching a specific metadata value. Usually used
    11451147 *                                                in conjunction with `$meta_key`.
    11461148 * }
     1149 * @param array $legacy_args Argument array, when using the legacy function parameter format. If present, this
     1150 *                           parameter will be interpreted as `$args`, and the first function parameter will
     1151 *                           be parsed as a taxonomy or array of taxonomies.
    11471152 * @return array|int|WP_Error List of WP_Term instances and their children. Will return WP_Error, if any of $taxonomies
    11481153 *                            do not exist.
    11491154 */
    1150 function get_terms( $taxonomies, $args = '' ) {
     1155function get_terms( $args = array(), $legacy_args = '' ) {
    11511156        global $wpdb;
    1152         $empty_array = array();
    11531157
    1154         if ( ! is_array( $taxonomies ) ) {
    1155                 $taxonomies = array( $taxonomies );
    1156         }
    1157 
    1158         foreach ( $taxonomies as $taxonomy ) {
    1159                 if ( ! taxonomy_exists($taxonomy) ) {
    1160                         return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );
    1161                 }
    1162         }
    1163 
    11641158        $defaults = array(
     1159                'taxonomy'               => null,
    11651160                'orderby'                => 'name',
    11661161                'order'                  => 'ASC',
    11671162                'hide_empty'             => true,
     
    11871182                'meta_query'             => ''
    11881183        );
    11891184
     1185        /*
     1186         * Legacy argument format ($taxonomy, $args) takes precedence.
     1187         *
     1188         * We detect legacy argument format by checking if
     1189         * (a) a second non-empty parameter is passed, or
     1190         * (b) the first parameter shares no keys with the default array (ie, it's a list of taxonomies)
     1191         */
     1192        $do_legacy_args = $legacy_args || empty( array_intersect_key( $defaults, (array) $args ) );;
     1193
     1194        $taxonomies = null;
     1195        if ( $do_legacy_args ) {
     1196                $taxonomies = (array) $args;
     1197                $args = $legacy_args;
     1198        } elseif ( isset( $args['taxonomy'] ) && null !== $args['taxonomy'] ) {
     1199                $taxonomies = (array) $args['taxonomy'];
     1200                unset( $args['taxonomy'] );
     1201        }
     1202
     1203        $empty_array = array();
     1204
     1205        if ( $taxonomies ) {
     1206                foreach ( $taxonomies as $taxonomy ) {
     1207                        if ( ! taxonomy_exists($taxonomy) ) {
     1208                                return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );
     1209                        }
     1210                }
     1211        }
     1212
    11901213        /**
    11911214         * Filter the terms query default arguments.
    11921215         *
     
    12041227
    12051228        // Save queries by not crawling the tree in the case of multiple taxes or a flat tax.
    12061229        $has_hierarchical_tax = false;
    1207         foreach ( $taxonomies as $_tax ) {
    1208                 if ( is_taxonomy_hierarchical( $_tax ) ) {
    1209                         $has_hierarchical_tax = true;
     1230        if ( $taxonomies ) {
     1231                foreach ( $taxonomies as $_tax ) {
     1232                        if ( is_taxonomy_hierarchical( $_tax ) ) {
     1233                                $has_hierarchical_tax = true;
     1234                        }
    12101235                }
    12111236        }
    12121237
     
    13091334                $order = 'ASC';
    13101335        }
    13111336
    1312         $where = "tt.taxonomy IN ('" . implode("', '", $taxonomies) . "')";
     1337        $where = '';
     1338        if ( $taxonomies ) {
     1339                $where .= "tt.taxonomy IN ('" . implode("', '", $taxonomies) . "')";
     1340        }
    13131341
    13141342        $exclude = $args['exclude'];
    13151343        $exclude_tree = $args['exclude_tree'];
     
    15541582        $order = isset( $clauses[ 'order' ] ) ? $clauses[ 'order' ] : '';
    15551583        $limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : '';
    15561584
    1557         $query = "SELECT $distinct $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits";
     1585        if ( $where ) {
     1586                if ( 0 === strpos( $where, ' AND ' ) ) {
     1587                        $where = substr( $where, 5 );
     1588                }
     1589                $where = ' WHERE ' . $where;
     1590        }
    15581591
     1592        $query = "SELECT $distinct $fields FROM $wpdb->terms AS t $join $where $orderby $order $limits";
     1593
    15591594        // $args can be anything. Only use the args defined in defaults to compute the key.
    15601595        $key = md5( serialize( wp_array_slice_assoc( $args, array_keys( $defaults ) ) ) . serialize( $taxonomies ) . $query );
    15611596        $last_changed = wp_cache_get( 'last_changed', 'terms' );
  • tests/phpunit/tests/term/getTerms.php

     
    1212        }
    1313
    1414        /**
     15         * @ticket 35495
     16         */
     17        public function test_should_accept_an_args_array_containing_taxonomy_for_first_parameter() {
     18                register_taxonomy( 'wptests_tax', 'post' );
     19                $term = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
     20
     21                $found = get_terms( array(
     22                        'taxonomy' => 'wptests_tax',
     23                        'hide_empty' => false,
     24                        'fields' => 'ids',
     25                        'update_term_meta_cache' => false,
     26                ) );
     27
     28                $this->assertEqualSets( array( $term ), $found );
     29        }
     30
     31        /**
     32         * @ticket 35495
     33         */
     34        public function test_excluding_taxonomy_arg_should_return_terms_from_all_taxonomies() {
     35                register_taxonomy( 'wptests_tax1', 'post' );
     36                register_taxonomy( 'wptests_tax2', 'post' );
     37                $t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
     38                $t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
     39
     40                $found = get_terms( array(
     41                        'hide_empty' => false,
     42                        'fields' => 'ids',
     43                        'update_term_meta_cache' => false,
     44                ) );
     45
     46                // There may be other terms lying around, so don't do an exact match.
     47                $this->assertContains( $t1, $found );
     48                $this->assertContains( $t2, $found );
     49        }
     50
     51        /**
    1552         * @ticket 23326
    1653         */
    1754        public function test_get_terms_cache() {