Version Description
- New feature: New filter hook
relevanssi_didyoumean_token
lets you filter Did you mean words before correction. You can use this filter hook to exclude words from being corrected. - Minor fix: Phrase search couldn't find phrases that include an ampersand if they matched the post title. This works now.
- Minor fix: Relevanssi now adds spaces after table cell tags to avoid table cell content sticking together in excerpts.
- Minor fix: The 'Allowable tags in excerpts' function now automatically corrects the entered value to match what Relevanssi expects the value to be.
Download this release
Release Info
Developer | msaari |
Plugin | Relevanssi – A Better Search |
Version | 4.15.2 |
Comparing to | |
See all releases |
Code changes from version 4.15.1 to 4.15.2
- lib/common.php +3 -0
- lib/didyoumean.php +16 -0
- lib/excerpts-highlights.php +10 -4
- lib/options.php +7 -1
- lib/phrases.php +6 -5
- lib/search-query-restrictions.php +7 -0
- lib/utils.php +1 -0
- readme.txt +10 -1
- relevanssi.php +2 -2
lib/common.php
CHANGED
@@ -1730,6 +1730,9 @@ function relevanssi_replace_synonyms_in_terms( array $terms ) : array {
|
|
1730 |
function ( $term ) use ( $synonyms ) {
|
1731 |
$new_term = array();
|
1732 |
foreach ( $synonyms as $pair ) {
|
|
|
|
|
|
|
1733 |
list( $key, $value ) = explode( '=', $pair );
|
1734 |
if ( $value === $term ) {
|
1735 |
$new_term[] = $key;
|
1730 |
function ( $term ) use ( $synonyms ) {
|
1731 |
$new_term = array();
|
1732 |
foreach ( $synonyms as $pair ) {
|
1733 |
+
if ( empty( $pair ) ) {
|
1734 |
+
continue;
|
1735 |
+
}
|
1736 |
list( $key, $value ) = explode( '=', $pair );
|
1737 |
if ( $value === $term ) {
|
1738 |
$new_term[] = $key;
|
lib/didyoumean.php
CHANGED
@@ -161,6 +161,22 @@ function relevanssi_simple_generate_suggestion( $query ) {
|
|
161 |
$suggestion = '';
|
162 |
|
163 |
foreach ( $tokens as $token => $count ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
$closest = '';
|
165 |
$distance = -1;
|
166 |
foreach ( $data as $row ) {
|
161 |
$suggestion = '';
|
162 |
|
163 |
foreach ( $tokens as $token => $count ) {
|
164 |
+
/**
|
165 |
+
* Filters the tokens for Did you mean suggestions.
|
166 |
+
*
|
167 |
+
* You can use this filter hook to modify the tokens before Relevanssi
|
168 |
+
* tries to come up with Did you mean suggestions for them. If you
|
169 |
+
* return an empty string, the token will be skipped and no suggestion
|
170 |
+
* will be made for the token.
|
171 |
+
*
|
172 |
+
* @param string $token An individual word from the search query.
|
173 |
+
*
|
174 |
+
* @return string The token.
|
175 |
+
*/
|
176 |
+
$token = apply_filters( 'relevanssi_didyoumean_token', trim( $token ) );
|
177 |
+
if ( ! $token ) {
|
178 |
+
continue;
|
179 |
+
}
|
180 |
$closest = '';
|
181 |
$distance = -1;
|
182 |
foreach ( $data as $row ) {
|
lib/excerpts-highlights.php
CHANGED
@@ -122,7 +122,11 @@ function relevanssi_do_excerpt( $t_post, $query, $excerpt_length = null, $excerp
|
|
122 |
|
123 |
// Add the custom field content.
|
124 |
if ( 'on' === get_option( 'relevanssi_excerpt_custom_fields' ) ) {
|
125 |
-
|
|
|
|
|
|
|
|
|
126 |
}
|
127 |
|
128 |
/**
|
@@ -992,9 +996,11 @@ function relevanssi_extract_locations( $words, $fulltext ) {
|
|
992 |
* @return int Number of times the words appear in the text.
|
993 |
*/
|
994 |
function relevanssi_count_matches( $words, $complete_text ) {
|
995 |
-
$count
|
996 |
-
$
|
997 |
-
|
|
|
|
|
998 |
|
999 |
$count_words = count( $words );
|
1000 |
for ( $t = 0; $t < $count_words; $t++ ) {
|
122 |
|
123 |
// Add the custom field content.
|
124 |
if ( 'on' === get_option( 'relevanssi_excerpt_custom_fields' ) ) {
|
125 |
+
if ( 'user' === $post->post_type && function_exists( 'relevanssi_get_user_custom_field_content' ) ) {
|
126 |
+
$content .= relevanssi_get_user_custom_field_content( $post->ID );
|
127 |
+
} else {
|
128 |
+
$content .= relevanssi_get_custom_field_content( $post->ID );
|
129 |
+
}
|
130 |
}
|
131 |
|
132 |
/**
|
996 |
* @return int Number of times the words appear in the text.
|
997 |
*/
|
998 |
function relevanssi_count_matches( $words, $complete_text ) {
|
999 |
+
$count = 0;
|
1000 |
+
$text = '';
|
1001 |
+
|
1002 |
+
// Add the space in case the match is the last word in the text.
|
1003 |
+
$lowercase_text = relevanssi_strtolower( $complete_text, 'UTF-8' ) . ' ';
|
1004 |
|
1005 |
$count_words = count( $words );
|
1006 |
for ( $t = 0; $t < $count_words; $t++ ) {
|
lib/options.php
CHANGED
@@ -80,6 +80,13 @@ function update_relevanssi_options( array $request ) {
|
|
80 |
update_option( 'relevanssi_show_matches_text', $value );
|
81 |
}
|
82 |
relevanssi_update_intval( $request, 'relevanssi_excerpt_length', true, 10 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
}
|
84 |
|
85 |
relevanssi_process_weights_and_indexing( $request );
|
@@ -99,7 +106,6 @@ function update_relevanssi_options( array $request ) {
|
|
99 |
'relevanssi_default_orderby' => true,
|
100 |
'relevanssi_disable_or_fallback' => true,
|
101 |
'relevanssi_exact_match_bonus' => true,
|
102 |
-
'relevanssi_excerpt_allowable_tags' => true,
|
103 |
'relevanssi_excerpt_custom_fields' => true,
|
104 |
'relevanssi_excerpt_type' => true,
|
105 |
'relevanssi_excerpts' => true,
|
80 |
update_option( 'relevanssi_show_matches_text', $value );
|
81 |
}
|
82 |
relevanssi_update_intval( $request, 'relevanssi_excerpt_length', true, 10 );
|
83 |
+
|
84 |
+
if ( isset( $request['relevanssi_excerpt_allowable_tags'] ) ) {
|
85 |
+
$value = $request['relevanssi_excerpt_allowable_tags'];
|
86 |
+
$value = str_replace( array( ' ', '/' ), '', $value );
|
87 |
+
$value = implode( '>', array_unique( explode( '>', $value ) ) );
|
88 |
+
update_option( 'relevanssi_excerpt_allowable_tags', $value );
|
89 |
+
}
|
90 |
}
|
91 |
|
92 |
relevanssi_process_weights_and_indexing( $request );
|
106 |
'relevanssi_default_orderby' => true,
|
107 |
'relevanssi_disable_or_fallback' => true,
|
108 |
'relevanssi_exact_match_bonus' => true,
|
|
|
109 |
'relevanssi_excerpt_custom_fields' => true,
|
110 |
'relevanssi_excerpt_type' => true,
|
111 |
'relevanssi_excerpts' => true,
|
lib/phrases.php
CHANGED
@@ -175,10 +175,11 @@ $custom_fields, string $excerpts ) : array {
|
|
175 |
$phrase_queries = array();
|
176 |
|
177 |
foreach ( $phrases as $phrase ) {
|
178 |
-
$queries
|
179 |
-
$phrase
|
180 |
-
$phrase
|
181 |
-
$
|
|
|
182 |
|
183 |
/**
|
184 |
* Filters each phrase before it's passed through esc_sql() and used in
|
@@ -198,7 +199,7 @@ $custom_fields, string $excerpts ) : array {
|
|
198 |
|
199 |
$query = "(SELECT ID FROM $wpdb->posts
|
200 |
WHERE (post_content LIKE '%$phrase%'
|
201 |
-
OR post_title LIKE '%$
|
202 |
AND post_status IN ($status))";
|
203 |
|
204 |
$queries[] = array(
|
175 |
$phrase_queries = array();
|
176 |
|
177 |
foreach ( $phrases as $phrase ) {
|
178 |
+
$queries = array();
|
179 |
+
$phrase = $wpdb->esc_like( $phrase );
|
180 |
+
$phrase = str_replace( array( '‘', '’', "'", '"', '”', '“', '“', '„', '´' ), '_', $phrase );
|
181 |
+
$title_phrase = $phrase;
|
182 |
+
$phrase = htmlspecialchars( $phrase );
|
183 |
|
184 |
/**
|
185 |
* Filters each phrase before it's passed through esc_sql() and used in
|
199 |
|
200 |
$query = "(SELECT ID FROM $wpdb->posts
|
201 |
WHERE (post_content LIKE '%$phrase%'
|
202 |
+
OR post_title LIKE '%$title_phrase%' $excerpt)
|
203 |
AND post_status IN ($status))";
|
204 |
|
205 |
$queries[] = array(
|
lib/search-query-restrictions.php
CHANGED
@@ -579,7 +579,14 @@ function relevanssi_process_post_status( $post_status ) {
|
|
579 |
}
|
580 |
|
581 |
if ( $escaped_post_status ) {
|
|
|
582 |
if ( $wp_query->is_admin || $relevanssi_admin_test ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
583 |
$query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts
|
584 |
WHERE posts.post_status IN ($escaped_post_status))))";
|
585 |
} else {
|
579 |
}
|
580 |
|
581 |
if ( $escaped_post_status ) {
|
582 |
+
$block_non_post_results = false;
|
583 |
if ( $wp_query->is_admin || $relevanssi_admin_test ) {
|
584 |
+
$block_non_post_results = true;
|
585 |
+
}
|
586 |
+
if ( $wp_query->is_admin && isset( $wp_query->query_vars['action'] ) && 'relevanssi_live_search' === $wp_query->query_vars['action'] ) {
|
587 |
+
$block_non_post_results = false;
|
588 |
+
}
|
589 |
+
if ( $block_non_post_results ) {
|
590 |
$query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts
|
591 |
WHERE posts.post_status IN ($escaped_post_status))))";
|
592 |
} else {
|
lib/utils.php
CHANGED
@@ -1075,6 +1075,7 @@ function relevanssi_strip_tags( $content ) {
|
|
1075 |
'/(<\/?hr.*?>)/',
|
1076 |
'/(<\/?li.*?>)/',
|
1077 |
'/(<img.*?>)/',
|
|
|
1078 |
);
|
1079 |
|
1080 |
$content = preg_replace( $space_tags, '$1 ', $content );
|
1075 |
'/(<\/?hr.*?>)/',
|
1076 |
'/(<\/?li.*?>)/',
|
1077 |
'/(<img.*?>)/',
|
1078 |
+
'/(<\/td>)/',
|
1079 |
);
|
1080 |
|
1081 |
$content = preg_replace( $space_tags, '$1 ', $content );
|
readme.txt
CHANGED
@@ -5,7 +5,7 @@ Tags: search, relevance, better search, product search, woocommerce search
|
|
5 |
Requires at least: 4.9
|
6 |
Tested up to: 5.9
|
7 |
Requires PHP: 7.0
|
8 |
-
Stable tag: 4.15.
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
@@ -128,6 +128,12 @@ Each document database is full of useless words. All the little words that appea
|
|
128 |
* John Calahan for extensive 4.0 beta testing.
|
129 |
|
130 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
131 |
= 4.15.1 =
|
132 |
* Changed behaviour: Relevanssi now ignores WordPress metadata custom fields that aren't interesting for Relevanssi indexing.
|
133 |
* Changed behaviour: Both `relevanssi_get_permalink()` and `relevanssi_the_permalink()` now can take post ID or a post object as a parameter and can thus be used outside the Loop.
|
@@ -146,6 +152,9 @@ Each document database is full of useless words. All the little words that appea
|
|
146 |
* Minor fix: The Bricks compatibility was improved, Relevanssi now notices changes to Bricks posts more often. Relevanssi also only reads the text from the `_bricks_page_content_2` custom field.
|
147 |
|
148 |
== Upgrade notice ==
|
|
|
|
|
|
|
149 |
= 4.15.1 =
|
150 |
* Fixes warnings, improves permalink functions and relevanssi_hits_filter.
|
151 |
|
5 |
Requires at least: 4.9
|
6 |
Tested up to: 5.9
|
7 |
Requires PHP: 7.0
|
8 |
+
Stable tag: 4.15.2
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
128 |
* John Calahan for extensive 4.0 beta testing.
|
129 |
|
130 |
== Changelog ==
|
131 |
+
= 4.15.2 =
|
132 |
+
* New feature: New filter hook `relevanssi_didyoumean_token` lets you filter Did you mean words before correction. You can use this filter hook to exclude words from being corrected.
|
133 |
+
* Minor fix: Phrase search couldn't find phrases that include an ampersand if they matched the post title. This works now.
|
134 |
+
* Minor fix: Relevanssi now adds spaces after table cell tags to avoid table cell content sticking together in excerpts.
|
135 |
+
* Minor fix: The 'Allowable tags in excerpts' function now automatically corrects the entered value to match what Relevanssi expects the value to be.
|
136 |
+
|
137 |
= 4.15.1 =
|
138 |
* Changed behaviour: Relevanssi now ignores WordPress metadata custom fields that aren't interesting for Relevanssi indexing.
|
139 |
* Changed behaviour: Both `relevanssi_get_permalink()` and `relevanssi_the_permalink()` now can take post ID or a post object as a parameter and can thus be used outside the Loop.
|
152 |
* Minor fix: The Bricks compatibility was improved, Relevanssi now notices changes to Bricks posts more often. Relevanssi also only reads the text from the `_bricks_page_content_2` custom field.
|
153 |
|
154 |
== Upgrade notice ==
|
155 |
+
= 4.15.2 =
|
156 |
+
* New filter hook for Did you mean words, small bug fixes for excerpts and phrases.
|
157 |
+
|
158 |
= 4.15.1 =
|
159 |
* Fixes warnings, improves permalink functions and relevanssi_hits_filter.
|
160 |
|
relevanssi.php
CHANGED
@@ -13,7 +13,7 @@
|
|
13 |
* Plugin Name: Relevanssi
|
14 |
* Plugin URI: https://www.relevanssi.com/
|
15 |
* Description: This plugin replaces WordPress search with a relevance-sorting search.
|
16 |
-
* Version: 4.15.
|
17 |
* Author: Mikko Saari
|
18 |
* Author URI: http://www.mikkosaari.fi/
|
19 |
* Text Domain: relevanssi
|
@@ -67,7 +67,7 @@ $relevanssi_variables['database_version'] = 6;
|
|
67 |
$relevanssi_variables['file'] = __FILE__;
|
68 |
$relevanssi_variables['plugin_dir'] = plugin_dir_path( __FILE__ );
|
69 |
$relevanssi_variables['plugin_basename'] = plugin_basename( __FILE__ );
|
70 |
-
$relevanssi_variables['plugin_version'] = '4.15.
|
71 |
|
72 |
require_once 'lib/admin-ajax.php';
|
73 |
require_once 'lib/common.php';
|
13 |
* Plugin Name: Relevanssi
|
14 |
* Plugin URI: https://www.relevanssi.com/
|
15 |
* Description: This plugin replaces WordPress search with a relevance-sorting search.
|
16 |
+
* Version: 4.15.2
|
17 |
* Author: Mikko Saari
|
18 |
* Author URI: http://www.mikkosaari.fi/
|
19 |
* Text Domain: relevanssi
|
67 |
$relevanssi_variables['file'] = __FILE__;
|
68 |
$relevanssi_variables['plugin_dir'] = plugin_dir_path( __FILE__ );
|
69 |
$relevanssi_variables['plugin_basename'] = plugin_basename( __FILE__ );
|
70 |
+
$relevanssi_variables['plugin_version'] = '4.15.2';
|
71 |
|
72 |
require_once 'lib/admin-ajax.php';
|
73 |
require_once 'lib/common.php';
|