Version Description
- 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.
- New feature: New filter hook
relevanssi_oxygen_elementis used to filter Oxygen JSON elements. The earlierrelevanssi_oxygen_section_filtersandrelevanssi_oxygen_section_contentfilters are no longer used with Oxygen 4; this hook is the only way to filter Oxygen elements. - 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. - Minor fix: Relevanssi used
the_categoryfilter with too few parameters. The missing parameters have been added. - Minor fix: Stops drafts and pending posts from showing up in Relevanssi Live Ajax Searches.
- Minor fix: Phrases weren't used in some cases where a multiple-word phrase looked like a single-word phrase.
- Minor fix: Prevents fatal errors from
relevanssi_strip_all_tags().
Download this release
Release Info
| Developer | msaari |
| Plugin | |
| Version | 4.16.0 |
| Comparing to | |
| See all releases | |
Code changes from version 4.14.7 to 4.16.0
- changelog.txt +44 -0
- lib/class-relevanssi-taxonomy-walker.php +4 -4
- lib/common.php +57 -3
- lib/compatibility/bricks.php +71 -0
- lib/compatibility/oxygen.php +77 -6
- lib/didyoumean.php +16 -0
- lib/excerpts-highlights.php +10 -4
- lib/indexing.php +4 -0
- lib/init.php +4 -0
- lib/options.php +7 -1
- lib/phrases.php +7 -6
- lib/search-query-restrictions.php +83 -16
- lib/search.php +8 -15
- lib/user-searches.php +5 -1
- lib/utils.php +106 -7
- readme.txt +35 -68
- relevanssi.php +2 -2
changelog.txt
CHANGED
|
@@ -1,3 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
= 4.13.3.1 =
|
| 2 |
* Minor fix: The Bricks compatibility was broken. This version fixes it.
|
| 3 |
|
| 1 |
+
= 4.14.7 =
|
| 2 |
+
* User interface: The synonym settings page now alerts if the synonyms aren't active because of the AND search.
|
| 3 |
+
|
| 4 |
+
= 4.14.6 =
|
| 5 |
+
* Security fix: Extra hardening for AJAX requests. Some AJAX actions in Relevanssi could leak information to site subscribers who knew what to look for.
|
| 6 |
+
|
| 7 |
+
= 4.14.5 =
|
| 8 |
+
* Security fix: Any registered user could empty the Relevanssi index by triggering the index truncate AJAX action. That is no longer possible.
|
| 9 |
+
* New feature: The [searchform] shortcode has a new parameter, 'checklist', which you can use to create taxonomy checklists.
|
| 10 |
+
* Changed behaviour: The `relevanssi_search_again` parameter array has more parameters the filter can modify.
|
| 11 |
+
* Changed behaviour: The `relevanssi_show_matches` filter hook gets the post object as the second parameter.
|
| 12 |
+
* Minor fix: The `cats` and `tags` parameters work better and support array values.
|
| 13 |
+
|
| 14 |
+
= 4.14.4 =
|
| 15 |
+
* Minor fix: `relevanssi_orderby` did not always accept an array-format orderby parameter.
|
| 16 |
+
* Minor fix: Removes a highlighting problem stemming from uppercase search terms.
|
| 17 |
+
* Minor fix: Relevanssi removes highlights better from inside multiline HTML tags.
|
| 18 |
+
* Minor fix: When image attachment indexing was disabled, saving image attachments would still index the images. Image attachment blocking is now a `relevanssi_indexing_restriction` filter function, which means it's always active.
|
| 19 |
+
|
| 20 |
+
= 4.14.3 =
|
| 21 |
+
* Security fix: User searches page had a XSS vulnerability.
|
| 22 |
+
|
| 23 |
+
= 4.14.2 =
|
| 24 |
+
* Minor fix: Remove unnecessary database calls from admin pages.
|
| 25 |
+
* Minor fix: Improved Oxygen compatibility.
|
| 26 |
+
|
| 27 |
+
= 4.14.1 =
|
| 28 |
+
* Adds a missing file.
|
| 29 |
+
|
| 30 |
+
= 4.14.0 =
|
| 31 |
+
* New feature: New filter hook `relevanssi_render_blocks` controls whether Relevanssi renders blocks in a post or not. If you are having problems updating long posts with lots of blocks, having this filter hook return `false` for the post in question will likely help, as rendering the blocks in a long post can take huge amounts of memory.
|
| 32 |
+
* New feature: The user searches page has been improved a lot.
|
| 33 |
+
* New feature: The [searchform] shortcode has a new parameter, 'post_type_boxes', which creates a checkbox for each post type you list in the value. For example [searchform post_type_boxes='*post,page'] would create a search with a checkbox for 'post' and 'page' post types, with 'post' pre-checked.
|
| 34 |
+
* New feature: You can now have multiple dropdowns in one [searchform] shortcode. Anything that begins with 'dropdown' is considered a dropdown parameter, so you can do [searchform dropdown_1='category' dropdown_2='post_tag'] for example.
|
| 35 |
+
* New feature: New filter hook `relevanssi_search_params` lets you filter search parameters after they've been collected from the WP_Query.
|
| 36 |
+
* New feature: New filter hook `relevanssi_excerpt_post` lets you make Relevanssi skip creating excerpts for specific posts.
|
| 37 |
+
* Changed behaviour: Filter hooks `relevanssi_1day`, `relevanssi_7days` and `relevanssi_30days` are removed, as the user searches page is now different. The default value for `relevanssi_user_searches_limit` is now 100 instead of 20.
|
| 38 |
+
* Minor fix: In some languages, iOS uses „“ for quotes. Relevanssi now understands those for the phrase operator.
|
| 39 |
+
* Minor fix: Stops Relevanssi from blocking the admin search for WooCommerce coupons and other WooCommerce custom post types.
|
| 40 |
+
* Minor fix: Fixes problems with the WP-Members compatibility.
|
| 41 |
+
* Minor fix: New parameter for `relevanssi_tokenize()` introduces the context (indexing or search query). The `relevanssi_extract_phrases()` is only used on search queries.
|
| 42 |
+
* Minor fix: Relevanssi won't let you adjust synonyms and stopwords anymore if you use Polylang and are in 'Show all languages' mode.
|
| 43 |
+
* Minor fix: Highlighting is improved by a more precise HTML entity filter, thanks to Jacob Bearce.
|
| 44 |
+
|
| 45 |
= 4.13.3.1 =
|
| 46 |
* Minor fix: The Bricks compatibility was broken. This version fixes it.
|
| 47 |
|
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 |
-
/** 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 |
-
|
|
|
|
| 72 |
}
|
| 73 |
}
|
| 74 |
}
|
| 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 |
/** This filter is documented in wp-includes/category-template.php */
|
| 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 |
+
/** This filter is documented in wp-includes/category-template.php */
|
| 71 |
+
esc_html( apply_filters( 'the_category', $category->name, '', '' ) ) . '</label>';
|
| 72 |
}
|
| 73 |
}
|
| 74 |
}
|
lib/common.php
CHANGED
|
@@ -11,7 +11,7 @@
|
|
| 11 |
/**
|
| 12 |
* Adds the search result match breakdown to the post object.
|
| 13 |
*
|
| 14 |
-
* Reads in the number of matches and stores it in the relevanssi_hits
|
| 15 |
* of the post object. The post object is passed as a reference and modified
|
| 16 |
* on the fly.
|
| 17 |
*
|
|
@@ -28,11 +28,15 @@ function relevanssi_add_matches( &$post, $data ) {
|
|
| 28 |
$hits['author'] = $data['author_matches'][ $post->ID ] ?? 0;
|
| 29 |
$hits['excerpt'] = $data['excerpt_matches'][ $post->ID ] ?? 0;
|
| 30 |
$hits['customfield'] = $data['customfield_matches'][ $post->ID ] ?? 0;
|
| 31 |
-
$hits['mysqlcolumn'] =
|
| 32 |
$hits['score'] = isset( $data['doc_weights'][ $post->ID ] ) ? round( $data['doc_weights'][ $post->ID ], 2 ) : 0;
|
| 33 |
$hits['terms'] = $data['term_hits'][ $post->ID ] ?? array();
|
| 34 |
$hits['missing_terms'] = $data['missing_terms'][ $post->ID ] ?? array();
|
| 35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
arsort( $hits['terms'] );
|
| 37 |
|
| 38 |
$post->relevanssi_hits = $hits;
|
|
@@ -220,7 +224,7 @@ function relevanssi_default_post_ok( $post_ok, $post_id ) {
|
|
| 220 |
apply_filters( 'relevanssi_valid_admin_status', array( 'draft', 'pending', 'future' ) ),
|
| 221 |
true
|
| 222 |
)
|
| 223 |
-
&& is_admin() ) {
|
| 224 |
// Only show drafts, pending and future posts in admin search.
|
| 225 |
$post_ok = true;
|
| 226 |
}
|
|
@@ -1134,6 +1138,9 @@ function relevanssi_common_words( $limit = 25, $wp_cli = false ) {
|
|
| 1134 |
*/
|
| 1135 |
function relevanssi_get_forbidden_post_types() {
|
| 1136 |
return array(
|
|
|
|
|
|
|
|
|
|
| 1137 |
'nav_menu_item', // Navigation menu items.
|
| 1138 |
'revision', // Never index revisions.
|
| 1139 |
'acf', // Advanced Custom Fields.
|
|
@@ -1214,6 +1221,12 @@ function relevanssi_get_forbidden_post_types() {
|
|
| 1214 |
'fl-builder-template', // Beaver Builder.
|
| 1215 |
'itsec-dashboard', // iThemes Security.
|
| 1216 |
'itsec-dash-card', // iThemes Security.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1217 |
);
|
| 1218 |
}
|
| 1219 |
|
|
@@ -1224,6 +1237,7 @@ function relevanssi_get_forbidden_post_types() {
|
|
| 1224 |
*/
|
| 1225 |
function relevanssi_get_forbidden_taxonomies() {
|
| 1226 |
return array(
|
|
|
|
| 1227 |
'nav_menu', // Navigation menus.
|
| 1228 |
'link_category', // Link categories.
|
| 1229 |
'amp_validation_error', // AMP.
|
|
@@ -1717,6 +1731,9 @@ function relevanssi_replace_synonyms_in_terms( array $terms ) : array {
|
|
| 1717 |
function ( $term ) use ( $synonyms ) {
|
| 1718 |
$new_term = array();
|
| 1719 |
foreach ( $synonyms as $pair ) {
|
|
|
|
|
|
|
|
|
|
| 1720 |
list( $key, $value ) = explode( '=', $pair );
|
| 1721 |
if ( $value === $term ) {
|
| 1722 |
$new_term[] = $key;
|
|
@@ -1794,3 +1811,40 @@ function relevanssi_bot_block_list() : array {
|
|
| 1794 |
);
|
| 1795 |
return $bots;
|
| 1796 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
/**
|
| 12 |
* Adds the search result match breakdown to the post object.
|
| 13 |
*
|
| 14 |
+
* Reads in the number of matches and stores it in the relevanssi_hits field
|
| 15 |
* of the post object. The post object is passed as a reference and modified
|
| 16 |
* on the fly.
|
| 17 |
*
|
| 28 |
$hits['author'] = $data['author_matches'][ $post->ID ] ?? 0;
|
| 29 |
$hits['excerpt'] = $data['excerpt_matches'][ $post->ID ] ?? 0;
|
| 30 |
$hits['customfield'] = $data['customfield_matches'][ $post->ID ] ?? 0;
|
| 31 |
+
$hits['mysqlcolumn'] = 0;
|
| 32 |
$hits['score'] = isset( $data['doc_weights'][ $post->ID ] ) ? round( $data['doc_weights'][ $post->ID ], 2 ) : 0;
|
| 33 |
$hits['terms'] = $data['term_hits'][ $post->ID ] ?? array();
|
| 34 |
$hits['missing_terms'] = $data['missing_terms'][ $post->ID ] ?? array();
|
| 35 |
|
| 36 |
+
if ( function_exists( 'relevanssi_premium_add_matches' ) ) {
|
| 37 |
+
relevanssi_premium_add_matches( $hits, $data, $post->ID );
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
arsort( $hits['terms'] );
|
| 41 |
|
| 42 |
$post->relevanssi_hits = $hits;
|
| 224 |
apply_filters( 'relevanssi_valid_admin_status', array( 'draft', 'pending', 'future' ) ),
|
| 225 |
true
|
| 226 |
)
|
| 227 |
+
&& is_admin() && ! relevanssi_is_live_search() ) {
|
| 228 |
// Only show drafts, pending and future posts in admin search.
|
| 229 |
$post_ok = true;
|
| 230 |
}
|
| 1138 |
*/
|
| 1139 |
function relevanssi_get_forbidden_post_types() {
|
| 1140 |
return array(
|
| 1141 |
+
'wp_template_part', // WP template parts.
|
| 1142 |
+
'wp_global_styles', // WP global styles.
|
| 1143 |
+
'wp_navigation', // Navigation menus.
|
| 1144 |
'nav_menu_item', // Navigation menu items.
|
| 1145 |
'revision', // Never index revisions.
|
| 1146 |
'acf', // Advanced Custom Fields.
|
| 1221 |
'fl-builder-template', // Beaver Builder.
|
| 1222 |
'itsec-dashboard', // iThemes Security.
|
| 1223 |
'itsec-dash-card', // iThemes Security.
|
| 1224 |
+
'astra-advanced-hook', // Astra.
|
| 1225 |
+
'astra_adv_header', // Astra.
|
| 1226 |
+
'astra_adv_header', // Astra.
|
| 1227 |
+
'udb_widgets', // Ultimate Dashboard.
|
| 1228 |
+
'udb_admin_page', // Ultimate Dashboard.
|
| 1229 |
+
'oxy_user_library', // Oxygen.
|
| 1230 |
);
|
| 1231 |
}
|
| 1232 |
|
| 1237 |
*/
|
| 1238 |
function relevanssi_get_forbidden_taxonomies() {
|
| 1239 |
return array(
|
| 1240 |
+
'wp_template_part_area', // WP templates.
|
| 1241 |
'nav_menu', // Navigation menus.
|
| 1242 |
'link_category', // Link categories.
|
| 1243 |
'amp_validation_error', // AMP.
|
| 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;
|
| 1811 |
);
|
| 1812 |
return $bots;
|
| 1813 |
}
|
| 1814 |
+
|
| 1815 |
+
/**
|
| 1816 |
+
* Removes unwanted metadata fields from custom field indexing.
|
| 1817 |
+
*
|
| 1818 |
+
* This function hooks on to relevanssi_index_custom_fields and stops Relevanssi
|
| 1819 |
+
* from indexing a bunch of custom fields than only contain metadata that is
|
| 1820 |
+
* not useful to index.
|
| 1821 |
+
*
|
| 1822 |
+
* @param array $custom_fields A list of custom field names.
|
| 1823 |
+
*
|
| 1824 |
+
* @return @array The custom fields with the excluded fields removed.
|
| 1825 |
+
*/
|
| 1826 |
+
function relevanssi_remove_metadata_fields( array $custom_fields ) : array {
|
| 1827 |
+
$excluded_fields = array(
|
| 1828 |
+
'_edit_last',
|
| 1829 |
+
'_edit_lock',
|
| 1830 |
+
'_encloseme',
|
| 1831 |
+
'_pingme',
|
| 1832 |
+
'_relevanssi_hide_content',
|
| 1833 |
+
'_relevanssi_hide_content',
|
| 1834 |
+
'_relevanssi_hide_post',
|
| 1835 |
+
'_relevanssi_pin_for_all',
|
| 1836 |
+
'_relevanssi_pin_keywords',
|
| 1837 |
+
'_relevanssi_related_exclude_ids',
|
| 1838 |
+
'_relevanssi_related_include_ids',
|
| 1839 |
+
'_relevanssi_related_keywords',
|
| 1840 |
+
'_relevanssi_related_no_append',
|
| 1841 |
+
'_relevanssi_related_not_related',
|
| 1842 |
+
'_relevanssi_related_posts',
|
| 1843 |
+
'_relevanssi_unpin_keywords',
|
| 1844 |
+
'_thumbnail_id',
|
| 1845 |
+
'_wp_attachment_metadata',
|
| 1846 |
+
'_wp_page_template',
|
| 1847 |
+
'classic-editor-remember',
|
| 1848 |
+
);
|
| 1849 |
+
return array_diff( $custom_fields, $excluded_fields );
|
| 1850 |
+
}
|
lib/compatibility/bricks.php
CHANGED
|
@@ -11,6 +11,10 @@
|
|
| 11 |
*/
|
| 12 |
|
| 13 |
add_filter( 'bricks/posts/query_vars', 'relevanssi_bricks_enable', 10 );
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
/**
|
| 16 |
* Enables Relevanssi in the query when the 's' query var is set.
|
|
@@ -25,3 +29,70 @@ function relevanssi_bricks_enable( $query_vars ) {
|
|
| 25 |
}
|
| 26 |
return $query_vars;
|
| 27 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
*/
|
| 12 |
|
| 13 |
add_filter( 'bricks/posts/query_vars', 'relevanssi_bricks_enable', 10 );
|
| 14 |
+
add_filter( 'relevanssi_custom_field_value', 'relevanssi_bricks_values', 10, 3 );
|
| 15 |
+
add_filter( 'relevanssi_index_custom_fields', 'relevanssi_add_bricks' );
|
| 16 |
+
add_filter( 'option_relevanssi_index_fields', 'relevanssi_bricks_fix_none_setting' );
|
| 17 |
+
add_action( 'save_post', 'relevanssi_insert_edit', 99, 1 );
|
| 18 |
|
| 19 |
/**
|
| 20 |
* Enables Relevanssi in the query when the 's' query var is set.
|
| 29 |
}
|
| 30 |
return $query_vars;
|
| 31 |
}
|
| 32 |
+
|
| 33 |
+
/**
|
| 34 |
+
* Adds the `_bricks_page_content_2` to the list of indexed custom fields.
|
| 35 |
+
*
|
| 36 |
+
* @param array|boolean $fields An array of custom fields to index, or false.
|
| 37 |
+
*
|
| 38 |
+
* @return array An array of custom fields, including `_bricks_page_content_2`.
|
| 39 |
+
*/
|
| 40 |
+
function relevanssi_add_bricks( $fields ) {
|
| 41 |
+
if ( ! is_array( $fields ) ) {
|
| 42 |
+
$fields = array();
|
| 43 |
+
}
|
| 44 |
+
if ( ! in_array( '_bricks_page_content_2', $fields, true ) ) {
|
| 45 |
+
$fields[] = '_bricks_page_content_2';
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
return $fields;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
/**
|
| 52 |
+
* Includes only text from _bricks_page_content_2 custom field.
|
| 53 |
+
*
|
| 54 |
+
* This function goes through the multilevel array of _bricks_page_content_2
|
| 55 |
+
* and only picks up the "text" elements inside it, discarding everything else.
|
| 56 |
+
*
|
| 57 |
+
* @param array $value An array of custom field values.
|
| 58 |
+
* @param string $field The name of the custom field.
|
| 59 |
+
* @param int $post_id The post ID.
|
| 60 |
+
*
|
| 61 |
+
* @return array An array containing a string with all the values concatenated
|
| 62 |
+
* together.
|
| 63 |
+
*/
|
| 64 |
+
function relevanssi_bricks_values( $value, $field, $post_id ) {
|
| 65 |
+
if ( '_bricks_page_content_2' !== $field ) {
|
| 66 |
+
return $value;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
$content = '';
|
| 70 |
+
array_walk_recursive(
|
| 71 |
+
$value,
|
| 72 |
+
function( $text, $key ) use ( &$content ) {
|
| 73 |
+
if ( 'text' === $key ) {
|
| 74 |
+
$content .= ' ' . $text;
|
| 75 |
+
}
|
| 76 |
+
}
|
| 77 |
+
);
|
| 78 |
+
|
| 79 |
+
return array( $content );
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
/**
|
| 83 |
+
* Makes sure the Bricks builder shortcode is included in the index, even when
|
| 84 |
+
* the custom field setting is set to 'none'.
|
| 85 |
+
*
|
| 86 |
+
* @param string $value The custom field indexing setting value. The parameter
|
| 87 |
+
* is ignored, Relevanssi disables this filter and then checks the option to
|
| 88 |
+
* see what the value is.
|
| 89 |
+
*
|
| 90 |
+
* @return string If value is undefined, it's set to '_bricks_page_content_2'.
|
| 91 |
+
*/
|
| 92 |
+
function relevanssi_bricks_fix_none_setting( $value ) {
|
| 93 |
+
if ( ! $value ) {
|
| 94 |
+
$value = '_bricks_page_content_2';
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
return $value;
|
| 98 |
+
}
|
lib/compatibility/oxygen.php
CHANGED
|
@@ -35,6 +35,23 @@ 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_shortcodes_revisions_dates' === $field ) {
|
| 39 |
return '';
|
| 40 |
}
|
|
@@ -42,6 +59,9 @@ function relevanssi_oxygen_compatibility( $value, $field, $post_id ) {
|
|
| 42 |
return '';
|
| 43 |
}
|
| 44 |
if ( 'ct_builder_shortcodes' === $field ) {
|
|
|
|
|
|
|
|
|
|
| 45 |
if ( empty( $value ) ) {
|
| 46 |
return null;
|
| 47 |
}
|
|
@@ -118,18 +138,66 @@ function relevanssi_oxygen_compatibility( $value, $field, $post_id ) {
|
|
| 118 |
}
|
| 119 |
|
| 120 |
/**
|
| 121 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 `
|
|
|
|
| 126 |
*/
|
| 127 |
function relevanssi_add_oxygen( $fields ) {
|
|
|
|
|
|
|
|
|
|
| 128 |
if ( ! is_array( $fields ) ) {
|
| 129 |
$fields = array();
|
| 130 |
}
|
| 131 |
-
if ( ! in_array(
|
| 132 |
-
$fields[] =
|
| 133 |
}
|
| 134 |
|
| 135 |
return $fields;
|
|
@@ -143,11 +211,14 @@ function relevanssi_add_oxygen( $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 '
|
|
|
|
| 147 |
*/
|
| 148 |
function relevanssi_oxygen_fix_none_setting( $value ) {
|
| 149 |
if ( ! $value ) {
|
| 150 |
-
$value = '
|
|
|
|
|
|
|
| 151 |
}
|
| 152 |
|
| 153 |
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_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 |
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 |
}
|
| 139 |
|
| 140 |
/**
|
| 141 |
+
* Recursively processes the Oxygen JSON data.
|
| 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 `ct_builder_json` or
|
| 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( $oxygen_field, $fields, true ) ) {
|
| 200 |
+
$fields[] = $oxygen_field;
|
| 201 |
}
|
| 202 |
|
| 203 |
return $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 'ct_builder_json' or
|
| 215 |
+
* 'ct_builder_shortcodes'.
|
| 216 |
*/
|
| 217 |
function relevanssi_oxygen_fix_none_setting( $value ) {
|
| 218 |
if ( ! $value ) {
|
| 219 |
+
$value = version_compare( CT_VERSION, '4.0', '>=' )
|
| 220 |
+
? 'ct_builder_json'
|
| 221 |
+
: 'ct_builder_shortcodes';
|
| 222 |
}
|
| 223 |
|
| 224 |
return $value;
|
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/indexing.php
CHANGED
|
@@ -1460,6 +1460,10 @@ function relevanssi_index_content( &$insert_data, $post_object, $min_word_length
|
|
| 1460 |
return $n;
|
| 1461 |
}
|
| 1462 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1463 |
if ( $debug ) {
|
| 1464 |
relevanssi_debug_echo( 'Indexing post content.' );
|
| 1465 |
}
|
| 1460 |
return $n;
|
| 1461 |
}
|
| 1462 |
|
| 1463 |
+
if ( 'on' === get_post_meta( $post_object->ID, '_relevanssi_hide_content', true ) ) {
|
| 1464 |
+
return $n;
|
| 1465 |
+
}
|
| 1466 |
+
|
| 1467 |
if ( $debug ) {
|
| 1468 |
relevanssi_debug_echo( 'Indexing post content.' );
|
| 1469 |
}
|
lib/init.php
CHANGED
|
@@ -43,12 +43,14 @@ 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', 'relevanssi_remove_punct' );
|
| 47 |
add_filter( 'relevanssi_post_ok', 'relevanssi_default_post_ok', 9, 2 );
|
| 48 |
add_filter( 'relevanssi_query_filter', 'relevanssi_limit_filter' );
|
| 49 |
add_action( 'relevanssi_trim_logs', 'relevanssi_trim_logs' );
|
| 50 |
add_action( 'relevanssi_update_counts', 'relevanssi_update_counts' );
|
| 51 |
add_action( 'relevanssi_custom_field_value', 'relevanssi_filter_custom_fields', 10, 2 );
|
|
|
|
| 52 |
|
| 53 |
// Excerpts and highlights.
|
| 54 |
add_action( 'relevanssi_pre_the_content', 'relevanssi_kill_autoembed' );
|
|
@@ -167,6 +169,8 @@ function relevanssi_init() {
|
|
| 167 |
// style to new style. Remove eventually.
|
| 168 |
relevanssi_update_synonyms_setting();
|
| 169 |
}
|
|
|
|
|
|
|
| 170 |
}
|
| 171 |
|
| 172 |
/**
|
| 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' );
|
| 50 |
add_action( 'relevanssi_trim_logs', 'relevanssi_trim_logs' );
|
| 51 |
add_action( 'relevanssi_update_counts', 'relevanssi_update_counts' );
|
| 52 |
add_action( 'relevanssi_custom_field_value', 'relevanssi_filter_custom_fields', 10, 2 );
|
| 53 |
+
add_filter( 'relevanssi_index_custom_fields', 'relevanssi_remove_metadata_fields' );
|
| 54 |
|
| 55 |
// Excerpts and highlights.
|
| 56 |
add_action( 'relevanssi_pre_the_content', 'relevanssi_kill_autoembed' );
|
| 169 |
// style to new style. Remove eventually.
|
| 170 |
relevanssi_update_synonyms_setting();
|
| 171 |
}
|
| 172 |
+
|
| 173 |
+
do_action( 'relevanssi_init' );
|
| 174 |
}
|
| 175 |
|
| 176 |
/**
|
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
|
@@ -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,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(
|
| 48 |
$phrase = trim( $phrase );
|
| 49 |
|
| 50 |
// Do not count single-word phrases as phrases.
|
| 51 |
+
if ( relevanssi_is_multiple_words( $phrase ) ) {
|
| 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 |
+
$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
|
@@ -101,14 +101,14 @@ function relevanssi_process_query_args( $args ) {
|
|
| 101 |
/**
|
| 102 |
* Processes the 'in' and 'not in' parameters to MySQL query restrictions.
|
| 103 |
*
|
| 104 |
-
* Checks that the parameters are integers and formulates a MySQL query
|
| 105 |
-
* from them. If the same posts are both included and excluded,
|
| 106 |
-
* precedence.
|
| 107 |
*
|
| 108 |
* Tested.
|
| 109 |
*
|
| 110 |
-
* @param array $post_query An array where included posts are in
|
| 111 |
-
* and excluded posts are in $post_query['not in'].
|
| 112 |
*
|
| 113 |
* @return string MySQL query restrictions matching the array.
|
| 114 |
*/
|
|
@@ -142,7 +142,16 @@ function relevanssi_process_post_query( $post_query ) {
|
|
| 142 |
// Clean: $posts is checked to be integers.
|
| 143 |
}
|
| 144 |
}
|
| 145 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 146 |
}
|
| 147 |
|
| 148 |
/**
|
|
@@ -192,7 +201,15 @@ function relevanssi_process_parent_query( $parent_query ) {
|
|
| 192 |
}
|
| 193 |
}
|
| 194 |
|
| 195 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
}
|
| 197 |
|
| 198 |
/**
|
|
@@ -269,7 +286,16 @@ function relevanssi_process_date_query( $date_query ) {
|
|
| 269 |
// Clean: $sql generated by $date_query->get_sql() query.
|
| 270 |
}
|
| 271 |
}
|
| 272 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 273 |
}
|
| 274 |
|
| 275 |
/**
|
|
@@ -341,7 +367,15 @@ function relevanssi_process_author( $author ) {
|
|
| 341 |
// Clean: $authors is always just numbers.
|
| 342 |
}
|
| 343 |
|
| 344 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 345 |
}
|
| 346 |
|
| 347 |
/**
|
|
@@ -354,15 +388,15 @@ function relevanssi_process_author( $author ) {
|
|
| 354 |
*
|
| 355 |
* @global object $wpdb The WP database interface.
|
| 356 |
*
|
| 357 |
-
* @param string $
|
| 358 |
*
|
| 359 |
* @return string The MySQL query restriction.
|
| 360 |
*/
|
| 361 |
-
function relevanssi_process_by_date( $
|
| 362 |
global $wpdb;
|
| 363 |
$query_restrictions = '';
|
| 364 |
|
| 365 |
-
$u = substr( $
|
| 366 |
switch ( $u ) {
|
| 367 |
case 'h':
|
| 368 |
$unit = 'HOUR';
|
|
@@ -383,7 +417,7 @@ function relevanssi_process_by_date( $n ) {
|
|
| 383 |
$unit = 'DAY';
|
| 384 |
}
|
| 385 |
|
| 386 |
-
$n = preg_replace( '/[hdmyw]/', '', $
|
| 387 |
|
| 388 |
if ( is_numeric( $n ) ) {
|
| 389 |
$query_restrictions .= " AND relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts
|
|
@@ -391,7 +425,15 @@ function relevanssi_process_by_date( $n ) {
|
|
| 391 |
// Clean: $n is always numeric, $unit is Relevanssi-generated.
|
| 392 |
}
|
| 393 |
|
| 394 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 395 |
}
|
| 396 |
|
| 397 |
/**
|
|
@@ -493,7 +535,17 @@ function relevanssi_process_post_type( $post_type, $admin_search, $include_attac
|
|
| 493 |
// Clean: $negative_post_type is escaped.
|
| 494 |
}
|
| 495 |
|
| 496 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 497 |
}
|
| 498 |
|
| 499 |
/**
|
|
@@ -527,7 +579,14 @@ function relevanssi_process_post_status( $post_status ) {
|
|
| 527 |
}
|
| 528 |
|
| 529 |
if ( $escaped_post_status ) {
|
|
|
|
| 530 |
if ( $wp_query->is_admin || $relevanssi_admin_test ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 531 |
$query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts
|
| 532 |
WHERE posts.post_status IN ($escaped_post_status))))";
|
| 533 |
} else {
|
|
@@ -537,7 +596,15 @@ function relevanssi_process_post_status( $post_status ) {
|
|
| 537 |
}
|
| 538 |
}
|
| 539 |
|
| 540 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 541 |
}
|
| 542 |
|
| 543 |
/**
|
| 101 |
/**
|
| 102 |
* Processes the 'in' and 'not in' parameters to MySQL query restrictions.
|
| 103 |
*
|
| 104 |
+
* Checks that the parameters are integers and formulates a MySQL query
|
| 105 |
+
* restriction from them. If the same posts are both included and excluded,
|
| 106 |
+
* exclusion will take precedence.
|
| 107 |
*
|
| 108 |
* Tested.
|
| 109 |
*
|
| 110 |
+
* @param array $post_query An array where included posts are in
|
| 111 |
+
* $post_query['in'] and excluded posts are in $post_query['not in'].
|
| 112 |
*
|
| 113 |
* @return string MySQL query restrictions matching the array.
|
| 114 |
*/
|
| 142 |
// Clean: $posts is checked to be integers.
|
| 143 |
}
|
| 144 |
}
|
| 145 |
+
|
| 146 |
+
/**
|
| 147 |
+
* Filters the MySQL query for restricting the search by post parameters.
|
| 148 |
+
*
|
| 149 |
+
* @param string $query_restrictions The MySQL query.
|
| 150 |
+
* @param array $post_query The post query parameters.
|
| 151 |
+
*
|
| 152 |
+
* @return string The MySQL query.
|
| 153 |
+
*/
|
| 154 |
+
return apply_filters( 'relevanssi_post_query_filter', $query_restrictions, $post_query );
|
| 155 |
}
|
| 156 |
|
| 157 |
/**
|
| 201 |
}
|
| 202 |
}
|
| 203 |
|
| 204 |
+
/**
|
| 205 |
+
* Filters the MySQL query for restricting the search by the post parent.
|
| 206 |
+
*
|
| 207 |
+
* @param string $query_restrictions The MySQL query.
|
| 208 |
+
* @param array $parent_query The parent query parameters.
|
| 209 |
+
*
|
| 210 |
+
* @return string The MySQL query.
|
| 211 |
+
*/
|
| 212 |
+
return apply_filters( 'relevanssi_parent_query_filter', $query_restrictions, $parent_query );
|
| 213 |
}
|
| 214 |
|
| 215 |
/**
|
| 286 |
// Clean: $sql generated by $date_query->get_sql() query.
|
| 287 |
}
|
| 288 |
}
|
| 289 |
+
|
| 290 |
+
/**
|
| 291 |
+
* Filters the MySQL query for restricting the search by the date_query.
|
| 292 |
+
*
|
| 293 |
+
* @param string $query_restrictions The MySQL query.
|
| 294 |
+
* @param WP_Date_Query $date_query The date_query object.
|
| 295 |
+
*
|
| 296 |
+
* @return string The MySQL query.
|
| 297 |
+
*/
|
| 298 |
+
return apply_filters( 'relevanssi_date_query_filter', $query_restrictions, $date_query );
|
| 299 |
}
|
| 300 |
|
| 301 |
/**
|
| 367 |
// Clean: $authors is always just numbers.
|
| 368 |
}
|
| 369 |
|
| 370 |
+
/**
|
| 371 |
+
* Filters the MySQL query for restricting the search by the post author.
|
| 372 |
+
*
|
| 373 |
+
* @param string $query_restrictions The MySQL query.
|
| 374 |
+
* @param array $author An array of author IDs.
|
| 375 |
+
*
|
| 376 |
+
* @return string The MySQL query.
|
| 377 |
+
*/
|
| 378 |
+
return apply_filters( 'relevanssi_author_query_filter', $query_restrictions, $author );
|
| 379 |
}
|
| 380 |
|
| 381 |
/**
|
| 388 |
*
|
| 389 |
* @global object $wpdb The WP database interface.
|
| 390 |
*
|
| 391 |
+
* @param string $by_date The date parameter.
|
| 392 |
*
|
| 393 |
* @return string The MySQL query restriction.
|
| 394 |
*/
|
| 395 |
+
function relevanssi_process_by_date( $by_date ) {
|
| 396 |
global $wpdb;
|
| 397 |
$query_restrictions = '';
|
| 398 |
|
| 399 |
+
$u = substr( $by_date, -1, 1 );
|
| 400 |
switch ( $u ) {
|
| 401 |
case 'h':
|
| 402 |
$unit = 'HOUR';
|
| 417 |
$unit = 'DAY';
|
| 418 |
}
|
| 419 |
|
| 420 |
+
$n = preg_replace( '/[hdmyw]/', '', $by_date );
|
| 421 |
|
| 422 |
if ( is_numeric( $n ) ) {
|
| 423 |
$query_restrictions .= " AND relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts
|
| 425 |
// Clean: $n is always numeric, $unit is Relevanssi-generated.
|
| 426 |
}
|
| 427 |
|
| 428 |
+
/**
|
| 429 |
+
* Filters the MySQL query for restricting the search by the by_date.
|
| 430 |
+
*
|
| 431 |
+
* @param string $query_restrictions The MySQL query.
|
| 432 |
+
* @param string $by_date The by_date parameter.
|
| 433 |
+
*
|
| 434 |
+
* @return string The MySQL query.
|
| 435 |
+
*/
|
| 436 |
+
return apply_filters( 'relevanssi_by_date_query_filter', $query_restrictions, $by_date );
|
| 437 |
}
|
| 438 |
|
| 439 |
/**
|
| 535 |
// Clean: $negative_post_type is escaped.
|
| 536 |
}
|
| 537 |
|
| 538 |
+
/**
|
| 539 |
+
* Filters the MySQL query for restricting the search by the post type.
|
| 540 |
+
*
|
| 541 |
+
* @param string $query_restrictions The MySQL query.
|
| 542 |
+
* @param string|array $post_type The post type(s).
|
| 543 |
+
* @param boolean $include_attachments True if attachments are allowed.
|
| 544 |
+
* @param boolean $admin_search True if this is an admin search.
|
| 545 |
+
*
|
| 546 |
+
* @return string The MySQL query.
|
| 547 |
+
*/
|
| 548 |
+
return apply_filters( 'relevanssi_post_type_query_filter', $query_restrictions, $post_type, $include_attachments, $admin_search );
|
| 549 |
}
|
| 550 |
|
| 551 |
/**
|
| 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 {
|
| 596 |
}
|
| 597 |
}
|
| 598 |
|
| 599 |
+
/**
|
| 600 |
+
* Filters the MySQL query for restricting the search by the post status.
|
| 601 |
+
*
|
| 602 |
+
* @param string $query_restrictions The MySQL query.
|
| 603 |
+
* @param string $post_status The post status(es).
|
| 604 |
+
*
|
| 605 |
+
* @return string The MySQL query.
|
| 606 |
+
*/
|
| 607 |
+
return apply_filters( 'relevanssi_post_status_query_filter', $query_restrictions, $post_status );
|
| 608 |
}
|
| 609 |
|
| 610 |
/**
|
lib/search.php
CHANGED
|
@@ -528,6 +528,9 @@ function relevanssi_search( $args ) {
|
|
| 528 |
'missing_terms' => $missing_terms,
|
| 529 |
);
|
| 530 |
|
|
|
|
|
|
|
|
|
|
| 531 |
return $return;
|
| 532 |
}
|
| 533 |
|
|
@@ -589,14 +592,15 @@ function relevanssi_do_query( &$query ) {
|
|
| 589 |
* One of the key filters for Relevanssi. If you want to modify the results
|
| 590 |
* Relevanssi finds, use this filter.
|
| 591 |
*
|
| 592 |
-
* @param array
|
| 593 |
* post IDs, or parent=>ID pairs, depending on the `fields` parameter) found
|
| 594 |
* in the search, index 1 has the search query string.
|
|
|
|
| 595 |
*
|
| 596 |
* @return array The return array composition is the same as the parameter
|
| 597 |
* array, but Relevanssi only uses the index 0.
|
| 598 |
*/
|
| 599 |
-
$hits_filters_applied = apply_filters( 'relevanssi_hits_filter', $filter_data );
|
| 600 |
// array_values() to make sure the $hits array is indexed in numerical order
|
| 601 |
// Manipulating the array with array_unique() for example may mess with that.
|
| 602 |
$hits = array_values( $hits_filters_applied[0] );
|
|
@@ -1439,21 +1443,10 @@ function relevanssi_update_term_hits( &$term_hits, &$match_arrays, $match, $term
|
|
| 1439 |
relevanssi_increase_value( $match_arrays['customfield'][ $match->doc ], $match->customfield );
|
| 1440 |
relevanssi_increase_value( $match_arrays['author'][ $match->doc ], $match->author );
|
| 1441 |
relevanssi_increase_value( $match_arrays['excerpt'][ $match->doc ], $match->excerpt );
|
| 1442 |
-
relevanssi_increase_value( $match_arrays['mysqlcolumn'][ $match->doc ], $match->mysqlcolumn );
|
| 1443 |
-
}
|
| 1444 |
|
| 1445 |
-
|
| 1446 |
-
|
| 1447 |
-
*
|
| 1448 |
-
* @param int $value The value to increase (passed by reference).
|
| 1449 |
-
* @param int $increase The amount to increase the value, default 1.
|
| 1450 |
-
* @param int $default The default value, default 0.
|
| 1451 |
-
*/
|
| 1452 |
-
function relevanssi_increase_value( &$value, $increase = 1, $default = 0 ) {
|
| 1453 |
-
if ( ! isset( $value ) ) {
|
| 1454 |
-
$value = $default;
|
| 1455 |
}
|
| 1456 |
-
$value += $increase;
|
| 1457 |
}
|
| 1458 |
|
| 1459 |
/**
|
| 528 |
'missing_terms' => $missing_terms,
|
| 529 |
);
|
| 530 |
|
| 531 |
+
if ( function_exists( 'relevanssi_premium_update_return_array' ) ) {
|
| 532 |
+
relevanssi_premium_update_return_array( $return, $match_arrays );
|
| 533 |
+
}
|
| 534 |
return $return;
|
| 535 |
}
|
| 536 |
|
| 592 |
* One of the key filters for Relevanssi. If you want to modify the results
|
| 593 |
* Relevanssi finds, use this filter.
|
| 594 |
*
|
| 595 |
+
* @param array $filter_data The index 0 has an array of post objects (or
|
| 596 |
* post IDs, or parent=>ID pairs, depending on the `fields` parameter) found
|
| 597 |
* in the search, index 1 has the search query string.
|
| 598 |
+
* @param WP_Query $query The WP_Query object.
|
| 599 |
*
|
| 600 |
* @return array The return array composition is the same as the parameter
|
| 601 |
* array, but Relevanssi only uses the index 0.
|
| 602 |
*/
|
| 603 |
+
$hits_filters_applied = apply_filters( 'relevanssi_hits_filter', $filter_data, $query );
|
| 604 |
// array_values() to make sure the $hits array is indexed in numerical order
|
| 605 |
// Manipulating the array with array_unique() for example may mess with that.
|
| 606 |
$hits = array_values( $hits_filters_applied[0] );
|
| 1443 |
relevanssi_increase_value( $match_arrays['customfield'][ $match->doc ], $match->customfield );
|
| 1444 |
relevanssi_increase_value( $match_arrays['author'][ $match->doc ], $match->author );
|
| 1445 |
relevanssi_increase_value( $match_arrays['excerpt'][ $match->doc ], $match->excerpt );
|
|
|
|
|
|
|
| 1446 |
|
| 1447 |
+
if ( function_exists( 'relevanssi_premium_update_term_hits' ) ) {
|
| 1448 |
+
relevanssi_premium_update_term_hits( $term_hits, $match_arrays, $match, $term );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1449 |
}
|
|
|
|
| 1450 |
}
|
| 1451 |
|
| 1452 |
/**
|
lib/user-searches.php
CHANGED
|
@@ -249,7 +249,11 @@ function relevanssi_date_queries( string $from, string $to, string $version = 'g
|
|
| 249 |
global $wpdb, $relevanssi_variables;
|
| 250 |
$log_table = $relevanssi_variables['log_table'];
|
| 251 |
|
| 252 |
-
/**
|
|
|
|
|
|
|
|
|
|
|
|
|
| 253 |
$limit = apply_filters( 'relevanssi_user_searches_limit', 100 );
|
| 254 |
|
| 255 |
if ( 'good' === $version ) {
|
| 249 |
global $wpdb, $relevanssi_variables;
|
| 250 |
$log_table = $relevanssi_variables['log_table'];
|
| 251 |
|
| 252 |
+
/**
|
| 253 |
+
* Filters the number of most common queries to show.
|
| 254 |
+
*
|
| 255 |
+
* @param int The number of most common queries to show, default 100.
|
| 256 |
+
*/
|
| 257 |
$limit = apply_filters( 'relevanssi_user_searches_limit', 100 );
|
| 258 |
|
| 259 |
if ( 'good' === $version ) {
|
lib/utils.php
CHANGED
|
@@ -440,17 +440,19 @@ function relevanssi_get_current_language( bool $locale = true ) {
|
|
| 440 |
* Uses get_permalink() to get the permalink, then adds the 'highlight'
|
| 441 |
* parameter if necessary using relevanssi_add_highlight().
|
| 442 |
*
|
|
|
|
|
|
|
| 443 |
* @see get_permalink()
|
| 444 |
*
|
| 445 |
* @return string The permalink.
|
| 446 |
*/
|
| 447 |
-
function relevanssi_get_permalink() {
|
| 448 |
/**
|
| 449 |
* Filters the permalink.
|
| 450 |
*
|
| 451 |
* @param string The permalink, generated by get_permalink().
|
| 452 |
*/
|
| 453 |
-
$permalink = apply_filters( 'relevanssi_permalink', get_permalink() );
|
| 454 |
|
| 455 |
return $permalink;
|
| 456 |
}
|
|
@@ -665,6 +667,20 @@ function relevanssi_implode( array $request, string $option, string $glue = ','
|
|
| 665 |
return '';
|
| 666 |
}
|
| 667 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 668 |
/**
|
| 669 |
* Returns the intval of the option if it exists, null otherwise.
|
| 670 |
*
|
|
@@ -682,6 +698,85 @@ function relevanssi_intval( array $request, string $option ) {
|
|
| 682 |
return null;
|
| 683 |
}
|
| 684 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 685 |
/**
|
| 686 |
* Launches an asynchronous Ajax action.
|
| 687 |
*
|
|
@@ -991,9 +1086,10 @@ function relevanssi_strip_all_tags( $content ) : string {
|
|
| 991 |
if ( ! is_string( $content ) ) {
|
| 992 |
$content = '';
|
| 993 |
}
|
| 994 |
-
$content = preg_replace( '/<!--.*?-->/
|
| 995 |
-
$content = preg_replace( '/<[!a-zA-Z\/][^>].*?>/
|
| 996 |
-
|
|
|
|
| 997 |
}
|
| 998 |
|
| 999 |
/**
|
|
@@ -1059,6 +1155,7 @@ function relevanssi_strip_tags( $content ) {
|
|
| 1059 |
'/(<\/?hr.*?>)/',
|
| 1060 |
'/(<\/?li.*?>)/',
|
| 1061 |
'/(<img.*?>)/',
|
|
|
|
| 1062 |
);
|
| 1063 |
|
| 1064 |
$content = preg_replace( $space_tags, '$1 ', $content );
|
|
@@ -1238,10 +1335,12 @@ function relevanssi_the_excerpt() {
|
|
| 1238 |
* Uses get_permalink() to get the permalink, then adds the 'highlight'
|
| 1239 |
* parameter if necessary using relevanssi_add_highlight(), then echoes it out.
|
| 1240 |
*
|
|
|
|
|
|
|
| 1241 |
* @uses relevanssi_get_permalink() Fetches the current post permalink.
|
| 1242 |
*/
|
| 1243 |
-
function relevanssi_the_permalink() {
|
| 1244 |
-
echo esc_url( relevanssi_get_permalink() );
|
| 1245 |
}
|
| 1246 |
|
| 1247 |
/**
|
| 440 |
* Uses get_permalink() to get the permalink, then adds the 'highlight'
|
| 441 |
* parameter if necessary using relevanssi_add_highlight().
|
| 442 |
*
|
| 443 |
+
* @param int|WP_Post $post Post ID or post object. Default is the global $post.
|
| 444 |
+
*
|
| 445 |
* @see get_permalink()
|
| 446 |
*
|
| 447 |
* @return string The permalink.
|
| 448 |
*/
|
| 449 |
+
function relevanssi_get_permalink( $post = 0 ) {
|
| 450 |
/**
|
| 451 |
* Filters the permalink.
|
| 452 |
*
|
| 453 |
* @param string The permalink, generated by get_permalink().
|
| 454 |
*/
|
| 455 |
+
$permalink = apply_filters( 'relevanssi_permalink', get_permalink( $post ) );
|
| 456 |
|
| 457 |
return $permalink;
|
| 458 |
}
|
| 667 |
return '';
|
| 668 |
}
|
| 669 |
|
| 670 |
+
/**
|
| 671 |
+
* Increases a value. If it's not set, sets it first to the default value.
|
| 672 |
+
*
|
| 673 |
+
* @param int $value The value to increase (passed by reference).
|
| 674 |
+
* @param int $increase The amount to increase the value, default 1.
|
| 675 |
+
* @param int $default The default value, default 0.
|
| 676 |
+
*/
|
| 677 |
+
function relevanssi_increase_value( &$value, $increase = 1, $default = 0 ) {
|
| 678 |
+
if ( ! isset( $value ) ) {
|
| 679 |
+
$value = $default;
|
| 680 |
+
}
|
| 681 |
+
$value += $increase;
|
| 682 |
+
}
|
| 683 |
+
|
| 684 |
/**
|
| 685 |
* Returns the intval of the option if it exists, null otherwise.
|
| 686 |
*
|
| 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 |
if ( ! is_string( $content ) ) {
|
| 1087 |
$content = '';
|
| 1088 |
}
|
| 1089 |
+
$content = preg_replace( '/<!--.*?-->/ums', '', $content );
|
| 1090 |
+
$content = preg_replace( '/<[!a-zA-Z\/][^>].*?>/ums', ' ', $content );
|
| 1091 |
+
|
| 1092 |
+
return $content ?? '';
|
| 1093 |
}
|
| 1094 |
|
| 1095 |
/**
|
| 1155 |
'/(<\/?hr.*?>)/',
|
| 1156 |
'/(<\/?li.*?>)/',
|
| 1157 |
'/(<img.*?>)/',
|
| 1158 |
+
'/(<\/td>)/',
|
| 1159 |
);
|
| 1160 |
|
| 1161 |
$content = preg_replace( $space_tags, '$1 ', $content );
|
| 1335 |
* Uses get_permalink() to get the permalink, then adds the 'highlight'
|
| 1336 |
* parameter if necessary using relevanssi_add_highlight(), then echoes it out.
|
| 1337 |
*
|
| 1338 |
+
* @param int|WP_Post $post Post ID or post object. Default is the global $post.
|
| 1339 |
+
*
|
| 1340 |
* @uses relevanssi_get_permalink() Fetches the current post permalink.
|
| 1341 |
*/
|
| 1342 |
+
function relevanssi_the_permalink( $post = 0 ) {
|
| 1343 |
+
echo esc_url( relevanssi_get_permalink( $post ) );
|
| 1344 |
}
|
| 1345 |
|
| 1346 |
/**
|
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,71 +128,38 @@ 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.
|
| 132 |
-
*
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
*
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
*
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
*
|
| 142 |
-
* Minor fix:
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
*
|
| 148 |
-
*
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
*
|
| 155 |
-
*
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
*
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
*
|
| 162 |
-
* New feature: The user searches page has been improved a lot.
|
| 163 |
-
* New feature: The [searchform] shortcode has a new parameter, 'post_type_boxes', which creates a checkbox for each post type you list in the value. For example [searchform post_type_boxes='*post,page'] would create a search with a checkbox for 'post' and 'page' post types, with 'post' pre-checked.
|
| 164 |
-
* New feature: You can now have multiple dropdowns in one [searchform] shortcode. Anything that begins with 'dropdown' is considered a dropdown parameter, so you can do [searchform dropdown_1='category' dropdown_2='post_tag'] for example.
|
| 165 |
-
* New feature: New filter hook `relevanssi_search_params` lets you filter search parameters after they've been collected from the WP_Query.
|
| 166 |
-
* New feature: New filter hook `relevanssi_excerpt_post` lets you make Relevanssi skip creating excerpts for specific posts.
|
| 167 |
-
* Changed behaviour: Filter hooks `relevanssi_1day`, `relevanssi_7days` and `relevanssi_30days` are removed, as the user searches page is now different. The default value for `relevanssi_user_searches_limit` is now 100 instead of 20.
|
| 168 |
-
* Minor fix: In some languages, iOS uses „“ for quotes. Relevanssi now understands those for the phrase operator.
|
| 169 |
-
* Minor fix: Stops Relevanssi from blocking the admin search for WooCommerce coupons and other WooCommerce custom post types.
|
| 170 |
-
* Minor fix: Fixes problems with the WP-Members compatibility.
|
| 171 |
-
* Minor fix: New parameter for `relevanssi_tokenize()` introduces the context (indexing or search query). The `relevanssi_extract_phrases()` is only used on search queries.
|
| 172 |
-
* Minor fix: Relevanssi won't let you adjust synonyms and stopwords anymore if you use Polylang and are in 'Show all languages' mode.
|
| 173 |
-
* Minor fix: Highlighting is improved by a more precise HTML entity filter, thanks to Jacob Bearce.
|
| 174 |
|
| 175 |
== Upgrade notice ==
|
| 176 |
-
= 4.
|
| 177 |
-
*
|
| 178 |
-
|
| 179 |
-
= 4.14.6 =
|
| 180 |
-
* Security fix: Extra security checks for AJAX actions.
|
| 181 |
-
|
| 182 |
-
= 4.14.5 =
|
| 183 |
-
* Security fix: registered users could delete the Relevanssi index.
|
| 184 |
-
|
| 185 |
-
= 4.14.4 =
|
| 186 |
-
* Small bug fixes.
|
| 187 |
-
|
| 188 |
-
= 4.14.3 =
|
| 189 |
-
* Security fix: User searches page had a XSS vulnerability.
|
| 190 |
-
|
| 191 |
-
= 4.14.2 =
|
| 192 |
-
* Removes database calls on admin pages.
|
| 193 |
-
|
| 194 |
-
= 4.14.1 =
|
| 195 |
-
* Adds a missing file.
|
| 196 |
-
|
| 197 |
-
= 4.14.0 =
|
| 198 |
-
* User searches page update, bug fixes and improvements.
|
| 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: 6.0
|
| 7 |
Requires PHP: 7.0
|
| 8 |
+
Stable tag: 4.16.0
|
| 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.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.
|
| 149 |
+
* Changed behaviour: The `relevanssi_hits_filter` hook now gets the WP_Query object as the second parameter.
|
| 150 |
+
* Minor fix: Avoid error messages for missing `mysqlcolumn_matches` array key.
|
| 151 |
+
|
| 152 |
+
= 4.15.0 =
|
| 153 |
+
* New feature: The action hook `relevanssi_init` runs at the end of the `relevanssi_init()` function.
|
| 154 |
+
* New feature: New filter hook `relevanssi_author_query_filter` filters the post author MySQL query.
|
| 155 |
+
* New feature: New filter hook `relevanssi_by_date_query_filter` filters the by_date MySQL query.
|
| 156 |
+
* New feature: New filter hook `relevanssi_date_query_filter` filters the date query MySQL query.
|
| 157 |
+
* New feature: New filter hook `relevanssi_parent_query_filter` filters the post parent MySQL query.
|
| 158 |
+
* New feature: New filter hook `relevanssi_post_query_filter` filters the post__in and post__not_in MySQL query.
|
| 159 |
+
* New feature: New filter hook `relevanssi_post_status_query_filter` filters the post_status MySQL query.
|
| 160 |
+
* New feature: New filter hook `relevanssi_post_type_query_filter` filters the post_type MySQL query.
|
| 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.16.0 =
|
| 165 |
+
* Indexing update; please reindex after the upgrade! Oxygen 4 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.16.0
|
| 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.16.0';
|
| 71 |
|
| 72 |
require_once 'lib/admin-ajax.php';
|
| 73 |
require_once 'lib/common.php';
|
