Version Description
- Changed behaviour: Relevanssi now ignores WordPress metadata custom fields that aren't interesting for Relevanssi indexing.
- Changed behaviour: Both
relevanssi_get_permalink()
andrelevanssi_the_permalink()
now can take post ID or a post object as a parameter and can thus be used outside the Loop. - Changed behaviour: The
relevanssi_hits_filter
hook now gets the WP_Query object as the second parameter. - Minor fix: Avoid error messages for missing
mysqlcolumn_matches
array key.
Download this release
Release Info
Developer | msaari |
Plugin | Relevanssi – A Better Search |
Version | 4.15.1 |
Comparing to | |
See all releases |
Code changes from version 4.16.0 to 4.15.1
- lib/class-relevanssi-taxonomy-walker.php +4 -4
- lib/common.php +1 -5
- lib/compatibility/oxygen.php +6 -77
- lib/didyoumean.php +0 -16
- lib/excerpts-highlights.php +4 -10
- lib/init.php +0 -1
- lib/options.php +1 -7
- lib/phrases.php +6 -7
- lib/search-query-restrictions.php +0 -7
- lib/utils.php +3 -84
- readme.txt +7 -19
- relevanssi.php +2 -2
lib/class-relevanssi-taxonomy-walker.php
CHANGED
@@ -57,18 +57,18 @@ class Relevanssi_Taxonomy_Walker extends Walker_Category_Checklist {
|
|
57 |
$aria_checked = 'false';
|
58 |
$inner_class = 'category';
|
59 |
|
|
|
60 |
$output .= "\n" . '<li' . $class . '>' .
|
61 |
'<div class="' . $inner_class . '" data-term-id=' . $category->term_id .
|
62 |
' tabindex="0" role="checkbox" aria-checked="' . $aria_checked . '">' .
|
63 |
-
|
64 |
-
esc_html( apply_filters( 'the_category', $category->name, '', '' ) ) . '</div>';
|
65 |
} else {
|
|
|
66 |
$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" .
|
67 |
'<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="' . $name . '[]" id="in-' . $taxonomy . '-' . $category->term_id . '"' .
|
68 |
checked( in_array( intval( $category->term_id ), $args['selected_cats'], true ), true, false ) .
|
69 |
disabled( empty( $args['disabled'] ), false, false ) . ' /> ' .
|
70 |
-
|
71 |
-
esc_html( apply_filters( 'the_category', $category->name, '', '' ) ) . '</label>';
|
72 |
}
|
73 |
}
|
74 |
}
|
57 |
$aria_checked = 'false';
|
58 |
$inner_class = 'category';
|
59 |
|
60 |
+
/** This filter is documented in wp-includes/category-template.php */
|
61 |
$output .= "\n" . '<li' . $class . '>' .
|
62 |
'<div class="' . $inner_class . '" data-term-id=' . $category->term_id .
|
63 |
' tabindex="0" role="checkbox" aria-checked="' . $aria_checked . '">' .
|
64 |
+
esc_html( apply_filters( 'the_category', $category->name ) ) . '</div>';
|
|
|
65 |
} else {
|
66 |
+
/** This filter is documented in wp-includes/category-template.php */
|
67 |
$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" .
|
68 |
'<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="' . $name . '[]" id="in-' . $taxonomy . '-' . $category->term_id . '"' .
|
69 |
checked( in_array( intval( $category->term_id ), $args['selected_cats'], true ), true, false ) .
|
70 |
disabled( empty( $args['disabled'] ), false, false ) . ' /> ' .
|
71 |
+
esc_html( apply_filters( 'the_category', $category->name ) ) . '</label>';
|
|
|
72 |
}
|
73 |
}
|
74 |
}
|
lib/common.php
CHANGED
@@ -224,7 +224,7 @@ function relevanssi_default_post_ok( $post_ok, $post_id ) {
|
|
224 |
apply_filters( 'relevanssi_valid_admin_status', array( 'draft', 'pending', 'future' ) ),
|
225 |
true
|
226 |
)
|
227 |
-
&& is_admin()
|
228 |
// Only show drafts, pending and future posts in admin search.
|
229 |
$post_ok = true;
|
230 |
}
|
@@ -1226,7 +1226,6 @@ function relevanssi_get_forbidden_post_types() {
|
|
1226 |
'astra_adv_header', // Astra.
|
1227 |
'udb_widgets', // Ultimate Dashboard.
|
1228 |
'udb_admin_page', // Ultimate Dashboard.
|
1229 |
-
'oxy_user_library', // Oxygen.
|
1230 |
);
|
1231 |
}
|
1232 |
|
@@ -1731,9 +1730,6 @@ function relevanssi_replace_synonyms_in_terms( array $terms ) : array {
|
|
1731 |
function ( $term ) use ( $synonyms ) {
|
1732 |
$new_term = array();
|
1733 |
foreach ( $synonyms as $pair ) {
|
1734 |
-
if ( empty( $pair ) ) {
|
1735 |
-
continue;
|
1736 |
-
}
|
1737 |
list( $key, $value ) = explode( '=', $pair );
|
1738 |
if ( $value === $term ) {
|
1739 |
$new_term[] = $key;
|
224 |
apply_filters( 'relevanssi_valid_admin_status', array( 'draft', 'pending', 'future' ) ),
|
225 |
true
|
226 |
)
|
227 |
+
&& is_admin() ) {
|
228 |
// Only show drafts, pending and future posts in admin search.
|
229 |
$post_ok = true;
|
230 |
}
|
1226 |
'astra_adv_header', // Astra.
|
1227 |
'udb_widgets', // Ultimate Dashboard.
|
1228 |
'udb_admin_page', // Ultimate Dashboard.
|
|
|
1229 |
);
|
1230 |
}
|
1231 |
|
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;
|
lib/compatibility/oxygen.php
CHANGED
@@ -35,23 +35,6 @@ add_action( 'save_post', 'relevanssi_insert_edit', 99, 1 );
|
|
35 |
* @return array|null An array of custom field values, null if no value exists.
|
36 |
*/
|
37 |
function relevanssi_oxygen_compatibility( $value, $field, $post_id ) {
|
38 |
-
if ( 'ct_builder_json' === $field ) {
|
39 |
-
$json = array();
|
40 |
-
foreach ( $value as $row ) {
|
41 |
-
$json[] = json_decode( $row );
|
42 |
-
}
|
43 |
-
|
44 |
-
$content = '';
|
45 |
-
if ( isset( $json[0]->children ) ) {
|
46 |
-
foreach ( $json[0]->children as $child ) {
|
47 |
-
$content .= relevanssi_process_oxygen_child( $child );
|
48 |
-
}
|
49 |
-
}
|
50 |
-
|
51 |
-
$value[0] = $content;
|
52 |
-
return $value;
|
53 |
-
}
|
54 |
-
|
55 |
if ( 'ct_builder_shortcodes_revisions_dates' === $field ) {
|
56 |
return '';
|
57 |
}
|
@@ -59,9 +42,6 @@ function relevanssi_oxygen_compatibility( $value, $field, $post_id ) {
|
|
59 |
return '';
|
60 |
}
|
61 |
if ( 'ct_builder_shortcodes' === $field ) {
|
62 |
-
if ( version_compare( CT_VERSION, '4.0', '>=' ) ) {
|
63 |
-
return null;
|
64 |
-
}
|
65 |
if ( empty( $value ) ) {
|
66 |
return null;
|
67 |
}
|
@@ -138,66 +118,18 @@ function relevanssi_oxygen_compatibility( $value, $field, $post_id ) {
|
|
138 |
}
|
139 |
|
140 |
/**
|
141 |
-
*
|
142 |
-
*
|
143 |
-
* This function extracts all the ct_content data from the JSON. All elements
|
144 |
-
* are run through the relevanssi_oxygen_element filter hook. You can use that
|
145 |
-
* filter hook to modify or to eliminate elements from the JSON.
|
146 |
-
*
|
147 |
-
* @param array $child The child element array.
|
148 |
-
*
|
149 |
-
* @return string The content from the child and the grandchildren.
|
150 |
-
*/
|
151 |
-
function relevanssi_process_oxygen_child( $child ) : string {
|
152 |
-
/**
|
153 |
-
* Filters the Oxygen JSON child element.
|
154 |
-
*
|
155 |
-
* If the filter returns an empty value, the child element and all its
|
156 |
-
* children will be ignored.
|
157 |
-
*
|
158 |
-
* @param array $child The JSON child element.
|
159 |
-
*/
|
160 |
-
$child = apply_filters( 'relevanssi_oxygen_element', $child );
|
161 |
-
if ( empty( $child ) ) {
|
162 |
-
return '';
|
163 |
-
}
|
164 |
-
|
165 |
-
$child_content = ' ';
|
166 |
-
if ( isset( $child->options->ct_content ) ) {
|
167 |
-
$child_content .= $child->options->ct_content;
|
168 |
-
}
|
169 |
-
|
170 |
-
if ( isset( $child->options->original->{'code-php'} ) ) {
|
171 |
-
// For code and HTML blocks, strip all tags.
|
172 |
-
$child_content .= wp_strip_all_tags( $child->options->original->{'code-php'} );
|
173 |
-
}
|
174 |
-
|
175 |
-
if ( isset( $child->children ) ) {
|
176 |
-
foreach ( $child->children as $grandchild ) {
|
177 |
-
$child_content .= relevanssi_process_oxygen_child( $grandchild );
|
178 |
-
}
|
179 |
-
}
|
180 |
-
|
181 |
-
return $child_content;
|
182 |
-
}
|
183 |
-
|
184 |
-
/**
|
185 |
-
* Adds the Oxygen custom field to the list of indexed custom fields.
|
186 |
*
|
187 |
* @param array|boolean $fields An array of custom fields to index, or false.
|
188 |
*
|
189 |
-
* @return array An array of custom fields, including `
|
190 |
-
* `ct_builder_shortcodes`.
|
191 |
*/
|
192 |
function relevanssi_add_oxygen( $fields ) {
|
193 |
-
$oxygen_field = version_compare( CT_VERSION, '4.0', '>=' )
|
194 |
-
? 'ct_builder_json'
|
195 |
-
: 'ct_builder_shortcodes';
|
196 |
if ( ! is_array( $fields ) ) {
|
197 |
$fields = array();
|
198 |
}
|
199 |
-
if ( ! in_array(
|
200 |
-
$fields[] =
|
201 |
}
|
202 |
|
203 |
return $fields;
|
@@ -211,14 +143,11 @@ function relevanssi_add_oxygen( $fields ) {
|
|
211 |
* is ignored, Relevanssi disables this filter and then checks the option to
|
212 |
* see what the value is.
|
213 |
*
|
214 |
-
* @return string If value is undefined, it's set to '
|
215 |
-
* 'ct_builder_shortcodes'.
|
216 |
*/
|
217 |
function relevanssi_oxygen_fix_none_setting( $value ) {
|
218 |
if ( ! $value ) {
|
219 |
-
$value =
|
220 |
-
? 'ct_builder_json'
|
221 |
-
: 'ct_builder_shortcodes';
|
222 |
}
|
223 |
|
224 |
return $value;
|
35 |
* @return array|null An array of custom field values, null if no value exists.
|
36 |
*/
|
37 |
function relevanssi_oxygen_compatibility( $value, $field, $post_id ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
if ( 'ct_builder_shortcodes_revisions_dates' === $field ) {
|
39 |
return '';
|
40 |
}
|
42 |
return '';
|
43 |
}
|
44 |
if ( 'ct_builder_shortcodes' === $field ) {
|
|
|
|
|
|
|
45 |
if ( empty( $value ) ) {
|
46 |
return null;
|
47 |
}
|
118 |
}
|
119 |
|
120 |
/**
|
121 |
+
* Adds the `ct_builder_shortcodes` to the list of indexed custom fields.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
*
|
123 |
* @param array|boolean $fields An array of custom fields to index, or false.
|
124 |
*
|
125 |
+
* @return array An array of custom fields, including `ct_builder_shortcodes`.
|
|
|
126 |
*/
|
127 |
function relevanssi_add_oxygen( $fields ) {
|
|
|
|
|
|
|
128 |
if ( ! is_array( $fields ) ) {
|
129 |
$fields = array();
|
130 |
}
|
131 |
+
if ( ! in_array( 'ct_builder_shortcodes', $fields, true ) ) {
|
132 |
+
$fields[] = 'ct_builder_shortcodes';
|
133 |
}
|
134 |
|
135 |
return $fields;
|
143 |
* is ignored, Relevanssi disables this filter and then checks the option to
|
144 |
* see what the value is.
|
145 |
*
|
146 |
+
* @return string If value is undefined, it's set to 'ct_builder_shortcodes'.
|
|
|
147 |
*/
|
148 |
function relevanssi_oxygen_fix_none_setting( $value ) {
|
149 |
if ( ! $value ) {
|
150 |
+
$value = 'ct_builder_shortcodes';
|
|
|
|
|
151 |
}
|
152 |
|
153 |
return $value;
|
lib/didyoumean.php
CHANGED
@@ -161,22 +161,6 @@ function relevanssi_simple_generate_suggestion( $query ) {
|
|
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 ) {
|
161 |
$suggestion = '';
|
162 |
|
163 |
foreach ( $tokens as $token => $count ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
$closest = '';
|
165 |
$distance = -1;
|
166 |
foreach ( $data as $row ) {
|
lib/excerpts-highlights.php
CHANGED
@@ -122,11 +122,7 @@ 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 |
-
$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,11 +992,9 @@ function relevanssi_extract_locations( $words, $fulltext ) {
|
|
996 |
* @return int Number of times the words appear in the text.
|
997 |
*/
|
998 |
function relevanssi_count_matches( $words, $complete_text ) {
|
999 |
-
$count
|
1000 |
-
$
|
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++ ) {
|
122 |
|
123 |
// Add the custom field content.
|
124 |
if ( 'on' === get_option( 'relevanssi_excerpt_custom_fields' ) ) {
|
125 |
+
$content .= relevanssi_get_custom_field_content( $post->ID );
|
|
|
|
|
|
|
|
|
126 |
}
|
127 |
|
128 |
/**
|
992 |
* @return int Number of times the words appear in the text.
|
993 |
*/
|
994 |
function relevanssi_count_matches( $words, $complete_text ) {
|
995 |
+
$count = 0;
|
996 |
+
$lowercase_text = relevanssi_strtolower( $complete_text, 'UTF-8' );
|
997 |
+
$text = '';
|
|
|
|
|
998 |
|
999 |
$count_words = count( $words );
|
1000 |
for ( $t = 0; $t < $count_words; $t++ ) {
|
lib/init.php
CHANGED
@@ -43,7 +43,6 @@ add_action( 'edit_attachment', 'relevanssi_insert_edit' );
|
|
43 |
add_action( 'transition_post_status', 'relevanssi_update_child_posts', 99, 3 );
|
44 |
|
45 |
// Relevanssi features.
|
46 |
-
add_filter( 'relevanssi_remove_punctuation', 'remove_accents', 9 );
|
47 |
add_filter( 'relevanssi_remove_punctuation', 'relevanssi_remove_punct' );
|
48 |
add_filter( 'relevanssi_post_ok', 'relevanssi_default_post_ok', 9, 2 );
|
49 |
add_filter( 'relevanssi_query_filter', 'relevanssi_limit_filter' );
|
43 |
add_action( 'transition_post_status', 'relevanssi_update_child_posts', 99, 3 );
|
44 |
|
45 |
// Relevanssi features.
|
|
|
46 |
add_filter( 'relevanssi_remove_punctuation', 'relevanssi_remove_punct' );
|
47 |
add_filter( 'relevanssi_post_ok', 'relevanssi_default_post_ok', 9, 2 );
|
48 |
add_filter( 'relevanssi_query_filter', 'relevanssi_limit_filter' );
|
lib/options.php
CHANGED
@@ -80,13 +80,6 @@ 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 |
-
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,6 +99,7 @@ function update_relevanssi_options( array $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,
|
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 |
'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,
|
lib/phrases.php
CHANGED
@@ -48,7 +48,7 @@ function relevanssi_extract_phrases( string $query ) {
|
|
48 |
$phrase = trim( $phrase );
|
49 |
|
50 |
// Do not count single-word phrases as phrases.
|
51 |
-
if (
|
52 |
$phrases[] = $phrase;
|
53 |
}
|
54 |
$pos = $end + 1;
|
@@ -175,11 +175,10 @@ $custom_fields, string $excerpts ) : array {
|
|
175 |
$phrase_queries = array();
|
176 |
|
177 |
foreach ( $phrases as $phrase ) {
|
178 |
-
$queries
|
179 |
-
$phrase
|
180 |
-
$phrase
|
181 |
-
$
|
182 |
-
$phrase = htmlspecialchars( $phrase );
|
183 |
|
184 |
/**
|
185 |
* Filters each phrase before it's passed through esc_sql() and used in
|
@@ -199,7 +198,7 @@ $custom_fields, string $excerpts ) : array {
|
|
199 |
|
200 |
$query = "(SELECT ID FROM $wpdb->posts
|
201 |
WHERE (post_content LIKE '%$phrase%'
|
202 |
-
OR post_title LIKE '%$
|
203 |
AND post_status IN ($status))";
|
204 |
|
205 |
$queries[] = array(
|
48 |
$phrase = trim( $phrase );
|
49 |
|
50 |
// Do not count single-word phrases as phrases.
|
51 |
+
if ( ! empty( $phrase ) && count( explode( ' ', $phrase ) ) > 1 ) {
|
52 |
$phrases[] = $phrase;
|
53 |
}
|
54 |
$pos = $end + 1;
|
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 |
+
$phrase = htmlspecialchars( $phrase );
|
|
|
182 |
|
183 |
/**
|
184 |
* Filters each phrase before it's passed through esc_sql() and used in
|
198 |
|
199 |
$query = "(SELECT ID FROM $wpdb->posts
|
200 |
WHERE (post_content LIKE '%$phrase%'
|
201 |
+
OR post_title LIKE '%$phrase%' $excerpt)
|
202 |
AND post_status IN ($status))";
|
203 |
|
204 |
$queries[] = array(
|
lib/search-query-restrictions.php
CHANGED
@@ -579,14 +579,7 @@ function relevanssi_process_post_status( $post_status ) {
|
|
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 {
|
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 {
|
lib/utils.php
CHANGED
@@ -698,85 +698,6 @@ function relevanssi_intval( array $request, string $option ) {
|
|
698 |
return null;
|
699 |
}
|
700 |
|
701 |
-
/**
|
702 |
-
* Returns true if the search is from Relevanssi Live Ajax Search.
|
703 |
-
*
|
704 |
-
* Checks if $wp_query->query_vars['action'] is set to "relevanssi_live_search".
|
705 |
-
*
|
706 |
-
* @return bool True if the search is from Relevanssi Live Ajax Search, false
|
707 |
-
* otherwise.
|
708 |
-
*/
|
709 |
-
function relevanssi_is_live_search() {
|
710 |
-
global $wp_query;
|
711 |
-
$relevanssi_live_search = false;
|
712 |
-
if ( isset( $wp_query->query_vars['action'] ) && 'relevanssi_live_search' === $wp_query->query_vars['action'] ) {
|
713 |
-
$relevanssi_live_search = true;
|
714 |
-
}
|
715 |
-
return $relevanssi_live_search;
|
716 |
-
}
|
717 |
-
|
718 |
-
/**
|
719 |
-
* Checks if a string is a multiple-word phrase.
|
720 |
-
*
|
721 |
-
* Replaces hyphens, quotes and ampersands with spaces if necessary based on
|
722 |
-
* the Relevanssi advanced indexing settings.
|
723 |
-
*
|
724 |
-
* @param string $string The string to check.
|
725 |
-
*
|
726 |
-
* @return boolean True if the string is a multiple-word phrase, false otherwise.
|
727 |
-
*/
|
728 |
-
function relevanssi_is_multiple_words( string $string ) : bool {
|
729 |
-
if ( empty( $string ) ) {
|
730 |
-
return false;
|
731 |
-
}
|
732 |
-
$punctuation = get_option( 'relevanssi_punctuation' );
|
733 |
-
if ( 'replace' === $punctuation['hyphens'] ) {
|
734 |
-
$string = str_replace(
|
735 |
-
array(
|
736 |
-
'-',
|
737 |
-
'–',
|
738 |
-
'—',
|
739 |
-
),
|
740 |
-
' ',
|
741 |
-
$string
|
742 |
-
);
|
743 |
-
}
|
744 |
-
if ( 'replace' === $punctuation['quotes'] ) {
|
745 |
-
$string = str_replace(
|
746 |
-
array(
|
747 |
-
'’',
|
748 |
-
"'",
|
749 |
-
'’',
|
750 |
-
'‘',
|
751 |
-
'”',
|
752 |
-
'“',
|
753 |
-
'„',
|
754 |
-
'´',
|
755 |
-
'″',
|
756 |
-
),
|
757 |
-
' ',
|
758 |
-
$string
|
759 |
-
);
|
760 |
-
}
|
761 |
-
if ( 'replace' === $punctuation['ampersands'] ) {
|
762 |
-
$string = str_replace(
|
763 |
-
array(
|
764 |
-
'&',
|
765 |
-
'&',
|
766 |
-
'&',
|
767 |
-
),
|
768 |
-
' ',
|
769 |
-
$string
|
770 |
-
);
|
771 |
-
}
|
772 |
-
|
773 |
-
if ( count( explode( ' ', $string ) ) > 1 ) {
|
774 |
-
return true;
|
775 |
-
}
|
776 |
-
|
777 |
-
return false;
|
778 |
-
}
|
779 |
-
|
780 |
/**
|
781 |
* Launches an asynchronous Ajax action.
|
782 |
*
|
@@ -1086,10 +1007,9 @@ function relevanssi_strip_all_tags( $content ) : string {
|
|
1086 |
if ( ! is_string( $content ) ) {
|
1087 |
$content = '';
|
1088 |
}
|
1089 |
-
$content = preg_replace( '/<!--.*?-->/
|
1090 |
-
$content = preg_replace( '/<[!a-zA-Z\/][^>].*?>/
|
1091 |
-
|
1092 |
-
return $content ?? '';
|
1093 |
}
|
1094 |
|
1095 |
/**
|
@@ -1155,7 +1075,6 @@ function relevanssi_strip_tags( $content ) {
|
|
1155 |
'/(<\/?hr.*?>)/',
|
1156 |
'/(<\/?li.*?>)/',
|
1157 |
'/(<img.*?>)/',
|
1158 |
-
'/(<\/td>)/',
|
1159 |
);
|
1160 |
|
1161 |
$content = preg_replace( $space_tags, '$1 ', $content );
|
698 |
return null;
|
699 |
}
|
700 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
701 |
/**
|
702 |
* Launches an asynchronous Ajax action.
|
703 |
*
|
1007 |
if ( ! is_string( $content ) ) {
|
1008 |
$content = '';
|
1009 |
}
|
1010 |
+
$content = preg_replace( '/<!--.*?-->/ms', '', $content );
|
1011 |
+
$content = preg_replace( '/<[!a-zA-Z\/][^>].*?>/ms', ' ', $content );
|
1012 |
+
return $content;
|
|
|
1013 |
}
|
1014 |
|
1015 |
/**
|
1075 |
'/(<\/?hr.*?>)/',
|
1076 |
'/(<\/?li.*?>)/',
|
1077 |
'/(<img.*?>)/',
|
|
|
1078 |
);
|
1079 |
|
1080 |
$content = preg_replace( $space_tags, '$1 ', $content );
|
readme.txt
CHANGED
@@ -3,9 +3,9 @@ Contributors: msaari
|
|
3 |
Donate link: https://www.relevanssi.com/buy-premium/
|
4 |
Tags: search, relevance, better search, product search, woocommerce search
|
5 |
Requires at least: 4.9
|
6 |
-
Tested up to:
|
7 |
Requires PHP: 7.0
|
8 |
-
Stable tag: 4.
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
@@ -128,21 +128,6 @@ 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.16.0 =
|
132 |
-
* New feature: Oxygen compatibility has been upgraded to support JSON data from Oxygen 4. This is still in early stages, so feedback from Oxygen users is welcome.
|
133 |
-
* New feature: New filter hook `relevanssi_oxygen_element` is used to filter Oxygen JSON elements. The earlier `relevanssi_oxygen_section_filters` and `relevanssi_oxygen_section_content` filters are no longer used with Oxygen 4; this hook is the only way to filter Oxygen elements.
|
134 |
-
* Changed behaviour: Relevanssi now applies `remove_accents()` to all strings. This is because default database collations do not care for accents and having accents may cause missing information in indexing. If you use a database collation that doesn't ignore accents, make sure you disable this filter.
|
135 |
-
* Minor fix: Relevanssi used `the_category` filter with too few parameters. The missing parameters have been added.
|
136 |
-
* Minor fix: Stops drafts and pending posts from showing up in Relevanssi Live Ajax Searches.
|
137 |
-
* Minor fix: Phrases weren't used in some cases where a multiple-word phrase looked like a single-word phrase.
|
138 |
-
* Minor fix: Prevents fatal errors from `relevanssi_strip_all_tags()`.
|
139 |
-
|
140 |
-
= 4.15.2 =
|
141 |
-
* 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.
|
142 |
-
* Minor fix: Phrase search couldn't find phrases that include an ampersand if they matched the post title. This works now.
|
143 |
-
* Minor fix: Relevanssi now adds spaces after table cell tags to avoid table cell content sticking together in excerpts.
|
144 |
-
* Minor fix: The 'Allowable tags in excerpts' function now automatically corrects the entered value to match what Relevanssi expects the value to be.
|
145 |
-
|
146 |
= 4.15.1 =
|
147 |
* Changed behaviour: Relevanssi now ignores WordPress metadata custom fields that aren't interesting for Relevanssi indexing.
|
148 |
* 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.
|
@@ -161,5 +146,8 @@ Each document database is full of useless words. All the little words that appea
|
|
161 |
* 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.
|
162 |
|
163 |
== Upgrade notice ==
|
164 |
-
= 4.
|
165 |
-
*
|
|
|
|
|
|
3 |
Donate link: https://www.relevanssi.com/buy-premium/
|
4 |
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.1
|
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.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 |
* 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 |
+
|
152 |
+
= 4.15.0 =
|
153 |
+
* New filter hooks and improved Bricks compatibility.
|
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.
|
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.
|
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.1
|
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.1';
|
71 |
|
72 |
require_once 'lib/admin-ajax.php';
|
73 |
require_once 'lib/common.php';
|