{"id":368882,"date":"2026-09-17T18:12:18","date_gmt":"2026-09-17T18:12:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/searchminer\/"},"modified":"2026-10-14T12:02:19","modified_gmt":"2026-10-14T12:02:19","slug":"searchminer","status":"publish","type":"plugin","link":"https:\/\/kin.wordpress.org\/plugins\/searchminer\/","author":23566278,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.6","stable_tag":"0.2.6","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"SearchMiner","header_author":"Yodsira","header_description":"See what visitors search on your site and what your search can't find \u2014 without replacing your search engine. WooCommerce ready.","assets_banners_color":"0e332c","last_updated":"2026-10-14 12:02:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/searchminer\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":409,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.1":{"tag":"0.1.1","author":"yodsira","date":"2026-09-17 18:12:10","revision":3700775},"0.1.2":{"tag":"0.1.2","author":"yodsira","date":"2026-09-23 20:35:40","revision":3710148},"0.1.3":{"tag":"0.1.3","author":"yodsira","date":"2026-09-23 21:37:15","revision":3710200},"0.2.1":{"tag":"0.2.1","author":"yodsira","date":"2026-09-29 18:12:27","revision":3719593},"0.2.2":{"tag":"0.2.2","author":"yodsira","date":"2026-10-08 11:14:06","revision":3734369},"0.2.3":{"tag":"0.2.3","author":"yodsira","date":"2026-10-13 11:34:54","revision":3743754},"0.2.4":{"tag":"0.2.4","author":"yodsira","date":"2026-10-14 04:10:14","revision":3745247},"0.2.5":{"tag":"0.2.5","author":"yodsira","date":"2026-10-14 10:49:00","revision":3746076},"0.2.6":{"tag":"0.2.6","author":"yodsira","date":"2026-10-14 12:02:19","revision":3746257}},"upgrade_notice":{"0.2.2":"<p>CSV export, a Site Health info section, and an honest readme: the free\nplugin makes no outgoing requests (Telegram digests are a Pro companion\nfeature). Recommended for everyone.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3700775,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon.svg":{"filename":"icon.svg","revision":3700775,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3700775,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3700775,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3746285,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=searchminer\",\"preferredVersions\":{\"php\":\"latest\",\"wp\":\"latest\"},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"searchminer\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"SearchMiner demo\",\"blogdescription\":\"Live preview \\u2014 see what visitors search for\"}},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/\\\/ Seed SearchMiner with two weeks of demo searches so the dashboard\\n\\\/\\\/ shows real-looking charts instead of an empty screen.\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\nglobal $wpdb;\\n\\n\\\/\\\/ query_text, normalized, found_count, zero_count, is_woo\\n$seed = array(\\n    array('red sneakers', 'red sneakers', 34, 0, 1),\\n    array('wireless earbuds', 'wireless earbuds', 29, 0, 1),\\n    array('laptop stand', 'laptop stand', 22, 0, 1),\\n    array('coffee grinder', 'coffee grinder', 18, 0, 1),\\n    array('running shoes size 42', 'running shoes size 42', 15, 0, 1),\\n    array('cotton tote bag', 'cotton tote bag', 12, 0, 1),\\n    array('usb c hub 8 in 1', 'usb c hub 8 in 1', 0, 7, 1),\\n    array('kids raincoat yellow', 'kids raincoat yellow', 0, 5, 1),\\n    array('spare parts for model x100', 'spare parts for model x100', 0, 3, 0),\\n    array('delivery to berlin', 'delivery to berlin', 9, 0, 0),\\n    array('returns policy', 'returns policy', 6, 0, 0),\\n);\\n\\n$first = gmdate('Y-m-d H:i:s', time() - 14 * DAY_IN_SECONDS);\\n\\nforeach ($seed as $row) {\\n    list($text, $norm, $found, $zero, $woo) = $row;\\n    $clicks    = (int) ceil($found * 0.6);\\n    $noclicks  = $found - $clicks + $zero;\\n    $last_hours = $found > 10 ? 2 : 36;\\n    $last      = gmdate('Y-m-d H:i:s', time() - $last_hours * HOUR_IN_SECONDS);\\n    $hash      = md5($norm);\\n\\n    $wpdb->query($wpdb->prepare(\\n        'INSERT INTO ' . $wpdb->prefix . 'wpsm_queries\\n         (qhash, query_text, query_norm, hits, zero_hits, click_count, no_click_count, is_woo, first_seen, last_seen)\\n         VALUES (%s, %s, %s, %d, %d, %d, %d, %d, %s, %s)',\\n        $hash,\\n        $text,\\n        $norm,\\n        $found,\\n        $zero,\\n        $clicks,\\n        $noclicks,\\n        $woo,\\n        $first,\\n        $last\\n    ));\\n}\\n\\n\\\/\\\/ Daily aggregates for the last 14 days: 9-38 searches, some zero-result.\\nfor ($i = 13; $i >= 0; $i--) {\\n    $day      = gmdate('Y-m-d', time() - $i * DAY_IN_SECONDS);\\n    $total    = rand(9, 38);\\n    $zero     = rand(1, min(6, $total));\\n    $wpdb->query($wpdb->prepare(\\n        'INSERT INTO ' . $wpdb->prefix . 'wpsm_daily (day, searches, zero_searches)\\n         VALUES (%s, %d, %d)',\\n        $day,\\n        $total,\\n        $zero\\n    ));\\n}\\n\"}]}"}},"all_blocks":[],"tagged_versions":["0.1.1","0.1.2","0.1.3","0.2.1","0.2.2","0.2.3","0.2.4","0.2.5","0.2.6"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3746268,"resolution":"1","location":"assets","locale":"","width":1440,"height":900}},"screenshots":[]},"plugin_section":[262246],"plugin_tags":[232,8911,944,286,281338],"plugin_category":[36,45],"plugin_contributors":[281339],"plugin_business_model":[],"class_list":["post-368882","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-analytics","plugin_tags-insights","plugin_tags-search","plugin_tags-woocommerce","plugin_tags-zero-results","plugin_category-analytics","plugin_category-ecommerce","plugin_contributors-yodsira","plugin_committers-yodsira"],"banners":{"banner":"https:\/\/ps.w.org\/searchminer\/assets\/banner-772x250.png?rev=3700775","banner_2x":"https:\/\/ps.w.org\/searchminer\/assets\/banner-1544x500.png?rev=3700775","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/searchminer\/assets\/icon.svg?rev=3700775","icon":"https:\/\/ps.w.org\/searchminer\/assets\/icon.svg?rev=3700775","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/searchminer\/assets\/screenshot-1.png?rev=3746268","caption":""}],"raw_content":"<!--section=description-->\n<p>SearchMiner is a passive observer for your site search. It records what\nvisitors search for, flags every search that returned zero results and shows\nsearches where visitors got results but clicked nothing \u2014 the quiet revenue\nleak most sites never measure.<\/p>\n\n<p><strong>It does not replace your search.<\/strong> Keep the search you already have (native\nWordPress search, WooCommerce product search) \u2014 SearchMiner simply tells you\nwhat it is missing.<\/p>\n\n<p>Highlights:<\/p>\n\n<ul>\n<li>Top searches, top zero-result searches and top \"searched but clicked nothing\" queries<\/li>\n<li>Searches per day chart with the zero-result share highlighted<\/li>\n<li>WooCommerce aware: product searches are marked separately<\/li>\n<li>Dashboard widget: the zero-result searches your visitors made most<\/li>\n<li>Privacy first: no IP addresses, no user accounts stored; automatic retention\n(30\u2013365 days); one-click erase of all recorded searches<\/li>\n<li>Bots and crawlers are filtered out, so numbers mean people<\/li>\n<li>No data leaves your server<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<p>When a visitor loads a search results page, SearchMiner records the phrase\nand the number of results. If result tracking is enabled, a tiny script on\nthe results page sends one beacon when the visitor clicks a result \u2014 or one\nbeacon when they leave without clicking anything. That is all.<\/p>\n\n<h4>Limitations (honest list)<\/h4>\n\n<ul>\n<li>Searches served entirely from a full-page cache bypass PHP and are not recorded<\/li>\n<li>AJAX search widgets (third-party) are not recorded in this version<\/li>\n<li>The plugin counts behaviour; it cannot tell you visitor intent<\/li>\n<\/ul>\n\n<h3>Pro Version<\/h3>\n\n<p>An optional companion plugin adds (one license = one site, 12 months of updates):<\/p>\n\n<ul>\n<li>Typo clustering \u2014 groups misspellings (\"snearkers\") with the real query<\/li>\n<li>Revenue-at-risk matching \u2014 links zero-result searches to existing products<\/li>\n<li>Weekly email digest with the top fixes for your shop<\/li>\n<\/ul>\n\n<p>The free version is fully functional on its own and never limited.\nDetails: https:\/\/yodsira.com\/product\/searchminer\/<\/p>\n\n<h3>External Services<\/h3>\n\n<p>By default the free plugin makes no outgoing requests: SearchMiner stores\nsearch phrases in your own database. The only developer connection is the\noptional, off-by-default error telemetry described at the end of this\nsection \u2014 nothing is sent until you enable it yourself.<\/p>\n\n<p>For transparency: the package ships a shared Telegram delivery helper that\nstays completely inert in the free version and is only activated by the\noptional SearchMiner Pro companion (a separate plugin). If you enable\nTelegram delivery in Pro, that helper talks to api.telegram.org \u2014 the\nTelegram Bot API \u2014 using the bot token you configure yourself.\nTerms: https:\/\/telegram.org\/tos \u2014 Privacy: https:\/\/telegram.org\/privacy\n* Optional, off by default: anonymous error reports. If the admin enables\n  the checkbox in the plugin settings, a daily batch of sanitized error\n  signatures (message, file name:line, culprit plugin\/theme, first stack\n  frames, plugin\/WP\/PHP versions, site address) is sent to\n  https:\/\/yodsira.com\/api\/telemetry so bugs can be reproduced and fixed.\n  Nothing is sent while the checkbox is off.\nWhy: I am an independent developer, and this is the only way I learn about\nbugs I cannot reproduce myself. The free plugin makes no requests at all\nuntil you enable this option; when an error happens, an anonymous\nsignature is sent to yodsira.com so I can fix it in the next release.\nNothing else ever leaves your site, and you can switch it off at any\nmoment. Every report is read by a human.\nExample of exactly what one report looks like (sanitized):<\/p>\n\n<p>`message: \"Call to a member function get_id() on null\" \u2014 file: file.php:123 \u2014 culprit: plugin other-plugin \u2014 versions: plugin 0.2.5, WordPress 6.8, PHP 8.2\nThat is the whole payload \u2014 no content, no user data, no usage tracking.\n  Disabling telemetry clears any queued reports immediately.\n  Developer service terms: https:\/\/yodsira.com\/en\/terms\/\n  Privacy policy: https:\/\/yodsira.com\/en\/privacy\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install via Plugins \u2192 Add New \u2192 search for \"SearchMiner\", or upload the zip.<\/li>\n<li>Activate. That is it \u2014 capture starts immediately.<\/li>\n<li>Open SearchMiner in the admin menu after some searches have happened.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20replace%20my%20search%3F\"><h3>Does it replace my search?<\/h3><\/dt>\n<dd><p>No. SearchMiner observes any search based on the standard WordPress search\nquery, including WooCommerce product search.<\/p><\/dd>\n<dt id=\"do%20you%20store%20ip%20addresses%20or%20personal%20data%3F\"><h3>Do you store IP addresses or personal data?<\/h3><\/dt>\n<dd><p>No IP addresses are stored. The plugin records search phrases, counts and\ntimestamps only. Retention is configurable (30\u2013365 days) and everything can\nbe erased with one click.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20site%20down%3F\"><h3>Will it slow my site down?<\/h3><\/dt>\n<dd><p>Capture is a single indexed upsert that runs only on search pages. Nothing\nruns on regular page views.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20relevanssi%20%2F%20ivory%20search%20%2F%20fibosearch%3F\"><h3>Does it work with Relevanssi \/ Ivory Search \/ FiboSearch?<\/h3><\/dt>\n<dd><p>If those plugins use the standard WordPress search query, SearchMiner sees\nit. Purely AJAX third-party search widgets are not recorded in this version.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.6<\/h4>\n\n<ul>\n<li>Update: \"Send anonymous report to developer\" \u2014 confirmation dialog,\nsending once never enables telemetry; disabling telemetry clears any\nqueued reports immediately.<\/li>\n<li>Update: telemetry transparency \u2014 developer rationale in the settings block\nand readme, a sanitized example of exactly one report, and an always-visible\n\"Send error report now\" button (manual, conscious sending).<\/li>\n<\/ul>\n\n<h4>0.2.5<\/h4>\n\n<ul>\n<li>New: optional, OFF by default anonymous error telemetry (daily batch of\nsanitized signatures to yodsira.com\/api\/telemetry, disclosed in External\nServices; nothing is sent until the admin opts in).<\/li>\n<li>Readme: privacy wording aligned with the optional telemetry\n(no absolute \"never sends\" claims anywhere).<\/li>\n<\/ul>\n\n<h4>0.2.4<\/h4>\n\n<ul>\n<li>New: Yodsira Admin UI Standard \u2014 design tokens, WCAG-checked palette\n(brand mint decor-only), collapsible settings, quiet Pro side card.<\/li>\n<li>New: welcome card instead of empty charts when no searches are recorded\nyet; live search stats as badges next to the title.<\/li>\n<li>New: a one-time contextual notice on the plugin's own pages (day 7, at most\ntwice ever) inviting a wp.org rating or a support-forum report; fully\ndismissible, no tracking.<\/li>\n<\/ul>\n\n<h4>0.2.3<\/h4>\n\n<ul>\n<li>New: a \"Pro\" screen in the admin menu describing the optional SearchMiner\nPro companion (typo clustering, revenue-at-risk matching, weekly digests).<\/li>\n<li>Readme: the Pro section now lists the concrete companion features.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>New: CSV export of the recorded queries (the current range) from the Overview page.<\/li>\n<li>New: a SearchMiner section in Tools \u2192 Site Health \u2192 Info (capture status,\nsearches and zero-result rate for the last 30 days, retention).<\/li>\n<li>Fix: the dashboard widget now shows an honest \"capture is disabled\" note\ninstead of stale data when recording is turned off in the settings.<\/li>\n<li>Readme: the External Services section now states it accurately \u2014 the free\nplugin makes no outgoing requests; the bundled Telegram helper is inert\nuntil the Pro companion activates it.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Accuracy: a search is counted once \u2014 viewing results pages 2, 3, \u2026 no longer inflates the counter.<\/li>\n<li>Charts: days without searches are now shown as zero instead of being skipped (sparse traffic no longer looks like consecutive busy days).<\/li>\n<li>Internal: removed a dead duplicate registration of the searchminer_zero_queries filter.<\/li>\n<li>Fixed: the internal version constant (used for asset cache-busting) had been stuck at 0.1.1 since the first release \u2014 it is now derived from the plugin header.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Fix: dashboard top-lists could render empty on some MySQL versions.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Load the shared Yodsira family components (family status endpoint).<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: capture, dashboard, settings, privacy tools, click tracking.<\/li>\n<\/ul>","raw_excerpt":"See what visitors search on your site and what your search can't find \u2014 without replacing your search engine.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368882"}],"author":[{"embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/yodsira"}],"wp:attachment":[{"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368882"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368882"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368882"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368882"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368882"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}