{"id":360163,"date":"2026-09-01T16:59:19","date_gmt":"2026-09-01T16:59:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/merchlint\/"},"modified":"2026-09-25T13:44:11","modified_gmt":"2026-09-25T13:44:11","slug":"merchlint","status":"publish","type":"plugin","link":"https:\/\/nqo.wordpress.org\/plugins\/merchlint\/","author":23551451,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.3","stable_tag":"0.3.3","tested":"7.1.2","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Merchlint \u2013 Catalog Audit for WooCommerce","header_author":"Baltano","header_description":"Store catalogue audit. Shows how much you are losing, and changes not a single byte.","assets_banners_color":"bad2e1","last_updated":"2026-09-25 13:44:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/merchlint.com","header_author_uri":"https:\/\/baltano.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":357,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.0":{"tag":"0.2.0","author":"baltano","date":"2026-09-01 16:58:44","revision":3676537},"0.2.1":{"tag":"0.2.1","author":"baltano","date":"2026-09-07 09:47:53","revision":3684589},"0.3.0":{"tag":"0.3.0","author":"baltano","date":"2026-09-17 23:36:40","revision":3701111},"0.3.1":{"tag":"0.3.1","author":"baltano","date":"2026-09-18 20:13:26","revision":3702735},"0.3.2":{"tag":"0.3.2","author":"baltano","date":"2026-09-19 11:22:44","revision":3703234},"0.3.3":{"tag":"0.3.3","author":"baltano","date":"2026-09-25 13:44:11","revision":3713130}},"upgrade_notice":{"0.3.3":"<p>On a site without WooCommerce the plugin now stays quiet instead of showing an empty screen. The\ndisplay name changed to &quot;Merchlint - Catalog Audit for WooCommerce&quot;; the plugin, its settings and\nits saved audits did not.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3676536,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3676536,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3676536,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3676536,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3676536,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.2.0","0.2.1","0.3.0","0.3.1","0.3.2","0.3.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3705632,"resolution":"1","location":"assets","locale":"","width":1280,"height":440},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3705632,"resolution":"2","location":"assets","locale":"","width":1280,"height":713},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3705632,"resolution":"3","location":"assets","locale":"","width":1280,"height":997},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3705632,"resolution":"4","location":"assets","locale":"","width":1280,"height":1737},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3705632,"resolution":"5","location":"assets","locale":"","width":1280,"height":466}},"screenshots":{"1":"The result of the last audit on the first screen you see after logging in: the revenue sitting\nin products that can no longer be bought, and how many findings are waiting behind it.","2":"Where to start: the three products with the largest amount at stake, one row per product with\neverything that is wrong with it, before the full list.","3":"One rule up close: what it checks, what to do about it, and every item with the evidence behind\nit \u2014 the fields read, the values found, and the money at stake.","4":"Every rule with its count, split into what came from your own data and what came from your theme\nor plugins \u2014 including the rules that found nothing, which say \"clean\" rather than staying silent.","5":"What changed since the previous audit \u2014 here, findings that disappeared because the store itself\nwas fixed. When a number moves because a rule of ours got smarter, the screen says so separately."}},"plugin_section":[262246],"plugin_tags":[279555,282711,282712,282713,282714],"plugin_category":[45,55],"plugin_contributors":[278694],"plugin_business_model":[],"class_list":["post-360163","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-autoloaded-options","plugin_tags-catalogue-audit","plugin_tags-duplicate-gtin","plugin_tags-missing-gtin","plugin_tags-sku-audit","plugin_category-ecommerce","plugin_category-seo-and-marketing","plugin_contributors-baltano","plugin_committers-baltano"],"banners":{"banner":"https:\/\/ps.w.org\/merchlint\/assets\/banner-772x250.png?rev=3676536","banner_2x":"https:\/\/ps.w.org\/merchlint\/assets\/banner-1544x500.png?rev=3676536","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/merchlint\/assets\/icon.svg?rev=3676536","icon":"https:\/\/ps.w.org\/merchlint\/assets\/icon.svg?rev=3676536","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-1.png?rev=3705632","caption":"The result of the last audit on the first screen you see after logging in: the revenue sitting\nin products that can no longer be bought, and how many findings are waiting behind it."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-2.png?rev=3705632","caption":"Where to start: the three products with the largest amount at stake, one row per product with\neverything that is wrong with it, before the full list."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-3.png?rev=3705632","caption":"One rule up close: what it checks, what to do about it, and every item with the evidence behind\nit \u2014 the fields read, the values found, and the money at stake."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-4.png?rev=3705632","caption":"Every rule with its count, split into what came from your own data and what came from your theme\nor plugins \u2014 including the rules that found nothing, which say \"clean\" rather than staying silent."},{"src":"https:\/\/ps.w.org\/merchlint\/assets\/screenshot-5.png?rev=3705632","caption":"What changed since the previous audit \u2014 here, findings that disappeared because the store itself\nwas fixed. When a number moves because a rule of ours got smarter, the screen says so separately."}],"raw_content":"<!--section=description-->\n<p>Merchlint reads your WooCommerce catalogue and tells you where it is losing you money. Every\nfinding comes with the value it was based on, so you can check it yourself instead of taking our\nword for it.<\/p>\n\n<p>It changes nothing. No product, no price, no stock level, no order. The audit reads and reports;\nevery fix is yours to make, in your own admin.<\/p>\n\n<h4>What it looks for<\/h4>\n\n<p>Seventeen checks, in six groups:<\/p>\n\n<ul>\n<li><strong>Money<\/strong> \u2014 products that sold in the past year and can no longer be bought; goods selling\nwithout a photo or hidden from the catalogue; sale prices whose scheduled end date has passed\nand are still running; products with no price at all.<\/li>\n<li><strong>Catalogue and navigation<\/strong> \u2014 products outside every category; duplicate SKUs; variable\nproducts with every variation sold out.<\/li>\n<li><strong>Content<\/strong> \u2014 descriptions too short to answer a customer's question; images with no alt text.<\/li>\n<li><strong>Performance and media<\/strong> \u2014 oversized image files; bloated autoloaded options; media entries\nwhose file is missing from disk.<\/li>\n<li><strong>Environment<\/strong> \u2014 PHP, WordPress or WooCommerce on a version that no longer gets security fixes;\na scheduled-task queue that stopped running \u2014 WP-Cron and Action Scheduler are reported\nseparately \u2014 which is what stalls every piece of work meant to happen later.<\/li>\n<li><strong>Product identifiers<\/strong> \u2014 products with no GTIN, UPC, EAN or ISBN, and two products carrying\nthe same one. An empty or duplicated identifier is the usual reason an item quietly drops out of\na shopping feed, and nothing in WooCommerce says a word about it.<\/li>\n<\/ul>\n\n<h4>What makes it different<\/h4>\n\n<ul>\n<li><strong>Every finding shows its evidence.<\/strong> Not \"12 636 problems\" but the field we read, the value we\nfound and the threshold we compared it against.<\/li>\n<li><strong>It tells you where to start.<\/strong> The three items with the largest amount at stake, first \u2014 before\nthe full list.<\/li>\n<li><strong>A zero means \"checked, clean\".<\/strong> A rule that could not run says so instead of quietly\nreporting nothing. \"No data\" and \"no problems\" are different answers, and you get the right one.<\/li>\n<li><strong>It never adds up currencies.<\/strong> A store selling in euros and dollars gets a separate figure for\neach. Adding them without an exchange rate would be inventing a number.<\/li>\n<li><strong>Two scans of an unchanged store give the same result<\/strong>, item for item. When something does\nchange, a separate screen tells you what \u2014 and whether the difference came from your store or\nfrom a rule of ours that got smarter.<\/li>\n<li><strong>\"Hide\" is permanent.<\/strong> Seasonal stock you already know about stops coming back after every\nscan, and stays hidden across plugin updates.<\/li>\n<\/ul>\n\n<h4>Every check has a page that explains it<\/h4>\n\n<p>Seventeen checks, seventeen pages \u2014 linked from the audit screen, next to the rule they belong to.\nEach page says what the problem costs, which fields the rule reads and which thresholds it\ncompares them against, how to fix it, and when the finding is <strong>not<\/strong> a problem in your store.<\/p>\n\n<p>That last part is why the pages exist. A rule you cannot argue with is a rule you end up ignoring\nwholesale, so every page names the cases where the right answer is \"hide this and move on\":\nseasonal goods, spare parts, products sold only by phone.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/merchlint.com\/checks\/\">All seventeen checks, explained<\/a><\/li>\n<li><a href=\"https:\/\/merchlint.com\/changes-nothing\/\">Why there is no \"Fix it\" button<\/a><\/li>\n<li><a href=\"https:\/\/merchlint.com\/sample-report\/\">What a finished report looks like<\/a><\/li>\n<\/ul>\n\n<h4>Your data stays yours<\/h4>\n\n<p>The free version works entirely on your server. No account, no sign-up, no phoning home: the\nplugin makes no outbound connections at all, and an automated check enforces that on every build.<\/p>\n\n<p>The links to merchlint.com are ordinary links. They open in your browser when you click them, and\nthe plugin sends nothing along the way \u2014 not your store's address, not its version, not an\nidentifier of any kind. The only thing in the address is the language your admin is set to, so\nthat a Polish store gets the Polish page. Without a click, nothing leaves your store at all.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin. WooCommerce must be active first \u2014 WordPress enforces this for\nyou.<\/li>\n<li>Open <strong>Store audit<\/strong> in the admin menu.<\/li>\n<li>Press <strong>Scan now<\/strong>. A store with 50 000 products takes about a minute and a half on the hardware\nwe measure on; a slower host takes longer. You can stop the scan at any point.<\/li>\n<\/ol>\n\n<p>The audit reads your catalogue and writes only to its own tables. Removing the plugin removes them.<\/p>\n\n<p><strong>Short PHP time limit?<\/strong> Nothing to do \u2014 the audit reads your host's own limit and sizes each chunk\nto fit inside it, then books the next one itself. A shorter chunk means more of them, not less work:\nthe audit still finishes, and it still resumes from where it stopped.<\/p>\n\n<p>If your host reports a limit it does not actually enforce, you can set the chunk yourself in\n    wp-config.php:<\/p>\n\n<pre><code>define( 'MERCHLINT_BUDGET_SECONDS', 8 );\n<\/code><\/pre>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20change%20anything%20in%20my%20store%3F\"><h3>Does it change anything in my store?<\/h3><\/dt>\n<dd><p>No. It reads your catalogue and reports what it finds. Every change is made by you, in your own\nadmin. This is enforced in the code, not just promised: an automated check refuses to build the\nplugin if it calls any function that would modify products, categories, media or orders.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20store%20down%3F\"><h3>Will it slow my store down?<\/h3><\/dt>\n<dd><p>The scan runs in the background, in short slices, and it only touches the admin side. Your\nstorefront is not involved. If the scan is interrupted \u2014 a server restart, a deployment \u2014 it picks\nup where it left off and gives the same result as an uninterrupted run.<\/p><\/dd>\n<dt id=\"can%20i%20audit%20a%20store%20with%20tens%20of%20thousands%20of%20products%3F\"><h3>Can I audit a store with tens of thousands of products?<\/h3><\/dt>\n<dd><p>Yes. A scan of 50 000 products completes in about 90 seconds and the results are paginated, so\na rule with twelve thousand findings still opens instantly.<\/p><\/dd>\n<dt id=\"why%20does%20it%20check%20wp-cron%20and%20action%20scheduler%3F\"><h3>Why does it check WP-Cron and Action Scheduler?<\/h3><\/dt>\n<dd><p>Because a stalled queue fails quietly. WP-Cron and Action Scheduler are what WooCommerce and its\nextensions book later work on \u2014 order emails, the end of a scheduled sale, stock released from\nabandoned carts, subscription renewals \u2014 and neither your storefront nor your order list will tell\nyou they stopped. The store keeps selling. It just stops doing everything that was meant to happen\nlater.<\/p>\n\n<p>The two queues are reported as separate findings, because they stop for different reasons and are\nfixed in different places. What the rule measures is the age of the oldest overdue action, not how\nmany are waiting: a store with no visitors always has a queue full of them and is perfectly\nhealthy, because the first visitor clears it. Anything overdue by more than a day is not quiet, it\nis broken \u2014 and that threshold is yours to move.<\/p><\/dd>\n<dt id=\"what%20does%20%22store%20health%22%20cover%20here%3F\"><h3>What does \"store health\" cover here?<\/h3><\/dt>\n<dd><p>Everything the seventeen checks touch, not only product fields: the catalogue and its categories, the\nmedia library and the files behind it, the size of your autoloaded options, and the versions of PHP,\nWordPress and WooCommerce you are running. A store can have faultless product data and still be\nlosing money to a stalled queue or to an unsupported PHP version, so the report covers both.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20multilingual%20stores%3F\"><h3>Does it work with multilingual stores?<\/h3><\/dt>\n<dd><p>Yes. Translations of one product are counted as one product: their SKU is shared deliberately, and\ntheir stock is one physical stock, so we never report the same goods twice or double the amount at\nstake. Polylang is tested with the plugin itself; WPML is recognised through its translation table,\nwhich we test against the same data it produces.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes, with HPOS on and off. Both modes give identical results, amounts included.<\/p><\/dd>\n<dt id=\"some%20of%20the%20findings%20do%20not%20apply%20to%20my%20store.\"><h3>Some of the findings do not apply to my store.<\/h3><\/dt>\n<dd><p>Then hide them. Every rule's page explains when the finding is NOT a problem \u2014 seasonal goods,\nspare parts, products sold only by phone \u2014 and hiding is one click. The decision survives future\nscans, and the hidden items stay visible as a count, so nothing disappears silently.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.3<\/h4>\n\n<ul>\n<li><p><strong>The plugin no longer does anything at all when WooCommerce is not active.<\/strong> Until now it\ncreated its own tables on every page load, registered the audit screen and added its WP-CLI\ncommand even on a site with no WooCommerce - and then showed an empty screen without a word\nof explanation. It now checks first, says so in one sentence on the dashboard, and touches\nnothing. Saved results are left exactly as they were: activate WooCommerce and everything\ncomes back.<\/p><\/li>\n<li><p><strong>New display name: Merchlint - Catalog Audit for WooCommerce.<\/strong> Only the displayed name\nchanged: same plugin, same directory address, same settings, same saved audits. Nothing in\nyour shop needs doing, and the screen in your admin menu is where it was.<\/p><\/li>\n<li><p><strong>The identifier checks now say when your numbers are kept in another plugin's field.<\/strong> Both\nchecks read WooCommerce's own GTIN, UPC, EAN or ISBN field. When products hold their number only\nin a field of EAN for WooCommerce, Germanized for WooCommerce, Trusted Shops Easy Integration,\nGoogle for WooCommerce, Customer Reviews for WooCommerce or Product Feed Manager for WooCommerce,\nthe audit now says how many, names the field and\nsays plainly which check cannot see those numbers \u2014 on the results screen, on the check's own\npage, in WP-CLI and in the CSV export. Germanized passes its numbers through WooCommerce's own\nfield when that field is empty, so with Germanized active only the duplicate check is affected.\nNothing is counted differently: no finding appears or disappears, and earlier scans stay\ncomparable.<\/p><\/li>\n<li><p><strong>A check's own page now shows what that check could not see.<\/strong> Notes about gaps were only on\nthe main results screen, above the list of checks \u2014 not next to the findings they explain.<\/p><\/li>\n<li><p><strong>\"What this audit could NOT check\" no longer says \"these rules found nothing\" about rules that\nran.<\/strong> A rule that missed only part of what it looks at is now listed separately, with a sentence\nof its own.<\/p><\/li>\n<li><p><strong>Invisible characters in product codes now show in the evidence.<\/strong> Two codes that differ only\nby a non-breaking space or a zero-width character look the same on screen, so a pair of\nduplicates could show one value twice, with no way to tell which product carries the extra\ncharacter. The evidence now writes each such character as \u27e8U+00A0\u27e9 and similar, on the screen and\nin the CSV export. Clean codes look exactly as before.<\/p><\/li>\n<li><p><strong>Three WP-CLI commands now stop on bad input instead of guessing.<\/strong> With a mistyped check code,\n\"findings\" listed and \"export\" exported every finding instead of none; an invalid separator in\n\"export\" ended in a critical error; \"cancel\" reported success for a scan that does not exist.\nEach of them now says what was wrong.<\/p><\/li>\n<li><p><strong>Two WP-CLI outputs now keep gaps apart from findings.<\/strong> The message after \"export\" counted the\nrows about gaps \u2014 what the audit could not check \u2014 as findings, so a check that never ran was\nreported as one saved finding. It now counts findings only and names the gap rows separately.\n\"status --format=json\" now lists the gaps the same way \"rule --format=json\" does; until now a\ncheck that did not run simply disappeared from its counts.<\/p><\/li>\n<li><p><strong>The advice for missing sales data now points to a button that exists.<\/strong> When WooCommerce's\norder summary table was empty, the audit told you to run \"Regenerate the order lookup tables\" in\nStatus \u2192 Tools, and WooCommerce has no such tool. It now sends you to Analytics \u2192 Settings \u2192\n\"Import historical data\", and the WP-CLI warning gives the same advice instead of naming a script\nthat is not part of the plugin.<\/p><\/li>\n<li><p><strong>One request for a review, under the results.<\/strong> It appears once per user after a finished\naudit and goes away for good when you open it or choose \"Don't ask again\". No reward is offered\nand no rating is suggested.<\/p><\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li><p><strong>On WooCommerce older than 9.2 the two identifier checks now say they did not run, instead of\nreporting numbers.<\/strong> That WooCommerce has no field for a product identifier at all. If the\nfield had been written straight into the database - after moving back from a newer version, or\nby an import - the plugin used to treat the store as one that keeps identifiers while reading\nevery one of them as empty: the duplicate check then reported nothing even when duplicates\nwere there. Both checks now stay quiet and say why, naming the WooCommerce version that first had the field.<\/p><\/li>\n<li><p><strong>The evidence column no longer shows a Polish word on an English screen.<\/strong> Where a check reads\na field and finds it empty, the value now reads \"(empty)\". It had been coming straight from the audit\nengine, which has no access to translations, so the Polish \"(puste)\" appeared for anyone reading the\nscreen in English - in the one column whose whole job is to let you verify us.<\/p><\/li>\n<li><p><strong>The duplicate-identifier check now says when it had nothing to compare.<\/strong> On a catalogue where\nnot one product carries an identifier, it used to report \"nothing found - this check is clean\" - a clean\nbill of health for a field nobody fills, and two different sentences about the same field one under the\nother, because the missing-identifier check said so correctly. Both checks now give the same answer,\nwith the same reason.<\/p><\/li>\n<li><p><strong>A finding on a variation now links straight to the tab where you fix it.<\/strong> The link in\nthe list opened the parent product at the top of the page; on a product with twenty\nvariations that is a long way from the one you were sent to. The export file had carried\nthe right link all along - only the screen did not.<\/p><\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li><strong>Both duplicate checks now see codes stored on variations, not only on products.<\/strong> Until now the\ncomparison ran over products alone, so a code repeated between one product and another product's\nvariation was invisible \u2014 even though an export file treats every variation as a separate item.\nOn a store with variable products the numbers can go up after this update.<\/li>\n<li><strong>The identifier check also reports a product that shares its number with its own variation. The\nSKU check does not<\/strong> \u2014 and that difference is deliberate. WooCommerce shows the parent's SKU on a\nvariation that has none, so for SKU that pair is how the platform behaves, not a fault. For the\nidentifier there is no such inheritance: WooCommerce requires it to be unique across products and\nvariations, yet never notices when an import writes the pair straight to the database, so this is\nthe only place it surfaces. It matters when an export file carries the parent alongside its\nvariations \u2014 then two items go out with one number.<\/li>\n<li>One pair is still left out and the knowledge pages now say so: two variations of one product\nsharing a code while the product itself carries none. A finding belongs to a product, and there\nis nothing to attach it to there.<\/li>\n<li><strong>The three checks whose behaviour changed carry a new version number, and that is deliberate.<\/strong>\nThe \"Changes since the previous audit\" screen reads those numbers to tell you when a movement\ncomes from us rather than from your store, and anything you hid under the old version is marked\nfor a second look \u2014 your decision was an answer to a question that is now worded differently.\nNothing is un-hidden behind your back; it is only flagged.<\/li>\n<li><strong>Variations sitting in the trash no longer count \u2014 anywhere.<\/strong> A variable product whose living\nvariations all carried an identifier could still be reported as missing one, because a trashed\nvariation had none; the same ghost could make a code look duplicated. Nothing in the shop shows\nthose variations, and WooCommerce's own uniqueness check ignores the trash as well \u2014 now so do we.\nThis one was in the previous release too, not only in the change above.<\/li>\n<li><strong>Two additions to the identifier check's knowledge page.<\/strong> What to do when the check is clean\nand the export file still shows no identifier \u2014 an export plugin may read the field through a\ncached list of fields, which a product save does not refresh. And why a number copied onto\nvariations while a file is being built hides the gap rather than closing it: a shopping service\nexpects each variation to carry its own, and this check reports what WooCommerce holds.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li><strong>Two new checks, both free and with no product cap: a product with no GTIN, UPC, EAN or ISBN,\nand two products sharing the same one.<\/strong> Shopping services use that identifier to match your\noffer to the same product sold elsewhere, so an empty or duplicated one is the usual reason an\nitem quietly drops out of a feed. WooCommerce has had the field since 9.2, on the Inventory tab,\nand nothing in the admin ever points at it. The check reads WooCommerce's own field; identifiers\nkept in a plugin's field or in a product attribute are not read.<\/li>\n<li><strong>The missing-identifier check stays quiet in shops that do not use identifiers at all.<\/strong> If not\none product has the field filled, you get a single sentence saying so instead of a list of your\nentire catalogue \u2014 handmade goods, services and your own production carry no manufacturer's\nbarcode and need none.<\/li>\n<li>On a variable product the identifier belongs on each variation, so such a product gives <strong>one<\/strong>\nfinding with the evidence \"6 variations without a GTIN\" \u2014 not six separate rows.<\/li>\n<li>Translations of one product are not reported as a duplicate, exactly as with SKU.<\/li>\n<li><strong>After an update, \"Changes since the previous audit\" now names the checks that are new.<\/strong>\nTwo checks arriving at once means findings arriving at once, and the screen showed the\nmovement without saying where it came from \u2014 so it read as if something had broken in your\nstore overnight. A check that is new and found nothing stays out of the way.<\/li>\n<li><strong>A check that could not run no longer reads as a clean one \u2014 on every screen, not just some.<\/strong>\nThe audit screen has always had a section saying what could not be checked and why. Two places\ndid not: the dashboard tile counted such a check among the rules it had gone through, and\n\"Changes since the previous audit\" showed its findings dropping to zero exactly as it shows a\nreal fix. On a store that keeps no product identifiers at all, that meant being congratulated\nfor something nobody had measured. The tile now says how many checks could not run, and the\ncomparison says plainly that a drop there is not a fix.<\/li>\n<li><strong>An empty catalogue is no longer reported as a clean one.<\/strong> A store with no products got a row\nof zeros and a tile saying nothing needed fixing \u2014 which is what a fresh WooCommerce install\nlooks like before the first product is added. The audit now says plainly that there was nothing\nto check.<\/li>\n<li>Ready since 0.2.2 and shipping here: <strong>the audit engine no longer assumes every store can answer\nevery question.<\/strong> A rule now says what it needs, and a store that cannot provide it gets a plain\nnote saying the rule was not applicable \u2014 instead of a silent zero that reads like a clean\nresult. On WooCommerce every rule still applies, so every check you already had gives exactly\nthe same result as it did under 0.2.1.<\/li>\n<li>The list of rules moved into the audit engine itself.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li><strong>New display name: Merchlint \u2013 Store Audit for WooCommerce.<\/strong> Same plugin, same address, same\nsettings \u2014 the name now says what it does, for people who find plugins by searching for the job\nrather than for a brand.<\/li>\n<li><strong>Every rule now links to its own page<\/strong>, which explains what the finding costs, exactly how the\nrule decides, how to fix it, and when it is not a problem worth fixing. The link opens in your\nbrowser and carries nothing but the language of your admin; the plugin itself still makes no\noutbound connections at all.<\/li>\n<li>The plugin's name on your plugins list is now a link to its home page. Until now it led nowhere.<\/li>\n<li>No change to what the audit checks or reports. A scan of an unchanged store gives exactly the\nsame result as it did under 0.2.0.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li><strong>First public release.<\/strong> Versions 0.1.0 and 0.1.1 below were pre-release: they were reviewed but\nnever published, so this is the first version you can install from the directory. Everything the\naudit does is listed under 0.1.0.<\/li>\n<li>Two extension points so add-ons can build on the audit: an action when a scan finishes and\na filter over the scan settings, plus the scan history behind both.<\/li>\n<li>Rules the current scan did not run are now marked \"not in this audit\" instead of \"clean\".<\/li>\n<li>A scan now keeps its settings even if an add-on hands it a value that cannot be stored \u2014 before,\none such value silently dropped every threshold the scan was running with, and the second half of\nthe scan used the defaults.<\/li>\n<li>Comparing two audits no longer writes a PHP notice to the log when a setting holds a list rather\nthan a number.<\/li>\n<li>No change to what the audit checks on its own.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Translations now come from translate.wordpress.org instead of files bundled in the plugin.<\/li>\n<li>No change to what the audit checks or reports.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release. Fifteen checks, resumable scanning, CSV export, per-rule knowledge pages,\npermanent \"hide\", English and Polish.<\/li>\n<\/ul>","raw_excerpt":"Read-only WooCommerce product audit: goods that sold but are out of stock, duplicate SKUs, missing prices \u2014 each with the money at stake.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/360163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=360163"}],"author":[{"embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/baltano"}],"wp:attachment":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=360163"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=360163"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=360163"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=360163"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=360163"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=360163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}