=== Relevanssi - A Better Search === Contributors: msaari Donate link: http://www.relevanssi.com/buy-premium/ Tags: search, relevance, better search Requires at least: 4.0 Tested up to: 4.5 Stable tag: 3.5.3 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Relevanssi replaces the default search with a partial-match search that sorts results by relevance. It also indexes comments and shortcode content. == Description == Relevanssi replaces the standard WordPress search with a better search engine, with lots of features and configurable options. You'll get better results, better presentation of results - your users will thank you. This is the free version of Relevanssi. There's also Relevanssi Premium, which has added features, including Multisite support. This free version does not work properly on Multisite. For more information about Premium, see [Relevanssi.com](http://www.relevanssi.com/). = Key features = * Search results sorted in the order of relevance, not by date. * Fuzzy matching: match partial words, if complete words don't match. * Find documents matching either just one search term (OR query) or require all words to appear (AND query). * Search for phrases with quotes, for example "search phrase". * Create custom excerpts that show where the hit was made, with the search terms highlighted. * Highlight search terms in the documents when user clicks through search results. * Search comments, tags, categories and custom fields. = Advanced features = * Adjust the weighting for titles, tags and comments. * Log queries, show most popular queries and recent queries with no hits. * Restrict searches to categories and tags using a hidden variable or plugin settings. * Index custom post types and custom taxonomies. * Index the contents of shortcodes. * Google-style "Did you mean?" suggestions based on successful user searches. * Automatic support for [WPML multi-language plugin](http://wpml.org/). * Automatic support for [s2member membership plugin](http://www.s2member.com/). * Advanced filtering to help hacking the search results the way you want. * Search result throttling to improve performance on large databases. * Disable indexing of post content and post titles with a simple filter hook. Relevanssi is available in two versions, regular and Premium. Regular Relevanssi is and will remain free to download and use. Relevanssi Premium comes with a cost, but will get all the new features. Standard Relevanssi will be updated to fix bugs, but new features will mostly appear in Premium. Also, support for standard Relevanssi depends very much on my mood and available time. Premium pricing includes support. = Premium features (only in Relevanssi Premium) = * Improved spelling correction in "Did you mean?" suggestions. * Multisite support. * Search and index user profiles. * Search and index taxonomy term pages (categories, tags, custom taxonomies). * Search and index arbitrary columns in wp_posts MySQL table. * Assign weights to any post types and taxonomies. * Assign extra weight to new posts. * Let the user choose between AND and OR searches, use + and - operator (AND and NOT). * Highlighting search terms for visitors from external search engines. * Export and import settings. = Relevanssi in Facebook = You can find [Relevanssi in Facebook](http://www.facebook.com/relevanssi). Become a fan to follow the development of the plugin, I'll post updates on bugs, new features and new versions to the Facebook page. = Other search plugins = Relevanssi owes a lot to [wpSearch](http://wordpress.org/extend/plugins/wpsearch/) by Kenny Katzgrau. Relevanssi was built to replace wpSearch, when it started to fail. Search Unleashed is a popular search plugin, but it hasn't been updated since 2010. Relevanssi is in active development and does what Search Unleashed does. == Installation == 1. Extract all files from the ZIP file, and then upload the plugin's folder to /wp-content/plugins/. 1. If your blog is in English, skip to the next step. If your blog is in other language, rename the file *stopwords* in the plugin directory as something else or remove it. If there is *stopwords.yourlanguage*, rename it to *stopwords*. 1. Activate the plugin through the 'Plugins' menu in WordPress. 1. Go to the plugin settings and build the index following the instructions there. To update your installation, simply overwrite the old files with the new, activate the new version and if the new version has changes in the indexing, rebuild the index. = Note on updates = If it seems the plugin doesn't work after an update, the first thing to try is deactivating and reactivating the plugin. If there are changes in the database structure, those changes do not happen without a deactivation, for some reason. = Changes to templates = None necessary! Relevanssi uses the standard search form and doesn't usually need any changes in the search results template. If the search does not bring any results, your theme probably has a query_posts() call in the search results template. That throws Relevanssi off. For more information, see [The most important Relevanssi debugging trick](http://www.relevanssi.com/knowledge-base/query_posts/). = How to index = Check the options to make sure they're to your liking, then click "Save indexing options and build the index". If everything's fine, you'll see the Relevanssi options screen again with a message "Indexing successful!" If something fails, usually the result is a blank screen. The most common problem is a timeout: server ran out of time while indexing. The solution to that is simple: just return to Relevanssi screen (do not just try to reload the blank page) and click "Continue indexing". Indexing will continue. Most databases will get indexed in just few clicks of "Continue indexing". You can follow the process in the "State of the Index": if the amount of documents is growing, the indexing is moving along. If the indexing gets stuck, something's wrong. I've had trouble with some plugins, for example Flowplayer video player stopped indexing. I had to disable the plugin, index and then activate the plugin again. Try disabling plugins, especially those that use shortcodes, to see if that helps. Relevanssi shows the highest post ID in the index - start troubleshooting from the post or page with the next highest ID. Server error logs may be useful, too. = Using custom search results = If you want to use the custom search results, make sure your search results template uses `the_excerpt()` to display the entries, because the plugin creates the custom snippet by replacing the post excerpt. If you're using a plugin that affects excerpts (like Advanced Excerpt), you may run into some problems. For those cases, I've included the function `relevanssi_the_excerpt()`, which you can use instead of `the_excerpt()`. It prints out the excerpt, but doesn't apply `wp_trim_excerpt()` filters (it does apply `the_content()`, `the_excerpt()`, and `get_the_excerpt()` filters). To avoid trouble, use the function like this: `` See Frequently Asked Questions for more instructions on what you can do with Relevanssi. = The advanced hacker option = If you're doing something unusual with your search and Relevanssi doesn't work, try using `relevanssi_do_query()`. See [Knowledge Base](http://www.relevanssi.com/knowledge-base/relevanssi_do_query/). = Uninstalling = To uninstall the plugin remove the plugin using the normal WordPress plugin management tools (from the Plugins page, first Deactivate, then Delete). If you remove the plugin files manually, the database tables and options will remain. = Combining with other plugins = Relevanssi doesn't work with plugins that rely on standard WP search. Those plugins want to access the MySQL queries, for example. That won't do with Relevanssi. [Search Light](http://wordpress.org/extend/plugins/search-light/), for example, won't work with Relevanssi. Some plugins cause problems when indexing documents. These are generally plugins that use shortcodes to do something somewhat complicated. One such plugin is [MapPress Easy Google Maps](http://wordpress.org/extend/plugins/mappress-google-maps-for-wordpress/). When indexing, you'll get a white screen. To fix the problem, disable either the offending plugin or shortcode expansion in Relevanssi while indexing. After indexing, you can activate the plugin again. == Frequently Asked Questions == = Knowledge Base = You can find solutions and answers at the [Relevanssi Knowledge Base](http://www.relevanssi.com/category/knowledge-base/). = Relevanssi doesn't work = If you the results don't change after installing and activating Relevanssi, the most likely reason is that you have a call to `query_posts()` on your search results template. This confuses Relevanssi. Try removing the query_posts call and see what happens. = Searching for words with ampersands or hyphens doesn't work = Please read [Words with punctuation can't be found](http://www.relevanssi.com/knowledge-base/words-ampersands-cant-found/). This is a Relevanssi feature, but you can circumvent it with a simple filter function. = Where are the user search logs? = See the top of the admin menu. There's 'User searches'. There. If the logs are empty, please note showing the results needs at least MySQL 5. = Displaying the number of search results found = The typical solution to showing the number of search results found does not work with Relevanssi. However, there's a solution that's much easier: the number of search results is stored in a variable within $wp_query. Just add the following code to your search results template: `found_posts . ' hits'; ?>` = Advanced search result filtering = If you want to add extra filters to the search results, you can add them using a hook. Relevanssi searches for results in the _relevanssi table, where terms and post_ids are listed. The various filtering methods work by listing either allowed or forbidden post ids in the query WHERE clause. Using the `relevanssi_where` hook you can add your own restrictions to the WHERE clause. These restrictions must be in the general format of ` AND doc IN (' . {a list of post ids, which could be a subquery} . ')` For more details, see where the filter is applied in the `relevanssi_search()` function. This is stricly an advanced hacker option for those people who're used to using filters and MySQL WHERE clauses and it is possible to break the search results completely by doing something wrong here. There's another filter hook, `relevanssi_hits_filter`, which lets you modify the hits directly. The filter passes an array, where index 0 gives the list of hits in the form of an array of post objects and index 1 has the search query as a string. The filter expects you to return an array containing the array of post objects in index 0 (`return array($your_processed_hit_array)`). = Direct access to query engine = Relevanssi can't be used in any situation, because it checks the presence of search with the `is_search()` function. This causes some unfortunate limitations and reduces the general usability of the plugin. You can now access the query engine directly. There's a new function `relevanssi_do_query()`, which can be used to do search queries just about anywhere. The function takes a WP_Query object as a parameter, so you need to store all the search parameters in the object (for example, put the search terms in `$your_query_object->query_vars['s']`). Then just pass the WP_Query object to Relevanssi with `relevanssi_do_query($your_wp_query_object);`. Relevanssi will process the query and insert the found posts as `$your_query_object->posts`. The query object is passed as reference and modified directly, so there's no return value. The posts array will contain all results that are found. = Sorting search results = If you want something else than relevancy ranking, you can use orderby and order parameters. Orderby accepts $post variable attributes and order can be "asc" or "desc". The most relevant attributes here are most likely "post_date" and "comment_count". If you want to give your users the ability to sort search results by date, you can just add a link to http://www.yourblogdomain.com/?s=search-term&orderby=post_date&order=desc to your search result page. Order by relevance is either orderby=relevance or no orderby parameter at all. = Filtering results by date = You can specify date limits on searches with `by_date` search parameter. You can use it your search result page like this: http://www.yourblogdomain.com/?s=search-term&by_date=1d to offer your visitor the ability to restrict their search to certain time limit (see [RAPLIQ](http://www.rapliq.org/) for a working example). The date range is always back from the current date and time. Possible units are hour (h), day (d), week (w), month (m) and year (y). So, to see only posts from past week, you could use by_date=7d or by_date=1w. Using wrong letters for units or impossible date ranges will lead to either defaulting to date or no results at all, depending on case. Thanks to Charles St-Pierre for the idea. = Displaying the relevance score = Relevanssi stores the relevance score it uses to sort results in the $post variable. Just add something like `echo $post->relevance_score` to your search results template inside a PHP code block to display the relevance score. = Did you mean? suggestions = To use Google-style "did you mean?" suggestions, first enable search query logging. The suggestions are based on logged queries, so without good base of logged queries, the suggestions will be odd and not very useful. To use the suggestions, add the following line to your search result template, preferably before the have_posts() check: `Did you mean: ", "?

", 5); }?>` The first parameter passes the search term, the second is the text before the result, the third is the text after the result and the number is the amount of search results necessary to not show suggestions. With the default value of 5, suggestions are not shown if the search returns more than 5 hits. = Search shortcode = Relevanssi also adds a shortcode to help making links to search results. That way users can easily find more information about a given subject from your blog. The syntax is simple: `[search]John Doe[/search]` This will make the text John Doe a link to search results for John Doe. In case you want to link to some other search term than the anchor text (necessary in languages like Finnish), you can use: `[search term="John Doe"]Mr. John Doe[/search]` Now the search will be for John Doe, but the anchor says Mr. John Doe. One more parameter: setting `[search phrase="on"]` will wrap the search term in quotation marks, making it a phrase. This can be useful in some cases. = Restricting searches to categories and tags = Relevanssi supports the hidden input field `cat` to restrict searches to certain categories (or tags, since those are pretty much the same). Just add a hidden input field named `cat` in your search form and list the desired category or tag IDs in the `value` field - positive numbers include those categories and tags, negative numbers exclude them. This input field can only take one category or tag id (a restriction caused by WordPress, not Relevanssi). If you need more, use `cats` and use a comma-separated list of category IDs. The same works with post types. The input fields are called `post_type` and `post_types`. You can also set the restriction from general plugin settings (and then override it in individual search forms with the special field). This works with custom taxonomies as well, just replace `cat` with the name of your taxonomy. If you want to restrict the search to categories using a dropdown box on the search form, use a code like this: `
'All categories')); ?>
` This produces a search form with a dropdown box for categories. Do note that this code won't work when placed in a Text widget: either place it directly in the template or use a PHP widget plugin to get a widget that can execute PHP code. = Restricting searches with taxonomies = You can use taxonomies to restrict search results to posts and pages tagged with a certain taxonomy term. If you have a custom taxonomy of "People" and want to search entries tagged "John" in this taxonomy, just use `?s=keyword&people=John` in the URL. You should be able to use an input field in the search form to do this, as well - just name the input field with the name of the taxonomy you want to use. It's also possible to do a dropdown for custom taxonomies, using the same function. Just adjust the arguments like this: `wp_dropdown_categories(array('show_option_all' => 'All people', 'name' => 'people', 'taxonomy' => 'people'));` This would do a dropdown box for the "People" taxonomy. The 'name' must be the keyword used in the URL, while 'taxonomy' has the name of the taxonomy. = Automatic indexing = Relevanssi indexes changes in documents as soon as they happen. However, changes in shortcoded content won't be registered automatically. If you use lots of shortcodes and dynamic content, you may want to add extra indexing. Here's how to do it: `if (!wp_next_scheduled('relevanssi_build_index')) { wp_schedule_event( time(), 'daily', 'relevanssi_build_index' ); }` Add the code above in your theme functions.php file so it gets executed. This will cause WordPress to build the index once a day. This is an untested and unsupported feature that may cause trouble and corrupt index if your database is large, so use at your own risk. This was presented at [forum](http://wordpress.org/support/topic/plugin-relevanssi-a-better-search-relevanssi-chron-indexing?replies=2). = Highlighting terms = Relevanssi search term highlighting can be used outside search results. You can access the search term highlighting function directly. This can be used for example to highlight search terms in structured search result data that comes from custom fields and isn't normally highlighted by Relevanssi. Just pass the content you want highlighted through `relevanssi_highlight_terms()` function. The content to highlight is the first parameter, the search query the second. The content with highlights is then returned by the function. Use it like this: `if (function_exists('relevanssi_highlight_terms')) { echo relevanssi_highlight_terms($content, get_search_query()); } else { echo $content; }` = What is tf * idf weighing? = It's the basic weighing scheme used in information retrieval. Tf stands for *term frequency* while idf is *inverted document frequency*. Term frequency is simply the number of times the term appears in a document, while document frequency is the number of documents in the database where the term appears. Thus, the weight of the word for a document increases the more often it appears in the document and the less often it appears in other documents. = What are stop words? = Each document database is full of useless words. All the little words that appear in just about every document are completely useless for information retrieval purposes. Basically, their inverted document frequency is really low, so they never have much power in matching. Also, removing those words helps to make the index smaller and searching faster. == Known issues and To-do's == * Known issue: In general, multiple Loops on the search page may cause surprising results. Please make sure the actual search results are the first loop. * Known issue: Relevanssi doesn't necessarily play nice with plugins that modify the excerpt. If you're having problems, try using relevanssi_the_excerpt() instead of the_excerpt(). == Thanks == * Cristian Damm for tag indexing, comment indexing, post/page exclusion and general helpfulness. * Marcus Dalgren for UTF-8 fixing. * Warren Tape for 2.5.5 fixes. * Mohib Ebrahim for relentless bug hunting. == Changelog == = 3.5.3 = * New filter `relevanssi_user_searches_limit` to adjust the number of user searches shown in the logs. * Old data check is only done on Relevanssi settings page, not on all admin pages. That should improve admin performance. * Fixed a fatal error when searching includes private posts. * New filter: `relevanssi_remote_addr` can be used to modify the IP address logged to Relevanssi logs. * Blocked CFDB and WooCommerce shortcodes that are causing problems with Relevanssi. = 3.5.2 = * Added correct support for `term_taxonomy_id` in the `fields` parameter in tax_queries. = 3.5.1 = * Fixed an error in the Did you mean function. * Fixed an error if the search term was not found in content. * Fixed an error when building excerpts from posts shorter than the excerpt length. * Blocked the `[starpro]` shortcode that was causing problems with Relevanssi. * New filter: `relevanssi_remove_stopwords_in_titles` allows you to include stopwords in titles. * Added support for `term_tax_id` in the `fields` parameter in tax_queries. * Excerpt-building failed if multibyte string operations were missing. It should work now. = 3.5 = * Tokenizer was using `strlen()` and not `mb_strlen()`, so word lengths were not calculated properly. If your site uses non-ASCII alphabet, rebuilding the index is a good idea. * Small improvement to WPML multilanguage filtering. * `relevanssi_the_title()` got a new parameter: if you don't want to echo the title, you can use it like `relevanssi_the_title(false)` to make it return the title. * Relevanssi had `the_title` filter hook calls that were missing the second parameter; that's now fixed. * The excerpt-building algorithm is completely rewritten based on work by Ben Boyter (http://www.boyter.org/). * The `[watupro]` shortcode didn't work with Relevanssi, so Relevanssi will now bypass it. * The plugin i18n features have been improved slightly. * New filter: `relevanssi_didyoumean_suggestion` lets you modify the Did you mean? suggestion before it's displayed. * `relevanssi_didyoumean()` has a new parameter: you can now choose whether the result is echoed out (the default value) or just returned. * In the search results breakdown, you can now use %categories% and %taxonomies% to show the number of matches in categories and taxonomies other than tags and cats, respectively. * Relevanssi supports `fields` parameter (both `ids` and `id=>parent`) to return only post IDs or post IDs and post parents. = 3.4.2 = * Empty lines on synonym settings caused problems. Fixed that. * In WordPress 4.2 installations, emoji in will be handled better. Emoji in posts may cause problems with WordPress versions below 4.2, so please update! = 3.4.1 = * Removed a notice about an undefined variable. = 3.4 = * New filter: `relevanssi_valid_admin_status` can be used to adjust post statuses that Relevanssi will handle. * If Relevanssi creates an empty excerpt for a post and there's a user-set excerpt for the post, that excerpt is used. * No ellipsis is added to the post excerpt, if the post excerpt shows the whole post. * The `relevanssi_post_title_before_tokenize` filter now has a second parameter that contains the post object. * New filter: `relevanssi_display_common_words` can be used to disable the "25 most common words" listing on the settings page, if it's too heavy to load. * Relevanssi was sanitizing taxonomy titles too aggressively. That is now toned down a bit. * Relevanssi now supports `post_parent`, `post_parent__in` and `post_parent__not_in`, though you have to set them in `relevanssi_modify_wp_query` filter for them to work. * Meta query support should now be perfect; there were some limitations with complicated meta queries before. = 3.3.8 = * Fixed a bug that caused the results to change depending of the order of words in a multi-word search query. * Added `product_categories` and `recent_products` from WooCommerce to the list of blocked shortcodes. * There are improvements in excerpt-building and highlighting, especially when fuzzy search is enabled. * Fixed a possible (if quite unlikely) XSS vulnerability. * Improved search performance (thanks to MikeNGarrett). * Sometimes highlights in documents make the document content disappear. I don't know why, but I've added a fix that should make the content visible (without the highlights) if a problem appears. = 3.3.7.1 = * Fixed bbPress compatibility. = 3.3.7 = * Fixed bbPress compatibility. = 3.3.6 = * Relevanssi handles taxonomy terms in search better. The change requires a reindexing. * Fix in indexing: Relevanssi will now bypass the global $post when indexing. This should help with problems with the Cookie Law Info plugin, for example. * Tax query relation setting didn't work properly. It is now fixed. * Word-based excerpt building sometimes created too short excerpts. That is now fixed. * Synonyms are now highlighted. * Phrase matching had issues where searching for a too common phrase crashed the search. That has been fixed. * LIKE operator didn't work properly in meta_queries. * Problems with Avatar Upload plugin are fixed. * Offset errors with mb_stripos() shouldn't happen anymore. * A small problem in taxonomy search MySQL fixed, also a small problem with AND operator in tax_queries. * New filter: `relevanssi_post_to_index` lets you access the post object before the post is indexed. * New filter: `relevanssi_orderby` lets you modify the $orderby value before Relevanssi sorts posts. * New filter: `relevanssi_order` lets you modify the $order value before Relevanssi sorts posts. * New filter: `relevanssi_post_title_before_tokenize` lets you modify post titles before indexing. * New filter: `relevanssi_private_cap` lets you adjust the capability setting for private posts in custom post types. * Deprecated use of `like_escape` has been fixed. = 3.3.5 = * Fixed a bug where excluding posts would cause the search to fail. * Fixed a bug causing duplicate search results in WPML searches. * Increased plugin safety against hackers. * There was a bug in `relevanssi_comment_content_to_index` filter. * Some people had problems with the log entry timestamps. Fixed that. * New filter: `relevanssi_prevent_default_request` gives you more control over where Relevanssi prevents the default query from running. * New filter: `relevanssi_private_cap` lets you set the correct capability for finding private posts in custom post types. * The option to exclude categories and tags from search only worked for categories, not tags. Tags have been separated to a different option. = 3.3.4 = * Couple of bug fixes. = 3.3.3 = * OR fallback had problems. * Indexing sub pages didn't work. * Relevanssi now automatically treats 'ß' as 'ss'. If your site has 'ß' in text, reindexing the database is a good idea. * Query variable `post_status` is now supported. = 3.3.2 = * Fixed a warning on search results page. = 3.3.1 = * Fixed bugs related to the removal of the cache feature. = 3.3 = * Improvements to excerpts: excerpts with phrases work much better now, and the excerpt creation logic has been improved: the excerpts are now better. The process takes a bit more time, though. * Allowing HTML tags in excerpts could lead to those tags being left open. Relevanssi will now try to close open HTML tags in excerpts. * Allowed tags were not controlled in comments. They are now. * Highlighting in documents didn't always work; it should be more reliable now. * Non-integer values are removed from `post__in` and `post__not_in` before processing them. * Query variables `p` and `page_id` are now supported. * Relevanssi now understands `date_query` variables as well. * The original post excerpt is stored in $post->original_excerpt. * Taxonomy search works better with term id parameters (for example from `wp_category_dropdown`). * Errors about $wpdb->prepare() missing an argument removed. * New functions: `relevanssi_the_title()` and `relevanssi_get_the_title()` can be used to display highlighted titles in search results. * The old title highlighting method has been disabled, because it caused highlights in wrong places. Now the highlighted title is stored in $post->highlighted_post_title, take it from there or use the Relevanssi title functions to display it. * Polylang and WPML support was adjusted to perform better in edge cases. * Indexing is faster, thanks to some improved code from Tom Novelli. * MySQL injection attack vulnerability removed. * The cache feature is now removed. Relevanssi should automatically drop the cache tables. * New filter: `relevanssi_indexing_data` lets you modify the data before it's indexed. = 3.2 = * Fixed a bug in the TablePress support. * Titles are put through the_title filter before indexing. * New filter: `relevanssi_join` can be used to join tables in the Relevanssi search MySQL queries. Thanks to Ninos Ego. * New filter: `relevanssi_post_content` can be used to modify post content before any Relevanssi processing. * New filter: `relevanssi_post_content_before_tokenize` can be used to modify post content just before it's tokenized. * New filter: `relevanssi_indexing_values` can be used to modify what Relevanssi stores in the index. * New filter: `relevanssi_default_meta_query_relation` can be used to change the default meta query relation (default value is "AND"). * When using a meta_query, `relation` can be set to OR now. * Phrases are now matched to excerpts. * Number of queries Relevanssi generates is much, much lower. * New filter: `relevanssi_didyoumean_url` lets you modify the URL generated by the did you mean feature. * Better set of Russian stopwords. * Relevanssi now highlights search query synonyms as well in documents. = 3.1.9 = * Fix to make Relevanssi compatible with WordPress 3.7. * Fixed a mistyped database table name. * Relevanssi disables responsive-flipbook shortcode in indexing; it was causing problems. * Fixed a problem with an author dropdown with no author selected. = 3.1.8 = * Category restriction and exclusion and couple of other category-related settings didn't work properly. * Support for Polylang broke the support for WPML. That is now fixed. * One deprecated `$wpdb->escape()` was still left; it's gone now. * Shortcode `layerslider` was causing problems with Relevanssi; Relevanssi now disables it before building excerpts. * Relevanssi won't break BBPress search anymore. * If Relevanssi Premium is installed, deleting Relevanssi will not remove the databases and the options. = 3.1.7 = * New filter: `relevanssi_comment_content_to_index` lets you modify comment content before it's indexed by Relevanssi (to index comment meta, for example). * Facetious support: if post_type is set to -1, Relevanssi will not hang up on it. * Numerical search terms work better now. * Excerpt-building had issues, which are now fixed. * Punctuation removal now replaces   with a space. * "starrater" short code from GD Star Rating is now disabled in indexing. * Punctuation removal now replaces invisible spaces with a normal space. * Division by zero error caused by 0 in posts_per_page is now prevented, and -1 value for posts_per_page handled better. * Relevanssi doesn't apply `get_the_excerpt` filters to excerpts it builds any more. * New filter: `relevanssi_excerpt` lets you modify the excerpts Relevanssi creates. * Relevanssi now suspends WP post cache while indexing, making indexing a lot more efficient. Thanks to Julien Mession for this one. * Deprecated function errors in 3.6 removed. * When search included user profiles or taxonomy terms, Relevanssi would generate lots of MySQL errors. Not anymore. * New filter: `relevanssi_valid_status` lets you modify the post statuses Relevanssi indexes. * New filter: `relevanssi_index_taxonomies_args` lets you modify the arguments passed to get_terms() when indexing taxonomies (for example to set 'hide_empty' to false). * Searching by taxonomy ID could confuse two taxonomies with the same term_id. The search is now checking the taxonomy as well to see it's correct. * Basic support for Polylang plugin. * Russian and Italian stopwords are now included, thanks to Flector and Valerio Vendrame. * Small fix in the way user meta fields are handled. = 3.1.6 = * DEACTIVATE AND ACTIVATE THE PLUGIN AFTER YOU UPDATE. * Fuzzy searches are now a lot more efficient; they were a huge resource hog before. * Fixed a possible MySQL injection attack. * Fixed MySQL errors from empty meta queries. * Sort order (orderby and order variables) are now read from query variables instead of global variables. * Relevanssi will not choke on bad values of orderby anymore. * Limit searches is improved: when using AND search it is less likely to miss results. * Phrase recognition read the whole post content (which it didn't need) from database, causing memory issues in some cases. Fixed that. * Highlighting was broken, and should work much better now. = 3.1.5 = * OR fallback didn't actually fall back to OR, but instead got stuck in an endless loop of AND searches. * Meta queries didn't work without a key; now they work with just meta_value or meta_value_num. * Meta queries had problems with meta_value being set to null. * Relevanssi now supports category__and. By default this sets include_children to false. * When querying by slug, the term taxonomy is also taken into consideration, fixing problems when same slug appears in different taxonomies. * Author search didn't work. * Fixed an error message caused by all-number synonyms starting with zero, like 02. * Synonyms are now case-insensitive. * New filter: `relevanssi_default_tax_query_relation` can be used to change the default tax query relation from OR to AND. * Fixed undefined variable errors when doing an OR fallback. * New filter: `relevanssi_bots_to_not_log` makes it possible to block bots from logs. The format matches what other plugins, ie. WP-Useronline, use for bot blocking, so you can share block lists. * New filter: `relevanssi_admin_search_ok` gives you more control when Relevanssi overrides the default WP search in admin, useful for fixing P2P_Box AJAX search. * Ordering search results by title or date in admin search works now. * Modified the way the highlights work; now highlighting words with apostrophes should produce more meaningful results. * Highlighting should not highlight anything between & and ; or in