Make WordPress Core

Ticket #31383: 31383.diff

File 31383.diff, 9.1 KB (added by desrosj, 7 years ago)

Applies WP_Tax_Query support to WP_User_Query, no UX.

  • src/wp-includes/class-wp-user-query.php

     
    5353        public $meta_query = false;
    5454
    5555        /**
     56         * Taxonomy query, as passed to get_tax_sql()
     57         *
     58         * @since 4.8.0
     59         * @access public
     60         * @var object WP_Tax_Query
     61         */
     62        public $tax_query;
     63
     64        /**
    5665         * The SQL query used to fetch matching users.
    5766         *
    5867         * @since 4.4.0
     
    102111                        'meta_key' => '',
    103112                        'meta_value' => '',
    104113                        'meta_compare' => '',
     114                        'tax_query' => array(),
    105115                        'include' => array(),
    106116                        'exclude' => array(),
    107117                        'search' => '',
     
    326336                $this->meta_query = new WP_Meta_Query();
    327337                $this->meta_query->parse_query_vars( $qv );
    328338
     339                // Taxonomy query.
     340                $this->parse_tax_query( $qv );
     341
    329342                if ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) {
    330343                        $who_query = array(
    331344                                'key' => $wpdb->get_blog_prefix( $blog_id ) . 'user_level',
     
    444457                        }
    445458                }
    446459
     460                if ( ! empty( $this->tax_query->queries ) ) {
     461                        $taxonomy_clauses = $this->tax_query->get_sql( $wpdb->users, 'ID' );
     462                        $this->query_from .= $taxonomy_clauses['join'];
     463                        $this->query_where .= $taxonomy_clauses['where'];
     464                }
     465
    447466                // sorting
    448467                $qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : '';
    449468                $order = $this->parse_order( $qv['order'] );
     
    583602        }
    584603
    585604        /**
     605         * Parses various taxonomy related query vars.
     606         *
     607         * @access protected
     608         * @since 4.8.0
     609         *
     610         * @param array $q The query variables. Passed by reference.
     611         */
     612        protected function parse_tax_query( &$q ) {
     613                if ( ! empty( $q['tax_query'] ) && is_array( $q['tax_query'] ) ) {
     614                        $tax_query = $q['tax_query'];
     615                } else {
     616                        $tax_query = array();
     617                }
     618
     619                if ( ! empty( $q['taxonomy'] ) && ! empty( $q['term'] ) ) {
     620                        $tax_query[] = array(
     621                                'taxonomy' => $q['taxonomy'],
     622                                'terms' => array( $q['term'] ),
     623                                'field' => 'slug',
     624                        );
     625                }
     626
     627                foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t ) {
     628                        if ( 'post_tag' == $taxonomy ) {
     629                                continue; // Handled further down in the $q['tag'] block.
     630                        }
     631
     632                        if ( $t->query_var && ! empty( $q[ $t->query_var ] ) ) {
     633                                $tax_query_defaults = array(
     634                                        'taxonomy' => $taxonomy,
     635                                        'field' => 'slug',
     636                                );
     637
     638                                if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) {
     639                                        $q[ $t->query_var ] = wp_basename( $q[ $t->query_var ] );
     640                                }
     641
     642                                $term = $q[ $t->query_var ];
     643
     644                                if ( is_array( $term ) ) {
     645                                        $term = implode( ',', $term );
     646                                }
     647
     648                                if ( strpos( $term, '+' ) !== false ) {
     649                                        $terms = preg_split( '/[+]+/', $term );
     650                                        foreach ( $terms as $term ) {
     651                                                $tax_query[] = array_merge( $tax_query_defaults, array(
     652                                                        'terms' => array( $term )
     653                                                ) );
     654                                        }
     655                                } else {
     656                                        $tax_query[] = array_merge( $tax_query_defaults, array(
     657                                                'terms' => preg_split( '/[,]+/', $term )
     658                                        ) );
     659                                }
     660                        }
     661                }
     662
     663                $this->tax_query = new WP_Tax_Query( $tax_query );
     664
     665                /**
     666                 * Fires after taxonomy-related query vars have been parsed.
     667                 *
     668                 * @since 4.8.0
     669                 *
     670                 * @param WP_User_Query $this The WP_User_Query instance.
     671                 */
     672                do_action( 'parse_user_tax_query', $this );
     673        }
     674
     675
     676        /**
    586677         * Execute the query, with the current variables.
    587678         *
    588679         * @since 3.1.0
  • src/wp-includes/taxonomy.php

     
    545545        if ( !isset($wp_taxonomies[$taxonomy]) )
    546546                return false;
    547547
    548         if ( ! get_post_type_object($object_type) )
     548        if ( 'user' != $object_type && ! get_post_type_object( $object_type ) ) {
    549549                return false;
     550        }
    550551
    551552        if ( ! in_array( $object_type, $wp_taxonomies[$taxonomy]->object_type ) )
    552553                $wp_taxonomies[$taxonomy]->object_type[] = $object_type;
     
    574575        if ( ! isset( $wp_taxonomies[ $taxonomy ] ) )
    575576                return false;
    576577
    577         if ( ! get_post_type_object( $object_type ) )
     578        if ( 'user' != $object_type && ! get_post_type_object( $object_type ) ) {
    578579                return false;
     580        }
    579581
    580582        $key = array_search( $object_type, $wp_taxonomies[ $taxonomy ]->object_type, true );
    581583        if ( false === $key )
  • tests/phpunit/tests/taxonomy.php

     
    3333                }
    3434        }
    3535
     36        function test_get_user_taxonomy() {
     37                foreach ( get_object_taxonomies('user') as $taxonomy ) {
     38                        $tax = get_taxonomy($taxonomy);
     39                        // should return an object with the correct taxonomy object type
     40                        $this->assertTrue( is_object( $tax ) );
     41                        $this->assertTrue( is_array( $tax->object_type ) );
     42                        $this->assertEquals( array( 'user' ), $tax->object_type );
     43                }
     44        }
     45
    3646        function test_get_the_taxonomies() {
    3747                $post_id = self::factory()->post->create();
    3848
     
    139149                unset($GLOBALS['wp_taxonomies'][$tax]);
    140150        }
    141151
     152        /**
     153         * @ticket 31383
     154         */
     155        function test_register_user_taxonomy() {
     156
     157                // make up a new taxonomy name, and ensure it's unused
     158                $tax = rand_str();
     159                $this->assertFalse( taxonomy_exists($tax) );
     160
     161                register_taxonomy( $tax, 'user' );
     162                $this->assertTrue( taxonomy_exists($tax) );
     163                $this->assertFalse( is_taxonomy_hierarchical($tax) );
     164
     165                // clean up
     166                unset($GLOBALS['wp_taxonomies'][$tax]);
     167        }
     168
    142169        function test_register_hierarchical_taxonomy() {
    143170
    144171                // make up a new taxonomy name, and ensure it's unused
     
    209236                $this->assertFalse( unregister_taxonomy_for_object_type( 'category', 'post' ) );
    210237                $this->assertTrue( register_taxonomy_for_object_type( 'category', 'post' ) );
    211238
     239                // Core taxonomy, users
     240                $this->assertTrue( register_taxonomy_for_object_type( 'category', 'user' ) );
     241                $this->assertTrue( unregister_taxonomy_for_object_type( 'category', 'user' ) );
     242                $this->assertFalse( unregister_taxonomy_for_object_type( 'category', 'user' ) );
     243                $this->assertTrue( register_taxonomy_for_object_type( 'category', 'user' ) );
     244
    212245                // Core taxonomy, non-core post type
    213246                $this->assertTrue( register_taxonomy_for_object_type( 'category', $post_type ) );
    214247                $this->assertTrue( unregister_taxonomy_for_object_type( 'category', $post_type ) );
     
    215248                $this->assertFalse( unregister_taxonomy_for_object_type( 'category', $post_type ) );
    216249                $this->assertTrue( register_taxonomy_for_object_type( 'category', $post_type ) );
    217250
    218                 // Core taxonomies, non-post object types
    219                 $this->assertFalse( register_taxonomy_for_object_type( 'category', 'user' ) );
    220                 $this->assertFalse( unregister_taxonomy_for_object_type( 'category', 'user' ) );
    221 
    222251                // Non-core taxonomy, core post type
    223252                $this->assertTrue( unregister_taxonomy_for_object_type( $tax, 'post' ) );
    224253                $this->assertFalse( unregister_taxonomy_for_object_type( $tax, 'post' ) );
    225254                $this->assertTrue( register_taxonomy_for_object_type( $tax, 'post' ) );
    226255
     256                // Non-core taxonomy, users
     257                $this->assertTrue( register_taxonomy_for_object_type( $tax, 'user' ) );
     258                $this->assertTrue( unregister_taxonomy_for_object_type( $tax, 'user' ) );
     259                $this->assertFalse( unregister_taxonomy_for_object_type( $tax, 'user' ) );
     260                $this->assertTrue( register_taxonomy_for_object_type( $tax, 'user' ) );
     261
    227262                // Non-core taxonomy, non-core post type
    228263                $this->assertTrue( register_taxonomy_for_object_type( $tax, $post_type ) );
    229264                $this->assertTrue( unregister_taxonomy_for_object_type( $tax, $post_type ) );
     
    230265                $this->assertFalse( unregister_taxonomy_for_object_type( $tax, $post_type ) );
    231266                $this->assertTrue( register_taxonomy_for_object_type( $tax, $post_type ) );
    232267
    233                 // Non-core taxonomies, non-post object types
    234                 $this->assertFalse( register_taxonomy_for_object_type( $tax, 'user' ) );
    235                 $this->assertFalse( unregister_taxonomy_for_object_type( $tax, 'user' ) );
    236 
    237268                unset($GLOBALS['wp_taxonomies'][$tax]);
    238269                _unregister_post_type( $post_type );
    239270
     
    240271        }
    241272
    242273        /**
     274         * @ticket 31383
     275         */
     276        function test_registering_taxonomies_to_users() {
     277                // Create a taxonomy to test with
     278                $tax = 'test_tax';
     279                $this->assertFalse( taxonomy_exists( $tax ) );
     280                register_taxonomy( $tax, '', array( 'hierarchical' => true ) );
     281
     282                // Core taxonomy, users
     283                $this->assertTrue( register_taxonomy_for_object_type( 'category', 'user' ) );
     284                $this->assertTrue( unregister_taxonomy_for_object_type( 'category', 'user' ) );
     285                $this->assertFalse( unregister_taxonomy_for_object_type( 'category', 'user' ) );
     286                $this->assertTrue( register_taxonomy_for_object_type( 'category', 'user' ) );
     287
     288                // Non-core taxonomy, users
     289                $this->assertTrue( register_taxonomy_for_object_type( $tax, 'user' ) );
     290                $this->assertTrue( unregister_taxonomy_for_object_type( $tax, 'user' ) );
     291                $this->assertFalse( unregister_taxonomy_for_object_type( $tax, 'user' ) );
     292                $this->assertTrue( register_taxonomy_for_object_type( $tax, 'user' ) );
     293
     294                unset( $GLOBALS['wp_taxonomies'][ $tax ] );
     295        }
     296
     297        /**
    243298         * @ticket 32590
    244299         */
    245300        public function test_register_taxonomy_for_post_type_for_taxonomy_with_no_object_type_should_filter_out_empty_object_types() {