Ticket #38099: 38099.6.patch
File 38099.6.patch, 4.3 KB (added by , 7 years ago) |
---|
-
src/wp-includes/class-wp-query.php
722 722 * @type string $s Search keyword(s). Prepending a term with a hyphen will 723 723 * exclude posts matching that term. Eg, 'pillow -sofa' will 724 724 * return posts containing 'pillow' but not 'sofa'. This feature 725 * can be disabled using the 726 * 'wp_query_use_hyphen_for_exclusion' filter. 725 * can be altered with the 'wp_query_search_exclusion_prefix' filter. 727 726 * @type int $second Second of the minute. Default empty. Accepts numbers 0-60. 728 727 * @type bool $sentence Whether to search by phrase. Default false. 729 728 * @type bool $suppress_filters Whether to suppress filters. Default false. … … 1322 1321 $q['search_orderby_title'] = array(); 1323 1322 1324 1323 /** 1325 * Filters whether search terms preceded by hyphens shouldexcluded from results.1324 * Filters the prefix denoting that a search term should be excluded from results. 1326 1325 * 1327 1326 * @since 4.7.0 1328 1327 * 1329 * @param bool Whether the query should exclude terms preceded with a hyphen. 1328 * @param string $exclusion_prefix The prefix. Default hyphen. Returning 1329 * an empty value disables exclusions. 1330 1330 */ 1331 $ hyphen_exclusion = apply_filters( 'wp_query_use_hyphen_for_exclusion', true);1331 $exclusion_prefix = apply_filters( 'wp_query_search_exclusion_prefix', '-' ); 1332 1332 1333 1333 foreach ( $q['search_terms'] as $term ) { 1334 // Terms prefixed with '-'should be excluded.1335 $include = '-' !== substr( $term, 0, 1);1336 if ( $include || ! $hyphen_exclusion) {1334 // If there is an $exclusion_prefix, terms prefixed with it should be excluded. 1335 $include = ( ! $exclusion_prefix || ( substr( $term, 0, 1 ) !== $exclusion_prefix ) ); 1336 if ( $include ) { 1337 1337 $like_op = 'LIKE'; 1338 1338 $andor_op = 'OR'; 1339 1339 } else { -
tests/phpunit/tests/query/search.php
62 62 /** 63 63 * @ticket 38099 64 64 */ 65 function test_ filter_wp_query_use_hyphen_for_exclusion() {65 function test_disable_search_exclusion_prefix() { 66 66 $title = '-HYPHENATION_TEST'; 67 67 68 68 // Create a post with a title which starts with a hyphen … … 74 74 $this->assertEquals( array(), $this->get_search_results( $title ) ); 75 75 76 76 // After we disable the feature using the filter, we should get the result 77 add_filter( 'wp_query_ use_hyphen_for_exclusion', '__return_false' );77 add_filter( 'wp_query_search_exclusion_prefix', '__return_false' ); 78 78 $result = $this->get_search_results( $title ); 79 79 $post = array_pop( $result ); 80 80 $this->assertEquals( $post->ID, $post_id ); 81 remove_filter( 'wp_query_ use_hyphen_for_exclusion', '__return_false' );81 remove_filter( 'wp_query_search_exclusion_prefix', '__return_false' ); 82 82 } 83 83 84 84 /** 85 * @ticket 38099 86 */ 87 function test_change_search_exclusion_prefix() { 88 $title = '#OCTOTHORPE_TEST'; 89 90 // Create a post with a title that starts with a non-hyphen prefix. 91 $post_id = self::factory()->post->create( array( 92 'post_content' => $title, 'post_type' => $this->post_type 93 ) ); 94 95 // By default, we should get the result. 96 $result = $this->get_search_results( $title ); 97 $post = array_pop( $result ); 98 $this->assertEquals( $post->ID, $post_id ); 99 100 // After we change the prefix, the result should be excluded. 101 add_filter( 'wp_query_search_exclusion_prefix', array( $this, 'filter_search_exclusion_prefix_octothorpe' ) ); 102 $this->assertEquals( array(), $this->get_search_results( $title ) ); 103 remove_filter( 'wp_query_search_exclusion_prefix', array( $this, 'filter_search_exclusion_prefix_octothorpe' ) ); 104 } 105 106 function filter_search_exclusion_prefix_octothorpe() { 107 return '#'; 108 } 109 110 /** 85 111 * @ticket 33988 86 112 */ 87 113 public function test_s_should_exclude_term_prefixed_with_dash() {