{"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-08T11:14:06","modified_gmt":"2026-10-08T11:14:06","slug":"searchminer","status":"publish","type":"plugin","link":"https:\/\/bcc.wordpress.org\/plugins\/searchminer\/","author":23566278,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.2","stable_tag":"0.2.2","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-08 11:14:06","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":257,"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}},"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":3734676,"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"],"block_files":[],"assets_screenshots":[],"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":[],"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>Pro adds automation, reports and integrations on top of the free version\n(one license = one site, 12 months of updates):<\/p>\n\n<p>https:\/\/yodsira.com\/buy\/searchminer<\/p>\n\n<h3>External Services<\/h3>\n\n<p>None in the free plugin: SearchMiner stores search phrases in your own\ndatabase and makes no outgoing requests of its own. Nothing is ever sent to\nyodsira.com or any other server.<\/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<\/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.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:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368882"}],"author":[{"embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/yodsira"}],"wp:attachment":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368882"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368882"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368882"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368882"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368882"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}