Version Description
- New feature: New filter hook
relevanssi_post_content_after_shortcodes
filters the post content after shortcodes have been processed but before the HTML tags are stripped. - Minor fix: Adds more backwards compatibility for the
relevanssi_indexing_restriction
change.
Download this release
Release Info
Developer | msaari |
Plugin | Relevanssi – A Better Search |
Version | 4.7.1 |
Comparing to | |
See all releases |
Code changes from version 4.7.0 to 4.7.1
- lib/common.php +42 -8
- lib/compatibility/gutenberg.php +21 -1
- lib/compatibility/polylang.php +25 -14
- lib/compatibility/seopress.php +17 -4
- lib/compatibility/woocommerce.php +12 -4
- lib/compatibility/yoast-seo.php +18 -4
- lib/excerpts-highlights.php +31 -27
- lib/indexing.php +84 -14
- lib/init.php +4 -0
- lib/search.php +5 -12
- lib/shortcodes.php +0 -2
- lib/stopwords.php +19 -0
- lib/uninstall.php +3 -0
- readme.txt +8 -1
- relevanssi.php +2 -2
lib/common.php
CHANGED
@@ -671,6 +671,7 @@ function relevanssi_remove_punct( $a ) {
|
|
671 |
|
672 |
$replacement_array = array(
|
673 |
'ß' => 'ss',
|
|
|
674 |
'·' => '',
|
675 |
'…' => '',
|
676 |
'€' => '',
|
@@ -755,13 +756,6 @@ function relevanssi_remove_punct( $a ) {
|
|
755 |
*/
|
756 |
function relevanssi_prevent_default_request( $request, $query ) {
|
757 |
if ( $query->is_search ) {
|
758 |
-
if ( isset( $query->query_vars['post_type'] ) && isset( $query->query_vars['post_status'] ) ) {
|
759 |
-
if ( 'attachment' === $query->query_vars['post_type'] && 'inherit,private' === $query->query_vars['post_status'] ) {
|
760 |
-
// This is a media library search; do not meddle.
|
761 |
-
return $request;
|
762 |
-
}
|
763 |
-
}
|
764 |
-
|
765 |
if ( in_array( $query->query_vars['post_type'], array( 'topic', 'reply' ), true ) ) {
|
766 |
// This is a BBPress search; do not meddle.
|
767 |
return $request;
|
@@ -1375,7 +1369,7 @@ function relevanssi_switch_blog( $new_blog, $prev_blog ) {
|
|
1375 |
* @return string The link with the parameter added.
|
1376 |
*/
|
1377 |
function relevanssi_add_highlight( $permalink, $link_post = null ) {
|
1378 |
-
$highlight_docs = get_option( 'relevanssi_highlight_docs' );
|
1379 |
$query = get_search_query();
|
1380 |
if ( isset( $highlight_docs ) && 'off' !== $highlight_docs && ! empty( $query ) ) {
|
1381 |
$frontpage_id = intval( get_option( 'page_on_front' ) );
|
@@ -1939,3 +1933,43 @@ function relevanssi_remove_page_builder_shortcodes( $content ) {
|
|
1939 |
$content = preg_replace( $search_array, ' ', $content );
|
1940 |
return $content;
|
1941 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
671 |
|
672 |
$replacement_array = array(
|
673 |
'ß' => 'ss',
|
674 |
+
'₂' => '2',
|
675 |
'·' => '',
|
676 |
'…' => '',
|
677 |
'€' => '',
|
756 |
*/
|
757 |
function relevanssi_prevent_default_request( $request, $query ) {
|
758 |
if ( $query->is_search ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
759 |
if ( in_array( $query->query_vars['post_type'], array( 'topic', 'reply' ), true ) ) {
|
760 |
// This is a BBPress search; do not meddle.
|
761 |
return $request;
|
1369 |
* @return string The link with the parameter added.
|
1370 |
*/
|
1371 |
function relevanssi_add_highlight( $permalink, $link_post = null ) {
|
1372 |
+
$highlight_docs = get_option( 'relevanssi_highlight_docs', 'off' );
|
1373 |
$query = get_search_query();
|
1374 |
if ( isset( $highlight_docs ) && 'off' !== $highlight_docs && ! empty( $query ) ) {
|
1375 |
$frontpage_id = intval( get_option( 'page_on_front' ) );
|
1933 |
$content = preg_replace( $search_array, ' ', $content );
|
1934 |
return $content;
|
1935 |
}
|
1936 |
+
|
1937 |
+
/**
|
1938 |
+
* Blocks Relevanssi from the admin searches on specific post types.
|
1939 |
+
*
|
1940 |
+
* This function is added to relevanssi_search_ok, relevanssi_admin_search_ok,
|
1941 |
+
* and relevanssi_prevent_default_request hooks. When a search is made with
|
1942 |
+
* one of the listed post types, these filters will get a false response, which
|
1943 |
+
* means Relevanssi won't search and won't block the default request.
|
1944 |
+
*
|
1945 |
+
* @see relevanssi_prevent_default_request
|
1946 |
+
* @see relevanssi_search
|
1947 |
+
*
|
1948 |
+
* @param boolean $allow Should the admin search be allowed.
|
1949 |
+
* @param WP_Query $query The query object.
|
1950 |
+
*/
|
1951 |
+
function relevanssi_block_on_admin_searches( $allow, $query ) {
|
1952 |
+
$blocked_post_types = array(
|
1953 |
+
'rc_blocks', // Reusable Content Blocks.
|
1954 |
+
);
|
1955 |
+
/**
|
1956 |
+
* Filters the post types that are blocked in the admin search.
|
1957 |
+
*
|
1958 |
+
* In some cases you may want to enable Relevanssi in the admin backend,
|
1959 |
+
* but don't want Relevanssi to search certain post types. To block
|
1960 |
+
* Relevanssi from a specific post type, add the post type to this filter.
|
1961 |
+
*
|
1962 |
+
* @param array List of post types Relevanssi shouldn't try searching.
|
1963 |
+
*/
|
1964 |
+
$blocked_post_types = apply_filters(
|
1965 |
+
'relevanssi_admin_search_blocked_post_types',
|
1966 |
+
$blocked_post_types
|
1967 |
+
);
|
1968 |
+
if (
|
1969 |
+
isset( $query->query_vars['post_type'] ) &&
|
1970 |
+
in_array( $query->query_vars['post_type'], $blocked_post_types, true )
|
1971 |
+
) {
|
1972 |
+
$allow = false;
|
1973 |
+
}
|
1974 |
+
return $allow;
|
1975 |
+
}
|
lib/compatibility/gutenberg.php
CHANGED
@@ -58,7 +58,27 @@ function relevanssi_gutenberg_block_rendering( $content ) {
|
|
58 |
$output = '';
|
59 |
|
60 |
foreach ( $blocks as $block ) {
|
61 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
$output .= render_block( $block );
|
63 |
}
|
64 |
}
|
58 |
$output = '';
|
59 |
|
60 |
foreach ( $blocks as $block ) {
|
61 |
+
/**
|
62 |
+
* Filters the Gutenberg block before it is rendered.
|
63 |
+
*
|
64 |
+
* If the block is non-empty after the filter and it's className
|
65 |
+
* parameter is not 'relevanssi_noindex', it will be passed on to the
|
66 |
+
* render_block() function for rendering.
|
67 |
+
*
|
68 |
+
* @see render_block
|
69 |
+
*
|
70 |
+
* @param array $block The Gutenberg block element.
|
71 |
+
*/
|
72 |
+
$block = apply_filters( 'relevanssi_block_to_render', $block );
|
73 |
+
|
74 |
+
if ( ! $block ) {
|
75 |
+
continue;
|
76 |
+
}
|
77 |
+
|
78 |
+
if (
|
79 |
+
! isset( $block['attrs']['className'] )
|
80 |
+
|| false === strstr( $block['attrs']['className'], 'relevanssi_noindex' )
|
81 |
+
) {
|
82 |
$output .= render_block( $block );
|
83 |
}
|
84 |
}
|
lib/compatibility/polylang.php
CHANGED
@@ -17,9 +17,9 @@ add_filter( 'relevanssi_hits_filter', 'relevanssi_polylang_term_filter' );
|
|
17 |
/**
|
18 |
* Removes the Polylang language filters.
|
19 |
*
|
20 |
-
* If the Polylang allow all option
|
21 |
-
* removes the Polylang language filter. By default Polylang
|
22 |
-
* using a taxonomy query.
|
23 |
*
|
24 |
* @param object $query WP_Query object we need to clean up.
|
25 |
*/
|
@@ -75,10 +75,10 @@ function relevanssi_polylang_filter( $query ) {
|
|
75 |
/**
|
76 |
* Allows taxonomy terms in language-restricted searches.
|
77 |
*
|
78 |
-
* This is a bit of a hack, where the language taxonomy WHERE clause is modified
|
79 |
-
* the go to allow all posts with the post ID -1 (which means taxonomy terms
|
80 |
-
* users). This may break suddenly in updates, but I haven't come up with a
|
81 |
-
* way so far.
|
82 |
*
|
83 |
* @param string $where The WHERE clause to modify.
|
84 |
*
|
@@ -87,6 +87,8 @@ function relevanssi_polylang_filter( $query ) {
|
|
87 |
* @since 2.1.6
|
88 |
*/
|
89 |
function relevanssi_polylang_where_include_terms( $where ) {
|
|
|
|
|
90 |
$current_language = substr( get_locale(), 0, 2 );
|
91 |
if ( function_exists( 'pll_current_language' ) ) {
|
92 |
$current_language = pll_current_language();
|
@@ -94,7 +96,11 @@ function relevanssi_polylang_where_include_terms( $where ) {
|
|
94 |
$languages = get_terms( array( 'taxonomy' => 'language' ) );
|
95 |
$language_id = 0;
|
96 |
foreach ( $languages as $language ) {
|
97 |
-
if (
|
|
|
|
|
|
|
|
|
98 |
$language_id = intval( $language->term_id );
|
99 |
break;
|
100 |
}
|
@@ -103,9 +109,10 @@ function relevanssi_polylang_where_include_terms( $where ) {
|
|
103 |
if ( 0 !== $language_id ) {
|
104 |
// Do a simple search-and-replace to modify the query.
|
105 |
$where = preg_replace( '/\s+/', ' ', $where );
|
|
|
106 |
$where = str_replace(
|
107 |
-
"AND relevanssi.doc IN (SELECT DISTINCT(tr.object_id) FROM
|
108 |
-
"AND (relevanssi.doc IN (SELECT DISTINCT(tr.object_id) FROM
|
109 |
$where
|
110 |
);
|
111 |
}
|
@@ -115,9 +122,10 @@ function relevanssi_polylang_where_include_terms( $where ) {
|
|
115 |
/**
|
116 |
* Filters out taxonomy terms in the wrong language.
|
117 |
*
|
118 |
-
* If all languages are not allowed, this filter goes through the results and
|
119 |
-
* the taxonomy terms in the wrong language. This can't be done in the
|
120 |
-
* because the term language information is slightly hard to
|
|
|
121 |
*
|
122 |
* @param array $hits The found posts are in $hits[0].
|
123 |
*
|
@@ -149,7 +157,10 @@ function relevanssi_polylang_term_filter( $hits ) {
|
|
149 |
if ( -1 === $hit->ID && isset( $hit->term_id ) ) {
|
150 |
$term_id = intval( $hit->term_id );
|
151 |
$translations = pll_get_term_translations( $term_id );
|
152 |
-
if (
|
|
|
|
|
|
|
153 |
$accepted_hits[] = $original_hit;
|
154 |
}
|
155 |
} else {
|
17 |
/**
|
18 |
* Removes the Polylang language filters.
|
19 |
*
|
20 |
+
* If the Polylang allow all option ('relevanssi_polylang_all_languages') is
|
21 |
+
* enabled this removes the Polylang language filter. By default Polylang
|
22 |
+
* filters the languages using a taxonomy query.
|
23 |
*
|
24 |
* @param object $query WP_Query object we need to clean up.
|
25 |
*/
|
75 |
/**
|
76 |
* Allows taxonomy terms in language-restricted searches.
|
77 |
*
|
78 |
+
* This is a bit of a hack, where the language taxonomy WHERE clause is modified
|
79 |
+
* on the go to allow all posts with the post ID -1 (which means taxonomy terms
|
80 |
+
* and users). This may break suddenly in updates, but I haven't come up with a
|
81 |
+
* better way so far.
|
82 |
*
|
83 |
* @param string $where The WHERE clause to modify.
|
84 |
*
|
87 |
* @since 2.1.6
|
88 |
*/
|
89 |
function relevanssi_polylang_where_include_terms( $where ) {
|
90 |
+
global $wpdb;
|
91 |
+
|
92 |
$current_language = substr( get_locale(), 0, 2 );
|
93 |
if ( function_exists( 'pll_current_language' ) ) {
|
94 |
$current_language = pll_current_language();
|
96 |
$languages = get_terms( array( 'taxonomy' => 'language' ) );
|
97 |
$language_id = 0;
|
98 |
foreach ( $languages as $language ) {
|
99 |
+
if (
|
100 |
+
! is_wp_error( $language ) &&
|
101 |
+
$language instanceof WP_Term &&
|
102 |
+
$language->slug === $current_language
|
103 |
+
) {
|
104 |
$language_id = intval( $language->term_id );
|
105 |
break;
|
106 |
}
|
109 |
if ( 0 !== $language_id ) {
|
110 |
// Do a simple search-and-replace to modify the query.
|
111 |
$where = preg_replace( '/\s+/', ' ', $where );
|
112 |
+
$where = preg_replace( '/\(\s/', '(', $where );
|
113 |
$where = str_replace(
|
114 |
+
"AND relevanssi.doc IN (SELECT DISTINCT(tr.object_id) FROM {$wpdb->prefix}term_relationships AS tr WHERE tr.term_taxonomy_id IN ($language_id))",
|
115 |
+
"AND (relevanssi.doc IN ( SELECT DISTINCT(tr.object_id) FROM {$wpdb->prefix}term_relationships AS tr WHERE tr.term_taxonomy_id IN ($language_id)) OR (relevanssi.doc = -1))",
|
116 |
$where
|
117 |
);
|
118 |
}
|
122 |
/**
|
123 |
* Filters out taxonomy terms in the wrong language.
|
124 |
*
|
125 |
+
* If all languages are not allowed, this filter goes through the results and
|
126 |
+
* removes the taxonomy terms in the wrong language. This can't be done in the
|
127 |
+
* original query because the term language information is slightly hard to
|
128 |
+
* find.
|
129 |
*
|
130 |
* @param array $hits The found posts are in $hits[0].
|
131 |
*
|
157 |
if ( -1 === $hit->ID && isset( $hit->term_id ) ) {
|
158 |
$term_id = intval( $hit->term_id );
|
159 |
$translations = pll_get_term_translations( $term_id );
|
160 |
+
if (
|
161 |
+
isset( $translations[ $current_language ] ) &&
|
162 |
+
$translations[ $current_language ] === $term_id
|
163 |
+
) {
|
164 |
$accepted_hits[] = $original_hit;
|
165 |
}
|
166 |
} else {
|
lib/compatibility/seopress.php
CHANGED
@@ -22,12 +22,13 @@ add_filter( 'relevanssi_indexing_restriction', 'relevanssi_seopress_exclude' );
|
|
22 |
* @param boolean $do_not_index True, if the post shouldn't be indexed.
|
23 |
* @param integer $post_id The post ID number.
|
24 |
*
|
25 |
-
* @return boolean
|
|
|
26 |
*/
|
27 |
function relevanssi_seopress_noindex( $do_not_index, $post_id ) {
|
28 |
$noindex = get_post_meta( $post_id, '_seopress_robots_index', true );
|
29 |
if ( 'yes' === $noindex ) {
|
30 |
-
$do_not_index =
|
31 |
}
|
32 |
return $do_not_index;
|
33 |
}
|
@@ -38,10 +39,22 @@ function relevanssi_seopress_noindex( $do_not_index, $post_id ) {
|
|
38 |
* Adds a MySQL query restriction that blocks posts that have the SEOPress
|
39 |
* "noindex" setting set to "1" from indexing.
|
40 |
*
|
41 |
-
* @param
|
|
|
42 |
*/
|
43 |
function relevanssi_seopress_exclude( $restriction ) {
|
44 |
global $wpdb;
|
45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
return $restriction;
|
47 |
}
|
22 |
* @param boolean $do_not_index True, if the post shouldn't be indexed.
|
23 |
* @param integer $post_id The post ID number.
|
24 |
*
|
25 |
+
* @return string|boolean If the post shouldn't be indexed, this returns
|
26 |
+
* 'seopress'. The value may also be a boolean.
|
27 |
*/
|
28 |
function relevanssi_seopress_noindex( $do_not_index, $post_id ) {
|
29 |
$noindex = get_post_meta( $post_id, '_seopress_robots_index', true );
|
30 |
if ( 'yes' === $noindex ) {
|
31 |
+
$do_not_index = 'SEOPress';
|
32 |
}
|
33 |
return $do_not_index;
|
34 |
}
|
39 |
* Adds a MySQL query restriction that blocks posts that have the SEOPress
|
40 |
* "noindex" setting set to "1" from indexing.
|
41 |
*
|
42 |
+
* @param array $restriction An array with two values: 'mysql' for the MySQL
|
43 |
+
* query restriction to modify, 'reason' for the reason of restriction.
|
44 |
*/
|
45 |
function relevanssi_seopress_exclude( $restriction ) {
|
46 |
global $wpdb;
|
47 |
+
// Backwards compatibility code for 2.8.0, remove at some point.
|
48 |
+
if ( is_string( $restriction ) ) {
|
49 |
+
$restriction = array(
|
50 |
+
'mysql' => $restriction,
|
51 |
+
'reason' => '',
|
52 |
+
);
|
53 |
+
}
|
54 |
+
|
55 |
+
$restriction['mysql'] .= " AND post.ID NOT IN (SELECT post_id FROM
|
56 |
+
$wpdb->postmeta WHERE meta_key = '_seopress_robots_index'
|
57 |
+
AND meta_value = 'yes' ) ";
|
58 |
+
$restriction['reason'] .= 'SEOPress';
|
59 |
return $restriction;
|
60 |
}
|
lib/compatibility/woocommerce.php
CHANGED
@@ -15,12 +15,20 @@ add_filter( 'relevanssi_indexing_restriction', 'relevanssi_woocommerce_restricti
|
|
15 |
/**
|
16 |
* Applies the WooCommerce product visibility filter.
|
17 |
*
|
18 |
-
* @param
|
19 |
-
*
|
20 |
-
* @return string The restriction clause with the WC filter added, if necessary.
|
21 |
*/
|
22 |
function relevanssi_woocommerce_restriction( $restriction ) {
|
23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
return $restriction;
|
25 |
}
|
26 |
|
15 |
/**
|
16 |
* Applies the WooCommerce product visibility filter.
|
17 |
*
|
18 |
+
* @param array $restriction An array with two values: 'mysql' for the MySQL
|
19 |
+
* query restriction to modify, 'reason' for the reason of restriction.
|
|
|
20 |
*/
|
21 |
function relevanssi_woocommerce_restriction( $restriction ) {
|
22 |
+
// Backwards compatibility code for 2.8.0, remove at some point.
|
23 |
+
if ( is_string( $restriction ) ) {
|
24 |
+
$restriction = array(
|
25 |
+
'mysql' => $restriction,
|
26 |
+
'reason' => '',
|
27 |
+
);
|
28 |
+
}
|
29 |
+
|
30 |
+
$restriction['mysql'] .= relevanssi_woocommerce_indexing_filter();
|
31 |
+
$restriction['reason'] .= 'WooCommerce';
|
32 |
return $restriction;
|
33 |
}
|
34 |
|
lib/compatibility/yoast-seo.php
CHANGED
@@ -21,12 +21,13 @@ add_filter( 'relevanssi_indexing_restriction', 'relevanssi_yoast_exclude' );
|
|
21 |
* @param boolean $do_not_index True, if the post shouldn't be indexed.
|
22 |
* @param integer $post_id The post ID number.
|
23 |
*
|
24 |
-
* @return boolean
|
|
|
25 |
*/
|
26 |
function relevanssi_yoast_noindex( $do_not_index, $post_id ) {
|
27 |
$noindex = get_post_meta( $post_id, '_yoast_wpseo_meta-robots-noindex', true );
|
28 |
if ( '1' === $noindex ) {
|
29 |
-
$do_not_index =
|
30 |
}
|
31 |
return $do_not_index;
|
32 |
}
|
@@ -37,10 +38,23 @@ function relevanssi_yoast_noindex( $do_not_index, $post_id ) {
|
|
37 |
* Adds a MySQL query restriction that blocks posts that have the Yoast SEO
|
38 |
* "noindex" setting set to "1" from indexing.
|
39 |
*
|
40 |
-
* @param
|
|
|
41 |
*/
|
42 |
function relevanssi_yoast_exclude( $restriction ) {
|
43 |
global $wpdb;
|
44 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
return $restriction;
|
46 |
}
|
21 |
* @param boolean $do_not_index True, if the post shouldn't be indexed.
|
22 |
* @param integer $post_id The post ID number.
|
23 |
*
|
24 |
+
* @return string|boolean If the post shouldn't be indexed, this returns
|
25 |
+
* 'yoast_seo'. The value may also be a boolean.
|
26 |
*/
|
27 |
function relevanssi_yoast_noindex( $do_not_index, $post_id ) {
|
28 |
$noindex = get_post_meta( $post_id, '_yoast_wpseo_meta-robots-noindex', true );
|
29 |
if ( '1' === $noindex ) {
|
30 |
+
$do_not_index = 'Yoast SEO';
|
31 |
}
|
32 |
return $do_not_index;
|
33 |
}
|
38 |
* Adds a MySQL query restriction that blocks posts that have the Yoast SEO
|
39 |
* "noindex" setting set to "1" from indexing.
|
40 |
*
|
41 |
+
* @param array $restriction An array with two values: 'mysql' for the MySQL
|
42 |
+
* query restriction to modify, 'reason' for the reason of restriction.
|
43 |
*/
|
44 |
function relevanssi_yoast_exclude( $restriction ) {
|
45 |
global $wpdb;
|
46 |
+
|
47 |
+
// Backwards compatibility code for 2.8.0, remove at some point.
|
48 |
+
if ( is_string( $restriction ) ) {
|
49 |
+
$restriction = array(
|
50 |
+
'mysql' => $restriction,
|
51 |
+
'reason' => '',
|
52 |
+
);
|
53 |
+
}
|
54 |
+
|
55 |
+
$restriction['mysql'] .= " AND post.ID NOT IN (SELECT post_id FROM
|
56 |
+
$wpdb->postmeta WHERE meta_key = '_yoast_wpseo_meta-robots-noindex'
|
57 |
+
AND meta_value = '1' ) ";
|
58 |
+
$restriction['reason'] .= ' Yoast SEO';
|
59 |
return $restriction;
|
60 |
}
|
lib/excerpts-highlights.php
CHANGED
@@ -58,7 +58,7 @@ function relevanssi_do_excerpt( $t_post, $query, $excerpt_length = null, $excerp
|
|
58 |
}
|
59 |
$post = $t_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
60 |
|
61 |
-
$remove_stopwords =
|
62 |
|
63 |
/**
|
64 |
* Filters the search query before excerpt-building.
|
@@ -88,7 +88,10 @@ function relevanssi_do_excerpt( $t_post, $query, $excerpt_length = null, $excerp
|
|
88 |
} else {
|
89 |
$untokenized_terms = array_filter( explode( ' ', $query ) );
|
90 |
}
|
91 |
-
$
|
|
|
|
|
|
|
92 |
|
93 |
// These shortcodes cause problems with Relevanssi excerpts.
|
94 |
$problem_shortcodes = array( 'layerslider', 'responsive-flipbook', 'breadcrumb', 'robogallery', 'gravityview', 'wp_show_posts' );
|
@@ -102,9 +105,7 @@ function relevanssi_do_excerpt( $t_post, $query, $excerpt_length = null, $excerp
|
|
102 |
* @param array $problem_shortcodes Array of problematic shortcode names.
|
103 |
*/
|
104 |
$problem_shortcodes = apply_filters( 'relevanssi_disable_shortcodes_excerpt', $problem_shortcodes );
|
105 |
-
|
106 |
-
remove_shortcode( $shortcode );
|
107 |
-
}
|
108 |
|
109 |
/**
|
110 |
* Filters the post content before 'the_content'.
|
@@ -118,6 +119,9 @@ function relevanssi_do_excerpt( $t_post, $query, $excerpt_length = null, $excerp
|
|
118 |
*/
|
119 |
$content = apply_filters( 'relevanssi_pre_excerpt_content', $post->post_content, $post, $query );
|
120 |
|
|
|
|
|
|
|
121 |
// Add the custom field content.
|
122 |
if ( 'on' === get_option( 'relevanssi_excerpt_custom_fields' ) ) {
|
123 |
$content .= relevanssi_get_custom_field_content( $post->ID );
|
@@ -450,7 +454,7 @@ function relevanssi_highlight_terms( $content, $query, $in_docs = false ) {
|
|
450 |
$min_word_length = 1;
|
451 |
}
|
452 |
|
453 |
-
$remove_stopwords =
|
454 |
$terms = array_keys(
|
455 |
relevanssi_tokenize(
|
456 |
$query,
|
@@ -459,27 +463,27 @@ function relevanssi_highlight_terms( $content, $query, $in_docs = false ) {
|
|
459 |
)
|
460 |
);
|
461 |
|
462 |
-
if ( is_array( $query ) ) {
|
463 |
-
$
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
|
|
|
|
|
|
|
|
|
|
469 |
return false;
|
470 |
}
|
471 |
-
|
472 |
-
|
473 |
-
$untokenized_terms = array_filter(
|
474 |
-
explode( ' ', $query ),
|
475 |
-
function( $value ) use ( $min_word_length ) {
|
476 |
-
if ( relevanssi_strlen( $value ) > $min_word_length ) {
|
477 |
-
return true;
|
478 |
-
}
|
479 |
-
return false;
|
480 |
}
|
481 |
-
|
482 |
-
|
|
|
|
|
483 |
$terms = array_unique( array_merge( $untokenized_terms, $terms ) );
|
484 |
array_walk( $terms, 'relevanssi_array_walk_trim' ); // Numeric search terms begin with a space.
|
485 |
|
@@ -503,9 +507,9 @@ function relevanssi_highlight_terms( $content, $query, $in_docs = false ) {
|
|
503 |
|
504 |
usort( $terms, 'relevanssi_strlen_sort' );
|
505 |
|
506 |
-
$word_boundaries_available =
|
507 |
if ( 'on' === get_option( 'relevanssi_word_boundaries', 'off' ) ) {
|
508 |
-
$word_boundaries_available =
|
509 |
}
|
510 |
|
511 |
$content = html_entity_decode( $content, ENT_QUOTES, 'UTF-8' );
|
@@ -1116,7 +1120,7 @@ function relevanssi_add_accent_variations( $word ) {
|
|
1116 |
$escaped = false;
|
1117 |
for ( $i = 0; $i < $len; $i++ ) {
|
1118 |
$char = relevanssi_substr( $word, $i, 1 );
|
1119 |
-
if ( '\\' === $char ) {
|
1120 |
$escaped = true;
|
1121 |
continue;
|
1122 |
}
|
58 |
}
|
59 |
$post = $t_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
60 |
|
61 |
+
$remove_stopwords = 'body';
|
62 |
|
63 |
/**
|
64 |
* Filters the search query before excerpt-building.
|
88 |
} else {
|
89 |
$untokenized_terms = array_filter( explode( ' ', $query ) );
|
90 |
}
|
91 |
+
$untokenized_terms = array_flip(
|
92 |
+
relevanssi_remove_stopwords_from_array( $untokenized_terms )
|
93 |
+
);
|
94 |
+
$terms = array_merge( $untokenized_terms, $terms );
|
95 |
|
96 |
// These shortcodes cause problems with Relevanssi excerpts.
|
97 |
$problem_shortcodes = array( 'layerslider', 'responsive-flipbook', 'breadcrumb', 'robogallery', 'gravityview', 'wp_show_posts' );
|
105 |
* @param array $problem_shortcodes Array of problematic shortcode names.
|
106 |
*/
|
107 |
$problem_shortcodes = apply_filters( 'relevanssi_disable_shortcodes_excerpt', $problem_shortcodes );
|
108 |
+
array_walk( $problem_shortcodes, 'remove_shortcode' );
|
|
|
|
|
109 |
|
110 |
/**
|
111 |
* Filters the post content before 'the_content'.
|
119 |
*/
|
120 |
$content = apply_filters( 'relevanssi_pre_excerpt_content', $post->post_content, $post, $query );
|
121 |
|
122 |
+
$pattern = get_shortcode_regex( $problem_shortcodes );
|
123 |
+
$content = preg_replace_callback( "/$pattern/", 'strip_shortcode_tag', $content );
|
124 |
+
|
125 |
// Add the custom field content.
|
126 |
if ( 'on' === get_option( 'relevanssi_excerpt_custom_fields' ) ) {
|
127 |
$content .= relevanssi_get_custom_field_content( $post->ID );
|
454 |
$min_word_length = 1;
|
455 |
}
|
456 |
|
457 |
+
$remove_stopwords = 'body';
|
458 |
$terms = array_keys(
|
459 |
relevanssi_tokenize(
|
460 |
$query,
|
463 |
)
|
464 |
);
|
465 |
|
466 |
+
if ( ! is_array( $query ) ) {
|
467 |
+
$query = explode( ' ', $query );
|
468 |
+
}
|
469 |
+
|
470 |
+
$body_stopwords = function_exists( 'relevanssi_fetch_body_stopwords' )
|
471 |
+
? relevanssi_fetch_body_stopwords()
|
472 |
+
: array();
|
473 |
+
|
474 |
+
$untokenized_terms = array_filter(
|
475 |
+
$query,
|
476 |
+
function( $value ) use ( $min_word_length, $body_stopwords ) {
|
477 |
+
if ( in_array( $value, $body_stopwords, true ) ) {
|
478 |
return false;
|
479 |
}
|
480 |
+
if ( relevanssi_strlen( $value ) > $min_word_length ) {
|
481 |
+
return true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
482 |
}
|
483 |
+
return false;
|
484 |
+
}
|
485 |
+
);
|
486 |
+
|
487 |
$terms = array_unique( array_merge( $untokenized_terms, $terms ) );
|
488 |
array_walk( $terms, 'relevanssi_array_walk_trim' ); // Numeric search terms begin with a space.
|
489 |
|
507 |
|
508 |
usort( $terms, 'relevanssi_strlen_sort' );
|
509 |
|
510 |
+
$word_boundaries_available = false;
|
511 |
if ( 'on' === get_option( 'relevanssi_word_boundaries', 'off' ) ) {
|
512 |
+
$word_boundaries_available = true;
|
513 |
}
|
514 |
|
515 |
$content = html_entity_decode( $content, ENT_QUOTES, 'UTF-8' );
|
1120 |
$escaped = false;
|
1121 |
for ( $i = 0; $i < $len; $i++ ) {
|
1122 |
$char = relevanssi_substr( $word, $i, 1 );
|
1123 |
+
if ( '\\' === $char && ! $escaped ) {
|
1124 |
$escaped = true;
|
1125 |
continue;
|
1126 |
}
|
lib/indexing.php
CHANGED
@@ -117,9 +117,25 @@ function relevanssi_generate_indexing_query( $valid_status, $extend = false, $re
|
|
117 |
*
|
118 |
* @param string The WHERE restriction.
|
119 |
*
|
120 |
-
* @
|
|
|
121 |
*/
|
122 |
-
$restriction = apply_filters(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
|
124 |
if ( ! $extend ) {
|
125 |
$q = "SELECT post.ID
|
@@ -135,7 +151,7 @@ function relevanssi_generate_indexing_query( $valid_status, $extend = false, $re
|
|
135 |
)
|
136 |
))
|
137 |
AND post.ID NOT IN (SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_relevanssi_hide_post' AND meta_value = 'on')
|
138 |
-
$restriction ORDER BY post.ID DESC $limit";
|
139 |
} else {
|
140 |
$processed_post_filter = 'r.doc is null';
|
141 |
if ( 'noindex' !== get_option( 'relevanssi_internal_links', 'noindex' ) ) {
|
@@ -159,7 +175,7 @@ function relevanssi_generate_indexing_query( $valid_status, $extend = false, $re
|
|
159 |
)
|
160 |
)
|
161 |
AND post.ID NOT IN (SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_relevanssi_hide_post' AND meta_value = 'on')
|
162 |
-
$restriction ORDER BY post.ID DESC $limit";
|
163 |
}
|
164 |
|
165 |
/**
|
@@ -443,6 +459,11 @@ function relevanssi_index_doc( $index_post, $remove_first = false, $custom_field
|
|
443 |
if ( $previous_post || $post_was_null ) {
|
444 |
$post = $previous_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
445 |
}
|
|
|
|
|
|
|
|
|
|
|
446 |
return 'hide';
|
447 |
}
|
448 |
}
|
@@ -460,14 +481,21 @@ function relevanssi_index_doc( $index_post, $remove_first = false, $custom_field
|
|
460 |
*
|
461 |
* Allows you to filter whether a post is indexed or not.
|
462 |
*
|
463 |
-
* @param boolean If
|
464 |
-
*
|
|
|
|
|
465 |
*/
|
466 |
-
|
|
|
467 |
// Filter says no.
|
|
|
|
|
|
|
468 |
if ( $debug ) {
|
469 |
-
relevanssi_debug_echo( 'relevanssi_do_not_index
|
470 |
}
|
|
|
471 |
$index_this_post = false;
|
472 |
}
|
473 |
|
@@ -558,6 +586,8 @@ function relevanssi_index_doc( $index_post, $remove_first = false, $custom_field
|
|
558 |
$wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
559 |
}
|
560 |
|
|
|
|
|
561 |
if ( $previous_post || $post_was_null ) {
|
562 |
$post = $previous_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
563 |
}
|
@@ -609,7 +639,14 @@ function relevanssi_index_taxonomy_terms( &$insert_data, $post_id, $taxonomy, $d
|
|
609 |
* @param int The post ID.
|
610 |
*/
|
611 |
$term_string = apply_filters( 'relevanssi_tag_before_tokenize', trim( $term_string ), $post_term, $taxonomy, $post_id );
|
612 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
613 |
if ( count( $term_tokens ) > 0 ) {
|
614 |
foreach ( $term_tokens as $token => $count ) {
|
615 |
$n++;
|
@@ -794,11 +831,19 @@ function relevanssi_insert_edit( $post_id ) {
|
|
794 |
$index_this_post = true;
|
795 |
|
796 |
/* Documented in lib/indexing.php. */
|
797 |
-
$restriction = apply_filters(
|
798 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
799 |
// Check the indexing restriction filter: if the post passes the filter, this
|
800 |
// should return the post ID.
|
801 |
-
$is_unrestricted = $wpdb->get_var(
|
|
|
|
|
802 |
if ( ! $is_unrestricted ) {
|
803 |
$index_this_post = false;
|
804 |
}
|
@@ -816,6 +861,11 @@ function relevanssi_insert_edit( $post_id ) {
|
|
816 |
} else {
|
817 |
// The post isn't supposed to be indexed anymore, remove it from index.
|
818 |
relevanssi_remove_doc( $post_id );
|
|
|
|
|
|
|
|
|
|
|
819 |
$return_value = 'removed';
|
820 |
}
|
821 |
|
@@ -1440,6 +1490,17 @@ function relevanssi_index_content( &$insert_data, $post, $min_word_length, $debu
|
|
1440 |
remove_shortcode( 'noindex' );
|
1441 |
add_shortcode( 'noindex', 'relevanssi_noindex_shortcode' );
|
1442 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1443 |
$contents = relevanssi_strip_invisibles( $contents );
|
1444 |
|
1445 |
// Premium feature for better control over internal links.
|
@@ -1449,7 +1510,6 @@ function relevanssi_index_content( &$insert_data, $post, $min_word_length, $debu
|
|
1449 |
|
1450 |
$contents = preg_replace( '/<[a-zA-Z\/][^>]*>/', ' ', $contents );
|
1451 |
$contents = wp_strip_all_tags( $contents );
|
1452 |
-
$contents = wp_encode_emoji( $contents );
|
1453 |
|
1454 |
/**
|
1455 |
* Filters the post content in indexing before tokenization.
|
@@ -1570,6 +1630,7 @@ function relevanssi_disable_shortcodes() {
|
|
1570 |
* insert query values before and after the conversion.
|
1571 |
*
|
1572 |
* @global $wpdb The WordPress database interface.
|
|
|
1573 |
*
|
1574 |
* @param array $insert_data An array of term => data pairs, where data has
|
1575 |
* token counts for the term in different contexts.
|
@@ -1578,7 +1639,12 @@ function relevanssi_disable_shortcodes() {
|
|
1578 |
* @return array An array of values clauses for an INSERT query.
|
1579 |
*/
|
1580 |
function relevanssi_convert_data_to_values( $insert_data, $post ) {
|
1581 |
-
global $wpdb;
|
|
|
|
|
|
|
|
|
|
|
1582 |
|
1583 |
/**
|
1584 |
* Sets the indexed post 'type' column in the index.
|
@@ -1615,6 +1681,10 @@ function relevanssi_convert_data_to_values( $insert_data, $post ) {
|
|
1615 |
$taxonomy_detail = isset( $data['taxonomy_detail'] ) ? $data['taxonomy_detail'] : '';
|
1616 |
$customfield_detail = isset( $data['customfield_detail'] ) ? $data['customfield_detail'] : '';
|
1617 |
|
|
|
|
|
|
|
|
|
1618 |
$term = trim( $term );
|
1619 |
|
1620 |
$value = $wpdb->prepare(
|
117 |
*
|
118 |
* @param string The WHERE restriction.
|
119 |
*
|
120 |
+
* @param array $restriction An array with two values: 'mysql' for the MySQL
|
121 |
+
* query restriction to modify, 'reason' for the reason of restriction.
|
122 |
*/
|
123 |
+
$restriction = apply_filters(
|
124 |
+
'relevanssi_indexing_restriction',
|
125 |
+
array(
|
126 |
+
'mysql' => $restriction,
|
127 |
+
'reason' => '',
|
128 |
+
)
|
129 |
+
);
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Backwards compatibility for the change in filter parameters in Premium
|
133 |
+
* 2.8.0 in March 2020. Remove this eventually.
|
134 |
+
*/
|
135 |
+
if ( is_string( $restriction ) ) {
|
136 |
+
$restriction['mysql'] = $restriction;
|
137 |
+
$restriction['reason'] = 'relevanssi_indexing_restriction filter';
|
138 |
+
}
|
139 |
|
140 |
if ( ! $extend ) {
|
141 |
$q = "SELECT post.ID
|
151 |
)
|
152 |
))
|
153 |
AND post.ID NOT IN (SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_relevanssi_hide_post' AND meta_value = 'on')
|
154 |
+
{$restriction['mysql']} ORDER BY post.ID DESC $limit";
|
155 |
} else {
|
156 |
$processed_post_filter = 'r.doc is null';
|
157 |
if ( 'noindex' !== get_option( 'relevanssi_internal_links', 'noindex' ) ) {
|
175 |
)
|
176 |
)
|
177 |
AND post.ID NOT IN (SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_relevanssi_hide_post' AND meta_value = 'on')
|
178 |
+
{$restriction['mysql']} ORDER BY post.ID DESC $limit";
|
179 |
}
|
180 |
|
181 |
/**
|
459 |
if ( $previous_post || $post_was_null ) {
|
460 |
$post = $previous_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
461 |
}
|
462 |
+
update_post_meta(
|
463 |
+
$post->ID,
|
464 |
+
'_relevanssi_noindex_reason',
|
465 |
+
__( 'Relevanssi index exclude', 'relevanssi' )
|
466 |
+
);
|
467 |
return 'hide';
|
468 |
}
|
469 |
}
|
481 |
*
|
482 |
* Allows you to filter whether a post is indexed or not.
|
483 |
*
|
484 |
+
* @param boolean|string If not false, the post is not indexed. The value
|
485 |
+
* can be a boolean, or a string containing an explanation for the
|
486 |
+
* exclusion. Default false.
|
487 |
+
* @param int The post ID.
|
488 |
*/
|
489 |
+
$do_not_index = apply_filters( 'relevanssi_do_not_index', false, $post->ID );
|
490 |
+
if ( $do_not_index ) {
|
491 |
// Filter says no.
|
492 |
+
if ( true === $do_not_index ) {
|
493 |
+
$do_not_index = __( 'Blocked by a filter function', 'relevanssi' );
|
494 |
+
}
|
495 |
if ( $debug ) {
|
496 |
+
relevanssi_debug_echo( 'relevanssi_do_not_index says exclude, because: ' . $do_not_index );
|
497 |
}
|
498 |
+
update_post_meta( $post->ID, '_relevanssi_noindex_reason', $do_not_index );
|
499 |
$index_this_post = false;
|
500 |
}
|
501 |
|
586 |
$wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
587 |
}
|
588 |
|
589 |
+
delete_post_meta( $post->ID, '_relevanssi_noindex_reason' );
|
590 |
+
|
591 |
if ( $previous_post || $post_was_null ) {
|
592 |
$post = $previous_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
593 |
}
|
639 |
* @param int The post ID.
|
640 |
*/
|
641 |
$term_string = apply_filters( 'relevanssi_tag_before_tokenize', trim( $term_string ), $post_term, $taxonomy, $post_id );
|
642 |
+
|
643 |
+
/** This filter is documented in lib/indexing.php */
|
644 |
+
$term_tokens = apply_filters(
|
645 |
+
'relevanssi_indexing_tokens',
|
646 |
+
relevanssi_tokenize( $term_string, true, $min_word_length ),
|
647 |
+
'taxonomy-' . $taxonomy
|
648 |
+
);
|
649 |
+
|
650 |
if ( count( $term_tokens ) > 0 ) {
|
651 |
foreach ( $term_tokens as $token => $count ) {
|
652 |
$n++;
|
831 |
$index_this_post = true;
|
832 |
|
833 |
/* Documented in lib/indexing.php. */
|
834 |
+
$restriction = apply_filters(
|
835 |
+
'relevanssi_indexing_restriction',
|
836 |
+
array(
|
837 |
+
'mysql' => '',
|
838 |
+
'reason' => '',
|
839 |
+
)
|
840 |
+
);
|
841 |
+
if ( ! empty( $restriction['mysql'] ) ) {
|
842 |
// Check the indexing restriction filter: if the post passes the filter, this
|
843 |
// should return the post ID.
|
844 |
+
$is_unrestricted = $wpdb->get_var(
|
845 |
+
"SELECT ID FROM $wpdb->posts AS post WHERE ID = $post_id {$restriction['mysql']}" // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
846 |
+
);
|
847 |
if ( ! $is_unrestricted ) {
|
848 |
$index_this_post = false;
|
849 |
}
|
861 |
} else {
|
862 |
// The post isn't supposed to be indexed anymore, remove it from index.
|
863 |
relevanssi_remove_doc( $post_id );
|
864 |
+
update_post_meta(
|
865 |
+
$post_id,
|
866 |
+
'_relevanssi_noindex_reason',
|
867 |
+
trim( $restriction['reason'] )
|
868 |
+
);
|
869 |
$return_value = 'removed';
|
870 |
}
|
871 |
|
1490 |
remove_shortcode( 'noindex' );
|
1491 |
add_shortcode( 'noindex', 'relevanssi_noindex_shortcode' );
|
1492 |
|
1493 |
+
/**
|
1494 |
+
* Filters the post content after shortcodes but before HTML stripping.
|
1495 |
+
*
|
1496 |
+
* @param string $contents The post content.
|
1497 |
+
* @param object $post The full post object.
|
1498 |
+
*/
|
1499 |
+
$contents = apply_filters(
|
1500 |
+
'relevanssi_post_content_after_shortcodes',
|
1501 |
+
$contents,
|
1502 |
+
$post
|
1503 |
+
);
|
1504 |
$contents = relevanssi_strip_invisibles( $contents );
|
1505 |
|
1506 |
// Premium feature for better control over internal links.
|
1510 |
|
1511 |
$contents = preg_replace( '/<[a-zA-Z\/][^>]*>/', ' ', $contents );
|
1512 |
$contents = wp_strip_all_tags( $contents );
|
|
|
1513 |
|
1514 |
/**
|
1515 |
* Filters the post content in indexing before tokenization.
|
1630 |
* insert query values before and after the conversion.
|
1631 |
*
|
1632 |
* @global $wpdb The WordPress database interface.
|
1633 |
+
* @global $relevanssi_variables Used for the Relevanssi db table name.
|
1634 |
*
|
1635 |
* @param array $insert_data An array of term => data pairs, where data has
|
1636 |
* token counts for the term in different contexts.
|
1639 |
* @return array An array of values clauses for an INSERT query.
|
1640 |
*/
|
1641 |
function relevanssi_convert_data_to_values( $insert_data, $post ) {
|
1642 |
+
global $wpdb, $relevanssi_variables;
|
1643 |
+
|
1644 |
+
$charset = $wpdb->get_col_charset(
|
1645 |
+
$relevanssi_variables['relevanssi_table'],
|
1646 |
+
'term'
|
1647 |
+
);
|
1648 |
|
1649 |
/**
|
1650 |
* Sets the indexed post 'type' column in the index.
|
1681 |
$taxonomy_detail = isset( $data['taxonomy_detail'] ) ? $data['taxonomy_detail'] : '';
|
1682 |
$customfield_detail = isset( $data['customfield_detail'] ) ? $data['customfield_detail'] : '';
|
1683 |
|
1684 |
+
if ( 'utf8' === $charset ) {
|
1685 |
+
$term = wp_encode_emoji( $term );
|
1686 |
+
}
|
1687 |
+
|
1688 |
$term = trim( $term );
|
1689 |
|
1690 |
$value = $wpdb->prepare(
|
lib/init.php
CHANGED
@@ -19,6 +19,9 @@ add_action( 'admin_menu', 'relevanssi_menu' );
|
|
19 |
// Taking over the search.
|
20 |
add_filter( 'the_posts', 'relevanssi_query', 99, 2 );
|
21 |
add_filter( 'posts_request', 'relevanssi_prevent_default_request', 10, 2 );
|
|
|
|
|
|
|
22 |
|
23 |
// Post indexing.
|
24 |
add_action( 'wp_insert_post', 'relevanssi_insert_edit', 99, 1 );
|
@@ -288,6 +291,7 @@ function relevanssi_query_vars( $qv ) {
|
|
288 |
$qv[] = 'by_date';
|
289 |
$qv[] = 'highlight';
|
290 |
$qv[] = 'posts_per_page';
|
|
|
291 |
|
292 |
return $qv;
|
293 |
}
|
19 |
// Taking over the search.
|
20 |
add_filter( 'the_posts', 'relevanssi_query', 99, 2 );
|
21 |
add_filter( 'posts_request', 'relevanssi_prevent_default_request', 10, 2 );
|
22 |
+
add_filter( 'relevanssi_search_ok', 'relevanssi_block_on_admin_searches', 10, 2 );
|
23 |
+
add_filter( 'relevanssi_admin_search_ok', 'relevanssi_block_on_admin_searches', 10, 2 );
|
24 |
+
add_filter( 'relevanssi_prevent_default_request', 'relevanssi_block_on_admin_searches', 10, 2 );
|
25 |
|
26 |
// Post indexing.
|
27 |
add_action( 'wp_insert_post', 'relevanssi_insert_edit', 99, 1 );
|
291 |
$qv[] = 'by_date';
|
292 |
$qv[] = 'highlight';
|
293 |
$qv[] = 'posts_per_page';
|
294 |
+
$qv[] = 'post_parent';
|
295 |
|
296 |
return $qv;
|
297 |
}
|
lib/search.php
CHANGED
@@ -50,13 +50,6 @@ function relevanssi_query( $posts, $query = false ) {
|
|
50 |
$search_ok = false; // No search term.
|
51 |
}
|
52 |
|
53 |
-
// Disable Relevanssi in the media library search.
|
54 |
-
if ( $search_ok ) {
|
55 |
-
if ( 'attachment' === $query->query_vars['post_type'] && 'inherit,private' === $query->query_vars['post_status'] ) {
|
56 |
-
$search_ok = false;
|
57 |
-
}
|
58 |
-
}
|
59 |
-
|
60 |
/**
|
61 |
* Filters whether Relevanssi search can be run or not.
|
62 |
*
|
@@ -132,6 +125,8 @@ function relevanssi_search( $args ) {
|
|
132 |
$q_no_synonyms = $query_data['query_no_synonyms'];
|
133 |
$phrase_queries = $query_data['phrase_queries'];
|
134 |
|
|
|
|
|
135 |
/**
|
136 |
* Filters whether stopwords are removed from titles.
|
137 |
*
|
@@ -139,7 +134,7 @@ function relevanssi_search( $args ) {
|
|
139 |
*/
|
140 |
$remove_stopwords = apply_filters( 'relevanssi_remove_stopwords_in_titles', true );
|
141 |
|
142 |
-
$terms = relevanssi_tokenize( $q, $remove_stopwords );
|
143 |
$terms = array_keys( $terms ); // Don't care about tf in query.
|
144 |
|
145 |
if ( function_exists( 'relevanssi_process_terms' ) ) {
|
@@ -228,8 +223,6 @@ function relevanssi_search( $args ) {
|
|
228 |
|
229 |
}
|
230 |
|
231 |
-
$min_length = get_option( 'relevanssi_min_word_length' );
|
232 |
-
|
233 |
$search_again = false;
|
234 |
|
235 |
$content_boost = floatval( get_option( 'relevanssi_content_boost', 1 ) ); // Default value, because this option was added late.
|
@@ -1318,8 +1311,8 @@ function relevanssi_compile_search_args( $query, $q ) {
|
|
1318 |
}
|
1319 |
|
1320 |
$parent_query = array();
|
1321 |
-
if ( isset( $query->query_vars['post_parent'] ) ) {
|
1322 |
-
$parent_query = array( 'parent in' => array( $query->query_vars['post_parent'] ) );
|
1323 |
}
|
1324 |
if ( isset( $query->query_vars['post_parent__in'] ) && is_array( $query->query_vars['post_parent__in'] ) && ! empty( $query->query_vars['post_parent__in'] ) ) {
|
1325 |
$parent_query = array( 'parent in' => $query->query_vars['post_parent__in'] );
|
50 |
$search_ok = false; // No search term.
|
51 |
}
|
52 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
/**
|
54 |
* Filters whether Relevanssi search can be run or not.
|
55 |
*
|
125 |
$q_no_synonyms = $query_data['query_no_synonyms'];
|
126 |
$phrase_queries = $query_data['phrase_queries'];
|
127 |
|
128 |
+
$min_length = get_option( 'relevanssi_min_word_length' );
|
129 |
+
|
130 |
/**
|
131 |
* Filters whether stopwords are removed from titles.
|
132 |
*
|
134 |
*/
|
135 |
$remove_stopwords = apply_filters( 'relevanssi_remove_stopwords_in_titles', true );
|
136 |
|
137 |
+
$terms = relevanssi_tokenize( $q, $remove_stopwords, $min_length );
|
138 |
$terms = array_keys( $terms ); // Don't care about tf in query.
|
139 |
|
140 |
if ( function_exists( 'relevanssi_process_terms' ) ) {
|
223 |
|
224 |
}
|
225 |
|
|
|
|
|
226 |
$search_again = false;
|
227 |
|
228 |
$content_boost = floatval( get_option( 'relevanssi_content_boost', 1 ) ); // Default value, because this option was added late.
|
1311 |
}
|
1312 |
|
1313 |
$parent_query = array();
|
1314 |
+
if ( isset( $query->query_vars['post_parent'] ) && '' !== $query->query_vars['post_parent'] ) {
|
1315 |
+
$parent_query = array( 'parent in' => array( (int) $query->query_vars['post_parent'] ) );
|
1316 |
}
|
1317 |
if ( isset( $query->query_vars['post_parent__in'] ) && is_array( $query->query_vars['post_parent__in'] ) && ! empty( $query->query_vars['post_parent__in'] ) ) {
|
1318 |
$parent_query = array( 'parent in' => $query->query_vars['post_parent__in'] );
|
lib/shortcodes.php
CHANGED
@@ -32,8 +32,6 @@ add_shortcode( 'searchform', 'relevanssi_search_form' );
|
|
32 |
* @return string A link to search results.
|
33 |
*/
|
34 |
function relevanssi_shortcode( $atts, $content ) {
|
35 |
-
global $wpdb;
|
36 |
-
|
37 |
$attributes = shortcode_atts(
|
38 |
array(
|
39 |
'term' => false,
|
32 |
* @return string A link to search results.
|
33 |
*/
|
34 |
function relevanssi_shortcode( $atts, $content ) {
|
|
|
|
|
35 |
$attributes = shortcode_atts(
|
36 |
array(
|
37 |
'term' => false,
|
lib/stopwords.php
CHANGED
@@ -303,3 +303,22 @@ function relevanssi_remove_stopword( $term, $verbose = true ) {
|
|
303 |
|
304 |
return $success;
|
305 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
303 |
|
304 |
return $success;
|
305 |
}
|
306 |
+
|
307 |
+
/**
|
308 |
+
* Helper function to remove stopwords from an array.
|
309 |
+
*
|
310 |
+
* Removes all stopwords from an array of terms. If body stopwords are
|
311 |
+
* available, those will also be removed. The terms must be in the array values.
|
312 |
+
*
|
313 |
+
* @param array $terms An array of terms to clean out.
|
314 |
+
*
|
315 |
+
* @return array An array of terms with stopwords removed.
|
316 |
+
*/
|
317 |
+
function relevanssi_remove_stopwords_from_array( $terms ) {
|
318 |
+
$stopword_list = relevanssi_fetch_stopwords();
|
319 |
+
if ( function_exists( 'relevanssi_fetch_body_stopwords' ) ) {
|
320 |
+
$stopword_list = array_merge( $stopword_list, relevanssi_fetch_body_stopwords() );
|
321 |
+
}
|
322 |
+
$terms_without_stops = array_diff( $terms, $stopword_list );
|
323 |
+
return $terms_without_stops;
|
324 |
+
}
|
lib/uninstall.php
CHANGED
@@ -132,5 +132,8 @@ function relevanssi_uninstall_free() {
|
|
132 |
delete_option( 'relevanssi_taxonomies_to_index' );
|
133 |
delete_option( 'relevanssi_highlight_docs_external' );
|
134 |
|
|
|
|
|
|
|
135 |
relevanssi_drop_database_tables();
|
136 |
}
|
132 |
delete_option( 'relevanssi_taxonomies_to_index' );
|
133 |
delete_option( 'relevanssi_highlight_docs_external' );
|
134 |
|
135 |
+
global $wpdb;
|
136 |
+
$wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key = '_relevanssi_noindex_reason'" );
|
137 |
+
|
138 |
relevanssi_drop_database_tables();
|
139 |
}
|
readme.txt
CHANGED
@@ -5,7 +5,7 @@ Tags: search, relevance, better search
|
|
5 |
Requires at least: 4.9
|
6 |
Tested up to: 5.4
|
7 |
Requires PHP: 5.6
|
8 |
-
Stable tag: 4.7.
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
@@ -133,6 +133,10 @@ Each document database is full of useless words. All the little words that appea
|
|
133 |
* John Calahan for extensive 4.0 beta testing.
|
134 |
|
135 |
== Changelog ==
|
|
|
|
|
|
|
|
|
136 |
= 4.7.0 =
|
137 |
* New feature: New filter hook `relevanssi_admin_search_blocked_post_types` makes it easy to block Relevanssi from searching a specific post type in the admin dashboard. There's built-in support for Reusable Content Blocks `rc_blocks` post type, for example.
|
138 |
* New feature: The reason why a post is not indexed is now stored in the `_relevanssi_noindex_reason` custom field.
|
@@ -170,6 +174,9 @@ Each document database is full of useless words. All the little words that appea
|
|
170 |
* Minor fix: Indexing did not adjust the number of posts indexed at one go like it should.
|
171 |
|
172 |
== Upgrade notice ==
|
|
|
|
|
|
|
173 |
= 4.7.0 =
|
174 |
* The `relevanssi_indexing_restriction` filter hook has been changed, stopwords are handled in a different way in excerpts.
|
175 |
|
5 |
Requires at least: 4.9
|
6 |
Tested up to: 5.4
|
7 |
Requires PHP: 5.6
|
8 |
+
Stable tag: 4.7.1
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
133 |
* John Calahan for extensive 4.0 beta testing.
|
134 |
|
135 |
== Changelog ==
|
136 |
+
= 4.7.1 =
|
137 |
+
* New feature: New filter hook `relevanssi_post_content_after_shortcodes` filters the post content after shortcodes have been processed but before the HTML tags are stripped.
|
138 |
+
* Minor fix: Adds more backwards compatibility for the `relevanssi_indexing_restriction` change.
|
139 |
+
|
140 |
= 4.7.0 =
|
141 |
* New feature: New filter hook `relevanssi_admin_search_blocked_post_types` makes it easy to block Relevanssi from searching a specific post type in the admin dashboard. There's built-in support for Reusable Content Blocks `rc_blocks` post type, for example.
|
142 |
* New feature: The reason why a post is not indexed is now stored in the `_relevanssi_noindex_reason` custom field.
|
174 |
* Minor fix: Indexing did not adjust the number of posts indexed at one go like it should.
|
175 |
|
176 |
== Upgrade notice ==
|
177 |
+
= 4.7.1 =
|
178 |
+
* Improved backwards compatibility for the `relevanssi_indexing_restriction` filter hook change.
|
179 |
+
|
180 |
= 4.7.0 =
|
181 |
* The `relevanssi_indexing_restriction` filter hook has been changed, stopwords are handled in a different way in excerpts.
|
182 |
|
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.7.
|
17 |
* Author: Mikko Saari
|
18 |
* Author URI: http://www.mikkosaari.fi/
|
19 |
* Text Domain: relevanssi
|
@@ -65,7 +65,7 @@ $relevanssi_variables['database_version'] = 5;
|
|
65 |
$relevanssi_variables['file'] = __FILE__;
|
66 |
$relevanssi_variables['plugin_dir'] = plugin_dir_path( __FILE__ );
|
67 |
$relevanssi_variables['plugin_basename'] = plugin_basename( __FILE__ );
|
68 |
-
$relevanssi_variables['plugin_version'] = '4.7.
|
69 |
|
70 |
require_once 'lib/admin-ajax.php';
|
71 |
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.7.1
|
17 |
* Author: Mikko Saari
|
18 |
* Author URI: http://www.mikkosaari.fi/
|
19 |
* Text Domain: relevanssi
|
65 |
$relevanssi_variables['file'] = __FILE__;
|
66 |
$relevanssi_variables['plugin_dir'] = plugin_dir_path( __FILE__ );
|
67 |
$relevanssi_variables['plugin_basename'] = plugin_basename( __FILE__ );
|
68 |
+
$relevanssi_variables['plugin_version'] = '4.7.1';
|
69 |
|
70 |
require_once 'lib/admin-ajax.php';
|
71 |
require_once 'lib/common.php';
|