{"id":347071,"date":"2026-08-04T20:05:48","date_gmt":"2026-08-04T20:05:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/loupe-search\/"},"modified":"2026-08-04T23:44:02","modified_gmt":"2026-08-04T23:44:02","slug":"loupe-search","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/loupe-search\/","author":3803,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.4","stable_tag":"1.2.4","tested":"7.1","requires":"6.9","requires_php":"8.3","requires_plugins":null,"header_name":"Loupe Search","header_author":"Per Soderlind","header_description":"Enhance the search functionality of your WordPress site with Loupe Search.","assets_banners_color":"","last_updated":"2026-08-04 23:44:02","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/PerSoderlind","header_plugin_uri":"https:\/\/github.com\/soderlind\/loupe-search","header_author_uri":"https:\/\/soderlind.no","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.4":{"tag":"1.2.4","author":"PerS","date":"2026-08-04 23:44:02"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3634573,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3634573,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3634573,"resolution":false,"location":"assets","locale":false}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3634573,"resolution":"1","location":"assets","locale":"","width":2458,"height":1468},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3634573,"resolution":"2","location":"assets","locale":"","width":2458,"height":1468},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3634573,"resolution":"3","location":"assets","locale":"","width":2458,"height":1468},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3634573,"resolution":"4","location":"assets","locale":"","width":2458,"height":1468}},"screenshots":{"1":"Dashboard tab showing index health per post type, batched reindexing, and the system status for the required PHP extensions.","2":"Fields tab for selecting which post types are indexed and configuring each field as indexable, filterable or sortable, with weight and sort direction.","3":"Search Behavior tab with tokenization, prefix search and typo tolerance settings.","4":"Contextual help tabs explaining field configuration options and search behavior settings."}},"plugin_section":[],"plugin_tags":[29147,33217,944,28201,274467],"plugin_category":[],"plugin_contributors":[78884],"plugin_business_model":[],"class_list":["post-347071","plugin","type-plugin","status-publish","hentry","plugin_tags-fast-search","plugin_tags-full-text-search","plugin_tags-search","plugin_tags-sqlite","plugin_tags-typo-tolerant","plugin_contributors-pers","plugin_committers-pers"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/loupe-search\/assets\/icon.svg?rev=3634573","icon":"https:\/\/ps.w.org\/loupe-search\/assets\/icon.svg?rev=3634573","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/loupe-search\/assets\/screenshot-1.png?rev=3634573","caption":"Dashboard tab showing index health per post type, batched reindexing, and the system status for the required PHP extensions."},{"src":"https:\/\/ps.w.org\/loupe-search\/assets\/screenshot-2.png?rev=3634573","caption":"Fields tab for selecting which post types are indexed and configuring each field as indexable, filterable or sortable, with weight and sort direction."},{"src":"https:\/\/ps.w.org\/loupe-search\/assets\/screenshot-3.png?rev=3634573","caption":"Search Behavior tab with tokenization, prefix search and typo tolerance settings."},{"src":"https:\/\/ps.w.org\/loupe-search\/assets\/screenshot-4.png?rev=3634573","caption":"Contextual help tabs explaining field configuration options and search behavior settings."}],"raw_content":"<!--section=description-->\n<p>Loupe Search improves WordPress core search by maintaining its own index for fast lookups, supporting typo tolerance, phrase matching, basic exclusion operators, and per\u2013post-type customization.<\/p>\n\n<h4>Core Features<\/h4>\n\n<ul>\n<li>\ud83d\ude80 Index-backed search engine replacing the WordPress default<\/li>\n<li>\u26a1 Results served from a dedicated index, not the posts table<\/li>\n<li>\ud83d\udd04 Real-time index synchronization<\/li>\n<li>\ud83c\udf10 Support for multiple languages<\/li>\n<li>\ud83d\udce6 Full custom post type integration<\/li>\n<li>\ud83d\udcc8 Integrated search performance metrics<\/li>\n<li>\u2705 Works with the WordPress default themes<\/li>\n<\/ul>\n\n<h4>Search Capabilities<\/h4>\n\n<ul>\n<li>\ud83d\udd0d Typo-tolerant searching - find results even with misspellings<\/li>\n<li>\ud83d\udcac Phrase matching with quotation marks: <code>\"exact phrase\"<\/code><\/li>\n<li>\u2796 Exclusion operator support (e.g., <code>term -excluded<\/code>)<\/li>\n<li>\ud83d\udd00 OR search: <code>term1 term2<\/code> finds content with either term<\/li>\n<li>\ud83d\udcd6 Pagination support<\/li>\n<li>Stemming support<\/li>\n<li>Stop words recognition<\/li>\n<li>Highlighting and cropped snippets via the REST API<\/li>\n<\/ul>\n\n<h4>Administration<\/h4>\n\n<ul>\n<li>Simple settings interface<\/li>\n<li>Post type selection<\/li>\n<li>Field configuration options<\/li>\n<li>One-click reindexing<\/li>\n<li>Processing time monitoring<\/li>\n<\/ul>\n\n<h4>Developer Features<\/h4>\n\n<ul>\n<li>\ud83d\udee0\ufe0f Extensive filter system for customization<\/li>\n<li>\ud83d\udcca Performance monitoring and diagnostics<\/li>\n<li>\ud83d\udd27 Customizable indexing<\/li>\n<li>Field weighting control<\/li>\n<\/ul>\n\n<p>See the <a href=\"https:\/\/github.com\/soderlind\/loupe-search\/blob\/main\/docs\/search-api.md\">Search API documentation<\/a> for REST endpoint details.<\/p>\n\n<h4>AI Agent Integration (WordPress Abilities API)<\/h4>\n\n<p>Loupe Search registers two abilities via the WordPress Abilities API (WordPress 6.9+) so AI agents and automation tools can discover and use search functionality natively:<\/p>\n\n<ul>\n<li><code>loupe-search\/search<\/code> \u2014 Typo-tolerant full-text search across indexed post types. Supports phrase matching, exclusion, and OR operators. Publicly accessible.<\/li>\n<li><code>loupe-search\/get-post<\/code> \u2014 Retrieve a single published post by ID. Publicly accessible.<\/li>\n<\/ul>\n\n<p>These abilities are discoverable through the standard WordPress Abilities registry and require no additional configuration. As of 1.2.0 the ability namespace is <code>loupe-search<\/code>; the legacy <code>wp-loupe\/search<\/code> and <code>wp-loupe\/get-post<\/code> abilities still work but are deprecated aliases.<\/p>\n\n<p><a href=\"https:\/\/github.com\/soderlind\/loupe-search\/blob\/main\/docs\/migration-mcp-to-abilities.md\">Upgrading from the experimental MCP server?<\/a> The MCP server, token service, and WP-CLI token commands were removed in 0.8.5. Use the Abilities API endpoints described above instead; no configuration migration is required.<\/p>\n\n<h4>Filters<\/h4>\n\n<p>These filters allow developers to customize Loupe Search's behavior. As of 1.1.0 they use the <code>loupe_search_*<\/code> prefix; the old <code>wp_loupe_*<\/code> names still work but are deprecated and will be removed in a future major release.<\/p>\n\n<pre><code>loupe_search_db_path\n<\/code><\/pre>\n\n<p>Controls where the search index is stored.\nDefault: WP_CONTENT_DIR . '\/loupe-search-db'<\/p>\n\n<pre><code>loupe_search_post_types\n<\/code><\/pre>\n\n<p>Modifies which post types are included in search.\nDefault: the post types selected on the settings screen, falling back to ['post', 'page']<\/p>\n\n<pre><code>loupe_search_posts_per_page\n<\/code><\/pre>\n\n<p>Controls search results per page.\nDefault: WordPress \"Blog pages show at most\" setting<\/p>\n\n<pre><code>loupe_search_index_protected\n<\/code><\/pre>\n\n<p>Controls indexing of password-protected posts. Receives false for protected posts and true for everything else; return true to index them anyway.<\/p>\n\n<pre><code>loupe_search_field_{$field_name}\n<\/code><\/pre>\n\n<p>Modifies a core post field before indexing. Does not fire for custom fields.\nExample: The plugin uses <code>loupe_search_field_post_content<\/code> to strip HTML tags from content<\/p>\n\n<pre><code>loupe_search_schema_{$post_type}\n<\/code><\/pre>\n\n<p>Customizes the schema for a post type: which fields are indexed, their weight, and whether they are filterable or sortable.<\/p>\n\n<pre><code>loupe_search_is_safely_sortable_{$post_type}\n<\/code><\/pre>\n\n<p>Overrides whether a core post field may be used for sorting.<\/p>\n\n<pre><code>loupe_search_is_safely_sortable_meta_{$post_type}\n<\/code><\/pre>\n\n<p>Overrides whether a custom field may be used for sorting.<\/p>\n\n<p>For signatures, defaults, and usage examples, see the <a href=\"https:\/\/github.com\/soderlind\/loupe-search\/blob\/main\/docs\/filters.md\">filter documentation<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li><p><strong>Quick Install<\/strong><\/p>\n\n<ul>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/loupe-search<\/code> directory, or install the plugin through the WordPress plugins screen directly<\/li>\n<li>Activate through the 'Plugins' menu in WordPress<\/li>\n<\/ul><\/li>\n<li><p><strong>Post-Installation<\/strong><\/p>\n\n<ul>\n<li>Visit Settings &gt; Loupe Search to configure<\/li>\n<li>Click 'Reindex' to build the initial search index (runs in batches to avoid timeouts)<\/li>\n<\/ul><\/li>\n<li><p><strong>Updates<\/strong><\/p>\n\n<ul>\n<li>Plugin updates are handled automatically by WordPress.org.<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20it%20handle%20updates%20to%20posts%3F\"><h3>How does it handle updates to posts?<\/h3><\/dt>\n<dd><p>The search index automatically updates when content is created, modified, or deleted.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No. Loupe Search uses a separate, optimized search index and doesn't impact your main database performance.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20what%20content%20is%20searchable%3F\"><h3>Can I customize what content is searchable?<\/h3><\/dt>\n<dd><p>Yes, using filters you can control exactly what content gets indexed and how it's searched.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20post%20types%3F\"><h3>Does it work with custom post types?<\/h3><\/dt>\n<dd><p>Yes, you can select which post types to include in the Settings page or via filters.<\/p><\/dd>\n<dt id=\"how%20do%20i%20reindex%20on%20large%20sites%3F\"><h3>How do I reindex on large sites?<\/h3><\/dt>\n<dd><p>Use Settings &gt; Loupe Search &gt; Reindex (batched), or run via WP-CLI:<\/p>\n\n<ul>\n<li><code>wp loupe-search reindex<\/code><\/li>\n<li><code>wp loupe-search reindex --post-types=post,page --batch-size=1000<\/code><\/li>\n<\/ul><\/dd>\n<dt id=\"how%20do%20i%20use%20advanced%20search%20operators%3F\"><h3>How do I use advanced search operators?<\/h3><\/dt>\n<dd><ul>\n<li><code>Hello World<\/code> will search for posts containing <code>Hello<\/code> <strong>or<\/strong> <code>World<\/code>.<\/li>\n<li><code>\"Hello World\"<\/code> will search for posts containing the exact phrase <code>Hello World<\/code>.<\/li>\n<li><code>Hello -World<\/code> will search for posts containing <code>Hello<\/code> but not <code>World<\/code>.<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20are%20the%20technical%20requirements%3F\"><h3>What are the technical requirements?<\/h3><\/dt>\n<dd><ul>\n<li>PHP 8.3 or higher<\/li>\n<li>SQLite 3.35+ (required by Loupe)<\/li>\n<li>PHP extensions: pdo_sqlite, intl, mbstring<\/li>\n<li>WordPress 6.9+<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Changed: The minimum PHP version is now 8.3. The plugin's dependencies already required PHP 8.2\/8.3, so the previously advertised 8.1 requirement was not accurate.<\/li>\n<li>Security: The public search REST route and search ability now scope the query itself to public post types, so hit totals and facet counts can no longer reveal indexed non-public content.<\/li>\n<li>Changed: The plugin's options moved off the <code>wp_<\/code> prefix, which is reserved for WordPress core. Existing settings are migrated automatically on first load.<\/li>\n<li>Changed: The settings screen moved to <code>options-general.php?page=loupe-search<\/code>.<\/li>\n<li>Removed: The 12-hour cache in front of the public search route. Caching every query from an unauthenticated route could grow the options table without bound.<\/li>\n<li>Removed: Third-party command line entry points and build config from the release package.<\/li>\n<li>Removed: The unused language-detection n-gram databases from the release package, which drops it from 197 MB to 25 MB.<\/li>\n<li>Fixed: The indexer stripped tags using a deprecated filter name.<\/li>\n<li>Added: The <code>loupe_search_max_cacheable_query_length<\/code> filter (default 128) bounds which queries are written to the result cache.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Changed: Updated the plugin screenshots to reflect the current settings UI.<\/li>\n<li>Changed: Corrected the screenshot descriptions to match the current Search Behavior tab.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Security: Public REST search endpoints and the search abilities now only return results from public post types.<\/li>\n<li>Security: Field settings now sanitize the nested post-type and field-name keys.<\/li>\n<li>Changed: Updated the bundled Loupe search engine to 1.0.1 (compound-word decomposition, improved excerpt cropping).<\/li>\n<li>Removed: The bundled plugin update checker library; updates are served by WordPress.org.<\/li>\n<li>Fixed: Admin help-tab styles are now enqueued instead of printed in an inline style tag.<\/li>\n<li>Fixed: Removed a broken documentation link and excluded development\/test folders from the release package.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fixed: The <code>loupe_search_post_types<\/code> filter now applies everywhere. It was only applied when resolving the front-end search scope, so the indexer, the REST API and the WordPress Abilities kept using the raw settings value. The settings screen still shows the stored option.<\/li>\n<li>Fixed: Uninstalling now deletes the plugin's options and cached search results, on every site of a multisite network. Previously only the index directories were removed.<\/li>\n<li>Fixed: Removed a bootstrap short-circuit that skipped plugin initialization on REST requests whose path did not start with <code>\/wp-json\/wp-loupe<\/code>.<\/li>\n<li>Fixed: The Composer package is now <code>soderlind\/loupe-search<\/code>, and its PSR-4 prefix is no longer over-escaped.<\/li>\n<li>I18n: Regenerated <code>loupe-search.pot<\/code>. It now includes the ability and highlighting strings added in 1.2.0, and the plugin URI no longer points at the old repository.<\/li>\n<li>Removed: The unused <code>WP_Loupe_Migration<\/code> class and <code>WP_Loupe_Utils::is_post_indexable()<\/code>.<\/li>\n<li>Documentation: Added an architecture guide and a docs index, and corrected the filter, rename and migration guides.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added: REST search now supports opt-in highlighting and cropping. Send <code>attributesToHighlight<\/code> and\/or <code>attributesToCrop<\/code> (field names or <code>[\"*\"]<\/code>) to the POST <code>\/search<\/code> endpoint; each hit then includes a <code>_formatted<\/code> object with matched terms wrapped in tags and\/or cropped snippets. Tag\/marker and length are configurable via <code>highlightStartTag<\/code>, <code>highlightEndTag<\/code>, <code>cropLength<\/code>, and <code>cropMarker<\/code>. Highlight tags are sanitized to a safe allowlist.<\/li>\n<li>Changed: WordPress Abilities are now registered as <code>loupe-search\/search<\/code> and <code>loupe-search\/get-post<\/code> under the <code>loupe-search<\/code> category. The legacy <code>wp-loupe\/search<\/code> and <code>wp-loupe\/get-post<\/code> abilities remain registered as deprecated aliases and will be removed in a future major release.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: Front-end search now works when a public, searchable post type (e.g. attachments) is not indexed. Previously the plugin bailed out and fell back to WordPress's default search, returning no Loupe results.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Changed: Developer filters now use the <code>loupe_search_*<\/code> prefix.<\/li>\n<li>Changed: REST namespace is now <code>loupe-search\/v1<\/code>; WP-CLI command is now <code>wp loupe-search<\/code>; the index folder is now <code>wp-content\/loupe-search-db<\/code> (existing installs keep using <code>wp-loupe-db<\/code> if present).<\/li>\n<li>Deprecated: The <code>wp_loupe_*<\/code> filters, the <code>wp-loupe\/v1<\/code> REST namespace, the <code>wp wp-loupe<\/code> CLI command, and the <code>wp-loupe-db<\/code> folder name are deprecated but still work for backward compatibility; they will be removed in a future major release.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Added: Redesigned settings screen with Dashboard, Fields, and Search Behavior tabs.<\/li>\n<li>Added: Dashboard showing per-post-type index health, a reindex panel with a progress bar and Cancel button, and a system status check for required PHP extensions.<\/li>\n<li>Added: REST endpoint <code>GET \/wp-json\/wp-loupe\/v1\/index-status<\/code> returning index health for configured post types.<\/li>\n<li>Changed: Replaced the Select2 post-type dropdown with an accessible native checkbox picker.<\/li>\n<li>Changed: Field configuration for each post type is now shown in collapsible accordions.<\/li>\n<li>Changed: Updated the contextual help tabs to match the redesigned settings screen and removed references to controls that no longer exist.<\/li>\n<li>Removed: Select2 dependency and its bundled assets.<\/li>\n<li>Removed: Auto-update settings toggle; per-plugin auto-updates are now handled by WordPress core.<\/li>\n<\/ul>\n\n<h4>0.8.5<\/h4>\n\n<ul>\n<li>Added: WordPress Abilities API integration (WordPress 6.9+) registering <code>wp-loupe\/search<\/code> and <code>wp-loupe\/get-post<\/code> abilities for native AI agent and automation discovery.<\/li>\n<li>Changed: Lowered minimum PHP requirement to 8.1; raised minimum WordPress to 6.9.<\/li>\n<li>Changed: Prepared for the WordPress.org plugin directory; updates are now handled by WordPress.org.<\/li>\n<li>Removed: Experimental MCP (Model Context Protocol) server, token service, and WP-CLI token commands (replaced by the WordPress Abilities API).<\/li>\n<li>Removed: GitHub-based plugin updater.<\/li>\n<\/ul>\n\n<h4>0.8.4<\/h4>\n\n<ul>\n<li>Changed: Updated PHP dependencies to <code>loupe\/loupe<\/code> 0.13.12, <code>phpunit\/phpunit<\/code> 12.5, and <code>pestphp\/pest<\/code> 4.5.<\/li>\n<li>Changed: Updated JavaScript tooling dependencies and lockfile to address open dependency advisories.<\/li>\n<li>Changed: PHPUnit configuration and legacy test method names were updated for PHPUnit 12 compatibility.<\/li>\n<\/ul>\n\n<h4>0.8.3<\/h4>\n\n<ul>\n<li>Fixed: <code>should_intercept_query()<\/code> validates all public searchable post types are indexed before intercepting generic searches.<\/li>\n<li>Changed: Added DocBlocks for methods in search hooks, token service, and indexer classes.<\/li>\n<\/ul>\n\n<h4>0.8.2<\/h4>\n\n<ul>\n<li>Changed: Enhanced README with WP Loupe compatibility note.<\/li>\n<li>Changed: Updated dev dependencies (<code>basic-ftp<\/code> 5.0.5 \u2192 5.2.0).<\/li>\n<\/ul>\n\n<h4>0.8.1<\/h4>\n\n<ul>\n<li>Fixed: Search hooks now activate for AJAX requests (e.g., live search), resolving missing results in AJAX-powered search forms.<\/li>\n<li>Fixed: Pagination respects the query <code>posts_per_page<\/code> variable before falling back to the global option.<\/li>\n<li>Fixed: <code>should_intercept_query()<\/code> intercepts AJAX search requests, not only main queries.<\/li>\n<li>Changed: Search engine retrieves up to 1 000 hits per post type before client-side paging to prevent truncated result sets.<\/li>\n<li>Changed: Updated PHP and JavaScript dependencies.<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Added: Batched reindexing to avoid admin request timeouts on large sites.<\/li>\n<li>Added: Admin-only maintenance REST endpoint: <code>POST \/wp-json\/wp-loupe\/v1\/reindex-batch<\/code>.<\/li>\n<li>Added: WP-CLI command for batched reindexing: <code>wp wp-loupe reindex<\/code>.<\/li>\n<li>Added: Pest test runner (dev) alongside PHPUnit.<\/li>\n<li>Changed: Reindexing is triggered via a separate admin UI button (not tied to saving settings).<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li>Added: Search API guide with hook-based field preparation examples (facets, geo, sorting).<\/li>\n<li>Added: Filter <code>wp_loupe_is_safely_sortable_meta_{$post_type}<\/code> to override meta sortability decisions.<\/li>\n<li>Fixed: Geo-point meta fields are treated as sortable-safe for distance sorting.<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>Added: Split search engine (side-effect free) from front-end hooks to avoid REST\/MCP side effects.<\/li>\n<li>Added: Advanced REST search API via POST <code>\/wp-json\/wp-loupe\/v1\/search<\/code> (JSON filters, facets, geo, sorting).<\/li>\n<li>Removed: Bundled UI integration (block\/shortcode\/search form override). Build your own UI using the REST API.<\/li>\n<li>Changed: Upgraded <code>loupe\/loupe<\/code> to 0.13.4 and tightened runtime requirements checks.<\/li>\n<li>Fixed: Reindexing now safely rebuilds\/migrates indexes across Loupe schema upgrades.<\/li>\n<li>Fixed: Guarded against empty <code>wp_loupe_db_path<\/code> filter values.<\/li>\n<\/ul>\n\n<h4>0.5.7<\/h4>\n\n<ul>\n<li>Added: Always expose core WordPress fields (<code>post_title<\/code>, <code>post_content<\/code>, <code>post_excerpt<\/code>, <code>post_date<\/code>, <code>post_modified<\/code>, <code>post_author<\/code>, <code>permalink<\/code>) in REST field discovery and settings UI even if unchecked for indexing.<\/li>\n<li>Changed: Field discovery flow now starts with mandatory core fields then merges schema &amp; meta keys for stable UI state.<\/li>\n<li>Fixed: Previous changelog typo (\"dependecies\" -&gt; \"dependencies\").<\/li>\n<\/ul>\n\n<h4>0.5.6<\/h4>\n\n<ul>\n<li>Changed: Updated dependencies to latest versions<\/li>\n<\/ul>\n\n<h4>0.5.5<\/h4>\n\n<ul>\n<li>Added: Settings toggle to enable or disable automatic plugin updates (defaults enabled).<\/li>\n<li>Added: Schema manager unit test validating baseline <code>post_date<\/code> only.<\/li>\n<li>Added: Updated translation template with new settings strings.<\/li>\n<li>Changed: Simplified baseline schema to only include mandatory <code>post_date<\/code>; per-post-type field settings now applied cleanly.<\/li>\n<li>Changed: Readme wording trimmed to reduce promotional language.<\/li>\n<li>Fixed: Structural mismatch in default schema logic preventing accurate field inheritance.<\/li>\n<\/ul>\n\n<h4>0.5.4<\/h4>\n\n<ul>\n<li>Added: Automatic plugin update infrastructure (filter-based) with constant opt-out.<\/li>\n<li>Added: Migration ensuring mandatory <code>post_date<\/code> field exists after Loupe upgrade; conditional reindex strategy (immediate for small sites, scheduled for large).<\/li>\n<li>Fixed: Publishing\/indexing error caused by missing SQLite <code>post_date<\/code> column.<\/li>\n<li>Internal: Post-date migration triggers safe reindex path based on site size.<\/li>\n<\/ul>\n\n<h4>0.5.3<\/h4>\n\n<ul>\n<li>Added: Copy buttons (with accessible live feedback) for MCP manifest and protected resource endpoints.<\/li>\n<li>Added: Aria-live region and translatable status messages for copy success\/failure.<\/li>\n<li>Changed: Removed inline JavaScript for endpoint copying; logic centralized in <code>admin.js<\/code>.<\/li>\n<li>Fixed: Clipboard fallback for browsers without <code>navigator.clipboard<\/code> support.<\/li>\n<li>Changed: Minor wording clarity improvements in endpoint descriptions.<\/li>\n<li>Note: Small UX iteration paving the way for richer manifest metadata.<\/li>\n<\/ul>\n\n<h4>0.5.2<\/h4>\n\n<ul>\n<li>Added: Settings surfacing discovery endpoints (manifest &amp; protected resource) for MCP clients.<\/li>\n<li>Added: Accessibility improvements groundwork (live region placeholder) before 0.5.3 enhancements.<\/li>\n<li>Changed: Removed POST <code>\/commands<\/code> from visible endpoint list (method clarity).<\/li>\n<li>Fixed: Ensured reliable JSON output for <code>\/.well-known\/mcp.json<\/code> (rewrite + fallback path).<\/li>\n<li>Fixed: Clipboard copy resilience improvements (initial implementation) preparing for 0.5.3.<\/li>\n<li>I18n: Regenerated <code>wp-loupe.pot<\/code> with new MCP strings and translator comments.<\/li>\n<li>Note: Internal rate-limit option polish and manifest stability adjustments.<\/li>\n<\/ul>\n\n<h4>0.5.1<\/h4>\n\n<ul>\n<li>UI: Wrapped MCP token table in panel and standardized max-width (840px)<\/li>\n<li>UI: Reordered headings and moved Save button for consistency<\/li>\n<li>MCP: Token management interface (scopes, TTL presets, revoke all, last-used tracking, copy-once)<\/li>\n<li>MCP: Hybrid anonymous\/authenticated search access with scoped tokens<\/li>\n<li>MCP: Secure HMAC-signed pagination cursors for <code>searchPosts<\/code><\/li>\n<li>MCP: WP-CLI token issuance mirrored in admin interface<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Initial MCP integration (preview): discovery manifest, commands, rate limiting, scoped tokens, pagination security<\/li>\n<li>Requires PHP 8.3+ and Loupe 0.12.13<\/li>\n<\/ul>\n\n<h4>0.4.3<\/h4>\n\n<ul>\n<li>Fixed: Inline JavaScript using <code>wp_print_inline_script_tag<\/code>.<\/li>\n<li>Plugin updates are handled automatically via GitHub. No need to manually download and install updates.<\/li>\n<\/ul>\n\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Customizer settings not being saved<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Update settings documentation in README.md<\/li>\n<li>Update translations for new strings<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Added improved caching mechanisms for better performance<\/li>\n<li>Enhanced field configuration management and organization<\/li>\n<li>Refactored code structure for better maintainability<\/li>\n<li>Optimized sortable field checking with static caching<\/li>\n<li>Improved attribute extraction and configuration building<\/li>\n<li>More efficient handling of typo tolerance configuration<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>Fixed: In readme.txt, update the <code>Tested up to<\/code> value to 6.7<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Bug fix: Non-scalar fields no longer get selected by default for sorting when adding a new post type<\/li>\n<li>Improved field configuration UI to properly handle non-sortable fields<\/li>\n<li>Updated translations for new strings<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Added support for custom post types<\/li>\n<li>Added field configuration interface for indexing, filtering, and sorting<\/li>\n<li>Improved search algorithm<\/li>\n<li>Performance optimizations<\/li>\n<\/ul>\n\n<h4>0.2.3<\/h4>\n\n<ul>\n<li>Enhanced field indexing to strictly respect settings configuration<\/li>\n<li>Improved schema manager to only include explicitly selected fields<\/li>\n<li>Refined factory class to ensure proper field filtering from settings<\/li>\n<li>Added filter <code>wp_loupe_field_{$field_name}<\/code> to allow field modification.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>Changed: Modified field indexing to only include explicitly selected fields in settings<\/li>\n<li>Changed: Updated schema manager to respect indexable field settings<\/li>\n<li>Changed: Improved field selection behavior in admin interface<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Added translation support for admin interface<\/li>\n<li>Updated translation files with new strings<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Added new field settings management interface in the settings page\n\n<ul>\n<li>Added ability to configure Weight, Filterable, and Sortable options per field<\/li>\n<\/ul><\/li>\n<li>Added help tabs to explain field configuration options\n\n<ul>\n<li>Added detailed explanations for Weight, Filterable, and Sortable fields<\/li>\n<li>Added help sidebar with documentation link<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Refactored code: Replaced WP_Loupe_Shared trait with WP_Loupe_Factory class<\/li>\n<li>Improved code organization and maintainability<\/li>\n<li>Enhanced code structure for better testability<\/li>\n<\/ul>\n\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Housekeeping<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Fixed: GitHub API authentication errors in updater class<\/li>\n<li>Fixed: Added proper token-based authentication for GitHub API requests<\/li>\n<li>Fixed: Resolved 403 errors when checking for plugin updates<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Fixed issue with plugin update notification not showing in some cases<\/li>\n<li>Fixed GitHub release asset detection for automatic updates<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Security: Improved GitHub integration with proper API token handling<\/li>\n<li>Security: Updated GitHub actions workflow for better release asset management<\/li>\n<li>Added: Plugin update success notification<\/li>\n<li>Added: Improved GitHub release asset detection with regex pattern<\/li>\n<li>Added: Updated installation instructions for automatic updates<\/li>\n<li>Changed: Enhanced updater with better error handling<\/li>\n<li>Changed: Updated dependencies to latest versions<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Added \"Behind the scenes\" documentation section explaining plugin's internal dataflow<\/li>\n<li>Added detailed step-by-step documentation on indexing and search processes<\/li>\n<li>Implemented automatic GitHub updates using YahnisElsts\/plugin-update-checker library<\/li>\n<li>Added acknowledgement for third-party libraries used<\/li>\n<li>Improved README documentation with more thorough explanations of architecture<\/li>\n<li>Enhanced code organization and comments for better developer understanding<\/li>\n<li>Simplified plugin update process with direct GitHub integration<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Clear search results cache when reindexing, saving, updating or deleting posts<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Added new WP_Loupe_Schema_Manager class for schema configurations<\/li>\n<li>Added methods for indexable, filterable, and sortable fields<\/li>\n<li>Added prepare_document method in WP_Loupe_Indexer<\/li>\n<li>Enhanced reindex_all method with prepare_document<\/li>\n<li>Improved search method in WP_Loupe_Search with schema-based fields<\/li>\n<li>Added search results caching for better performance<\/li>\n<li>Updated create_post_objects method for efficient post fetching<\/li>\n<li>Added schema customization documentation in README.md<\/li>\n<\/ul>\n\n<h4>0.0.31<\/h4>\n\n<ul>\n<li>Update readme.txt<\/li>\n<\/ul>\n\n<h4>0.0.30<\/h4>\n\n<ul>\n<li>Added post type selection in settings page<\/li>\n<li>Added support for all public post types in search<\/li>\n<li>Added default selection of 'post' and 'page' for new installations<\/li>\n<li>Improved settings UI with Select2 dropdown<\/li>\n<li>Updated post type handling in search index<\/li>\n<\/ul>\n\n<h4>0.0.20<\/h4>\n\n<ul>\n<li>Fix Typo in class-wp-loupe-loader.php<\/li>\n<\/ul>\n\n<h4>0.0.19<\/h4>\n\n<ul>\n<li>Changed: Update dependencies<\/li>\n<\/ul>\n\n<h4>0.0.18<\/h4>\n\n<ul>\n<li>Fixed return value in posts_pre_query to return null instead of posts for better WP Core integration<\/li>\n<\/ul>\n\n<h4>0.0.17<\/h4>\n\n<ul>\n<li>Added wp_loupe_posts_per_page filter hook for customizing posts per page<\/li>\n<li>Added PHPDoc blocks for all class properties in search class<\/li>\n<li>Improved code documentation for all method parameters<\/li>\n<li>Enhanced error handling in database operations<\/li>\n<\/ul>\n\n<h4>0.0.16<\/h4>\n\n<ul>\n<li>Added proper documentation to WP_Loupe_Search class<\/li>\n<li>Added missing PHPDoc blocks for class properties<\/li>\n<li>Fixed PHPCS warnings related to comment formatting<\/li>\n<li>Fixed inline documentation for better code readability<\/li>\n<\/ul>\n\n<h4>0.0.15<\/h4>\n\n<ul>\n<li>Added pagination support for search results<\/li>\n<li>Added total found posts and max pages calculation<\/li>\n<li>Added proper handling of posts per page setting<\/li>\n<li>Improved search query interception logic<\/li>\n<li>Enhanced performance for large result sets<\/li>\n<\/ul>\n\n<h4>0.0.14<\/h4>\n\n<ul>\n<li>Fixed problem with reindexing all posts and pages from the admin interface<\/li>\n<\/ul>\n\n<h4>0.0.13<\/h4>\n\n<ul>\n<li>Improved search results handling for custom post types<\/li>\n<li>Enhanced post object creation with proper post type support<\/li>\n<\/ul>\n\n<h4>0.0.12<\/h4>\n\n<ul>\n<li>Added comprehensive documentation to all classes and methods<\/li>\n<li>Added proper DocBlocks following WordPress coding standards<\/li>\n<li>Improved code documentation across all files<\/li>\n<\/ul>\n\n<h4>0.0.11<\/h4>\n\n<ul>\n<li>Added trait for sharing Loupe instance creation between classes<\/li>\n<li>Updated field names to match WordPress post field names<\/li>\n<li>Fixed search results handling and post object creation<\/li>\n<\/ul>\n\n<h4>0.0.10<\/h4>\n\n<ul>\n<li>Performance: Reduced search attributes to only retrieve essential fields<\/li>\n<li>Performance: Removed content from sortable attributes<\/li>\n<li>Performance: Removed highlighting feature<\/li>\n<li>Fixed: Typo in search query variable<\/li>\n<li>Fixed: Code style improvements for better maintainability<\/li>\n<\/ul>\n\n<h4>0.0.1 - 0.0.5<\/h4>\n\n<p>Development version, do not use in production.<\/p>","raw_excerpt":"A search enhancement plugin for WordPress that delivers fast, accurate, and typo-tolerant results.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/347071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=347071"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pers"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=347071"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=347071"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=347071"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=347071"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=347071"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=347071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}