WordPress.org

Make WordPress Core

Changeset 37735


Ignore:
Timestamp:
06/16/16 23:08:30 (9 months ago)
Author:
jeremyfelt
Message:

Multisite: Add search column support to WP_Site_Query.

domain and/or path can be used to specify which column(s) should be searched.

See #35791.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-site-query.php

    r37477 r37735  
    142142     *     @type int          $deleted           Limit results to deleted sites. Accepts '1' or '0'. Default empty. 
    143143     *     @type string       $search            Search term(s) to retrieve matching sites for. Default empty. 
     144     *     @type array        $search_columns    Array of column names to be searched. Accepts 'domain' and 'path'. 
     145     *                                           Default empty array. 
    144146     *     @type bool         $update_site_cache Whether to prime the cache for found sites. Default false. 
    145147     * } 
     
    171173            'deleted'           => null, 
    172174            'search'            => '', 
     175            'search_columns'    => array(), 
    173176            'count'             => false, 
    174177            'date_query'        => null, // See WP_Date_Query 
     
    482485        // Falsey search strings are ignored. 
    483486        if ( strlen( $this->query_vars['search'] ) ) { 
    484             $this->sql_clauses['where']['search'] = $this->get_search_sql( 
    485                 $this->query_vars['search'], 
    486                 array( 'domain', 'path' ) 
    487             ); 
     487            $search_columns = array(); 
     488 
     489            if ( $this->query_vars['search_columns'] ) { 
     490                $search_columns = array_intersect( $this->query_vars['search_columns'], array( 'domain', 'path' ) ); 
     491            } 
     492 
     493            if ( ! $search_columns ) { 
     494                $search_columns = array( 'domain', 'path' ); 
     495            } 
     496 
     497            /** 
     498             * Filters the columns to search in a WP_Site_Query search. 
     499             * 
     500             * The default columns include 'domain' and 'path. 
     501             * 
     502             * @since 4.6.0 
     503             * 
     504             * @param array         $search_columns Array of column names to be searched. 
     505             * @param string        $search         Text being searched. 
     506             * @param WP_Site_Query $this           The current WP_Site_Query instance. 
     507             */ 
     508            $search_columns = apply_filters( 'site_search_columns', $search_columns, $this->query_vars['search'], $this ); 
     509 
     510            $this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], $search_columns ); 
    488511        } 
    489512 
     
    564587        global $wpdb; 
    565588 
    566         $like = '%' . $wpdb->esc_like( $string ) . '%'; 
     589        if ( false !== strpos( $string, '*' ) ) { 
     590            $like = '%' . implode( '%', array_map( array( $wpdb, 'esc_like' ), explode( '*', $string ) ) ) . '%'; 
     591        } else { 
     592            $like = '%' . $wpdb->esc_like( $string ) . '%'; 
     593        } 
    567594 
    568595        $searches = array(); 
  • trunk/tests/phpunit/tests/multisite/siteQuery.php

    r37477 r37735  
    471471        $this->assertEquals( $expected, $found ); 
    472472    } 
     473 
     474    public function test_wp_site_query_by_search_with_text_in_path_exclude_domain_from_search() { 
     475        $q = new WP_Site_Query(); 
     476        $found = $q->query( array( 
     477            'fields' => 'ids', 
     478            'search' => 'make', 
     479            'search_columns' => array( 'path' ), 
     480        ) ); 
     481 
     482        $expected = array( 
     483            self::$site_ids['www.w.org/make/'], 
     484        ); 
     485 
     486        $this->assertEquals( $expected, $found ); 
     487    } 
     488 
     489    public function test_wp_site_query_by_search_with_text_in_domain_exclude_path_from_search() { 
     490        $q = new WP_Site_Query(); 
     491        $found = $q->query( array( 
     492            'fields' => 'ids', 
     493            'search' => 'make', 
     494            'search_columns' => array( 'domain' ), 
     495        ) ); 
     496 
     497        $expected = array( 
     498            self::$site_ids['make.wordpress.org/'], 
     499            self::$site_ids['make.wordpress.org/foo/'], 
     500        ); 
     501 
     502        $this->assertEquals( $expected, $found ); 
     503    } 
     504 
     505    public function test_wp_site_query_by_search_with_wildcard_in_text() { 
     506        $q = new WP_Site_Query(); 
     507        $found = $q->query( array( 
     508            'fields'       => 'ids', 
     509            'search'       => 'm*ke', 
     510        ) ); 
     511 
     512        $expected = array( 
     513            self::$site_ids['www.w.org/make/'], 
     514            self::$site_ids['make.wordpress.org/'], 
     515            self::$site_ids['make.wordpress.org/foo/'], 
     516        ); 
     517 
     518        $this->assertEqualSets( $expected, $found ); 
     519    } 
     520 
     521    public function test_wp_site_query_by_search_with_wildcard_in_text_exclude_path_from_search() { 
     522        $q = new WP_Site_Query(); 
     523        $found = $q->query( array( 
     524            'fields' => 'ids', 
     525            'search' => 'm*ke', 
     526            'search_columns' => array( 'domain' ), 
     527        ) ); 
     528 
     529        $expected = array( 
     530            self::$site_ids['make.wordpress.org/'], 
     531            self::$site_ids['make.wordpress.org/foo/'], 
     532        ); 
     533 
     534        $this->assertEqualSets( $expected, $found ); 
     535    } 
     536 
     537    public function test_wp_site_query_by_search_with_wildcard_in_text_exclude_domain_from_search() { 
     538        $q = new WP_Site_Query(); 
     539        $found = $q->query( array( 
     540            'fields' => 'ids', 
     541            'search' => 'm*ke', 
     542            'search_columns' => array( 'path' ), 
     543        ) ); 
     544 
     545        $expected = array( 
     546            self::$site_ids['www.w.org/make/'], 
     547        ); 
     548 
     549        $this->assertEqualSets( $expected, $found ); 
     550    } 
    473551} 
    474552 
Note: See TracChangeset for help on using the changeset viewer.