{"id":354524,"date":"2026-08-16T21:57:48","date_gmt":"2026-08-16T21:57:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pa-automatic-product-sorting-for-woocommerce\/"},"modified":"2026-08-16T21:57:21","modified_gmt":"2026-08-16T21:57:21","slug":"atelier-product-sorting-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/atelier-product-sorting-for-woocommerce\/","author":23544006,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"6.9","requires_php":"8.3","requires_plugins":null,"header_name":"Atelier - Automatic Product Sorting for WooCommerce","header_author":"Plugins Atelier","header_description":"Essential automatic product sorting by category: ranks products using observed net units, catalog availability, and new arrivals, with Preview, Apply, and a safe return to the native baseline.","assets_banners_color":"bfc3b2","last_updated":"2026-08-16 21:57:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":32,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"pluginsatelier","date":"2026-08-16 21:57:21"}},"upgrade_notice":{"1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3650211,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3650211,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3650211,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3650211,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3650211,"resolution":"1","location":"assets","locale":"","width":1280,"height":688},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3650211,"resolution":"2","location":"assets","locale":"","width":1280,"height":688},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3650211,"resolution":"3","location":"assets","locale":"","width":1280,"height":688}},"screenshots":{"1":"The Fleetboard shows every category's sorting status and its next action.","2":"Preview explains the proposed order and every movement before the first Apply.","3":"History previews a safe Rollback before serving a previous published order again."}},"plugin_section":[],"plugin_tags":[2777,610,43294,37973,286],"plugin_category":[45,57],"plugin_contributors":[276027],"plugin_business_model":[],"class_list":["post-354524","plugin","type-plugin","status-publish","hentry","plugin_tags-catalog","plugin_tags-categories","plugin_tags-merchandising","plugin_tags-product-sorting","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-taxonomy","plugin_contributors-pluginsatelier","plugin_committers-pluginsatelier"],"banners":{"banner":"https:\/\/ps.w.org\/atelier-product-sorting-for-woocommerce\/assets\/banner-772x250.png?rev=3650211","banner_2x":"https:\/\/ps.w.org\/atelier-product-sorting-for-woocommerce\/assets\/banner-1544x500.png?rev=3650211","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/atelier-product-sorting-for-woocommerce\/assets\/icon-128x128.png?rev=3650211","icon_2x":"https:\/\/ps.w.org\/atelier-product-sorting-for-woocommerce\/assets\/icon-256x256.png?rev=3650211","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/atelier-product-sorting-for-woocommerce\/assets\/screenshot-1.png?rev=3650211","caption":"The Fleetboard shows every category's sorting status and its next action."},{"src":"https:\/\/ps.w.org\/atelier-product-sorting-for-woocommerce\/assets\/screenshot-2.png?rev=3650211","caption":"Preview explains the proposed order and every movement before the first Apply."},{"src":"https:\/\/ps.w.org\/atelier-product-sorting-for-woocommerce\/assets\/screenshot-3.png?rev=3650211","caption":"History previews a safe Rollback before serving a previous published order again."}],"raw_content":"<!--section=description-->\n<p>Automatic product sorting ranks category archives using observed net units\nsold, catalog availability, and which products are new arrivals.<\/p>\n\n<p>Before the first change, the plugin shows what would move. The first Apply for\na category approves the formula and policy and publishes the reviewed order.<\/p>\n\n<p>Later candidates may publish automatically when only data changes under that\napproval. A formula or policy change returns to Preview. Pause stops\npublications; Restore returns to the native order; Rollback serves a selected\nearlier order until you publish again. The dashboard attributes and timestamps\neach change.<\/p>\n\n<h4>What it measures exactly<\/h4>\n\n<ul>\n<li><strong>Observed net units over 30 days<\/strong>, adjusted for refunds with an\nattributable quantity. It counts every order that WooCommerce exposes as\npaid and in an eligible status and does not automatically exclude test\norders. Each run takes a complete U30 snapshot, and the population, coverage,\nand cutoff are visible.<\/li>\n<li><strong>Catalog availability observed during the latest calculation.<\/strong> This is\nwhat the catalog reported at that moment, not a checkout reservation or a\nreal-time promise.<\/li>\n<li><strong>New arrivals<\/strong>, with a window configurable per category.<\/li>\n<\/ul>\n\n<h4>What it does not do<\/h4>\n\n<ul>\n<li>It does not promise to increase sales or improve conversion. It sorts by an\nobserved signal; what happens afterwards depends on your store.<\/li>\n<li>There is no \"smart score,\" AI, per-visitor personalization, or random\nexploration.<\/li>\n<li>It does not know real-time stock or the units actually free at checkout.<\/li>\n<li>It does not collect impressions, clicks, or sessions.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>All calculations run on your server. The plugin sends no telemetry or store\ndata, depends on no external service, and makes no network request to sort\nproducts. WordPress itself may still check WordPress.org for updates.<\/p>\n\n<h4>Where it sorts and where it does not<\/h4>\n\n<p>The plugin sorts only when it can identify one category unambiguously.<\/p>\n\n<p>It serves the ranking in:<\/p>\n\n<ul>\n<li>The main category archive of a classic theme when WooCommerce uses its\ndefault or manual order.<\/li>\n<li>The Product Collection block in Default\/inherit mode inside the category\ntemplate.<\/li>\n<li>The Product Collection block in Custom+Manual mode when the category is\nunambiguous and no other ordering criterion exists, including editor preview.<\/li>\n<\/ul>\n\n<p>It keeps the native order for: an explicit order selected by the visitor,\nsearch, the main shop archive, queries spanning several categories, the Store\nAPI, external search engines, and custom SQL queries from other plugins.<\/p>\n\n<p>Not claimed as supported: shortcodes, page builders, headless setups,\nWPML\/Polylang, and page or CDN caches. The dashboard is ready for translation\nand supports RTL; multilingual catalog sorting has not been verified.<\/p>\n\n<p><strong>WordPress Multisite is not supported.<\/strong> The plugin detects it, explains the\nlimitation, and does nothing else: no tables, no scheduled work, and no\nstorefront intervention on any site in the network.<\/p>\n\n<h3>Development<\/h3>\n\n<p>Human-readable admin source is included in <code>admin-ui\/src\/<\/code>; WordPress runs the\ncompiled files in <code>assets\/admin\/<\/code>. With Node 20+ and npm 10+, rebuild them with\n    npm ci &amp;&amp; npm run build:assets. <code>package-lock.json<\/code> pins the JavaScript\ntoolchain. <code>composer install --no-dev --classmap-authoritative<\/code> rebuilds a\nfunctional PHP autoloader from <code>composer.lock<\/code>. The plugin already includes its\nproduction assets and autoloader, so merchants do not run either build tool.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce, which is a required dependency.<\/li>\n<li>Install and activate Atelier - Automatic Product Sorting for WooCommerce.<\/li>\n<li>Go to <strong>WooCommerce \u2192 Product sorting<\/strong> and follow the guided first run.<\/li>\n<\/ol>\n\n<p>Requirements: WordPress 6.9 or later, PHP 8.3 or later, WooCommerce 10.8 or\nlater, MySQL or MariaDB with InnoDB, and a single-site installation.<\/p>\n\n<p>Administrators and shop managers can view the dashboard. Publishing,\nrestoring, or changing settings also requires permission to manage\nWooCommerce.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20activating%20it%20change%20anything%20in%20my%20store%3F\"><h3>Does activating it change anything in my store?<\/h3><\/dt>\n<dd><p>No. Activation prepares the plugin's tables; the native order remains until\nyou publish. Calculation is read-only for WooCommerce orders and products.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20confirm%20every%20update%3F\"><h3>Do I have to confirm every update?<\/h3><\/dt>\n<dd><p>No. The first Apply approves the reviewed formula and policy. A complete\ncandidate caused only by later data changes may publish under that contract.<\/p>\n\n<p>Formula or policy changes return to Preview. Pause keeps the served order;\nRestore reveals the native baseline; Rollback keeps a selected earlier order.\nStatus and history show what changed, how, and when.<\/p><\/dd>\n<dt id=\"what%20does%20each%20category%20status%20mean%2C%20and%20what%20should%20i%20do%3F\"><h3>What does each category status mean, and what should I do?<\/h3><\/dt>\n<dd><p>The dashboard explains every status and its next action. <strong>Not calculated<\/strong>,\n<strong>Calculating<\/strong>, and <strong>Ready for review<\/strong> cover the first publication;\n<strong>Published<\/strong> is serving an order; <strong>Outdated<\/strong>, <strong>Degraded coverage<\/strong>, and\n<strong>Blocked<\/strong> require a new run or diagnostic review; <strong>Paused<\/strong> keeps the\ncurrent order; <strong>Restored<\/strong> serves WooCommerce's native order.<\/p><\/dd>\n<dt id=\"how%20do%20i%20go%20back%20if%20i%20do%20not%20like%20the%20order%3F\"><h3>How do I go back if I do not like the order?<\/h3><\/dt>\n<dd><p>Restore immediately returns the category to WooCommerce's native order. It\ndeletes nothing; history remains available.<\/p>\n\n<p>Rollback restores an earlier retained order after showing its diff. An order\ncontaining a product that no longer exists is rejected rather than partially\npublished. It remains fixed until you publish again.<\/p>\n\n<p>If calculation is failing, <em>Run now<\/em> resumes blocked or outdated work instead.<\/p><\/dd>\n<dt id=\"what%20is%20stored%2C%20and%20for%20how%20long%3F\"><h3>What is stored, and for how long?<\/h3><\/dt>\n<dd><p>In its own tables, the plugin keeps calculated generations, positions,\nexplanations, pending work, and command log. Per category it retains the served\ngeneration, latest candidate, and five previous published generations; other\ngenerations are pruned after seven days. It neither modifies nor copies orders\nor products and stores no per-order demand contribution.<\/p>\n\n<p>Diagnostics are calculated from live state and have no history in Free.<\/p><\/dd>\n<dt id=\"what%20happens%20with%20custom%20order%20statuses%3F\"><h3>What happens with custom order statuses?<\/h3><\/dt>\n<dd><p>The plugin uses WooCommerce's public APIs. Diagnostics report correctly\nregistered custom statuses as unclassified, with their observed order count.<\/p>\n\n<p>An incompletely registered status may be invisible, especially under HPOS.\nThe plugin cannot count or report orders WooCommerce does not return and does\nnot invent a zero; the dashboard and export declare this limitation.<\/p>\n\n<p>Fix that integration and recalculate. The plugin does not read internal order\ntables as a workaround.<\/p><\/dd>\n<dt id=\"what%20is%20removed%20on%20uninstall%3F\"><h3>What is removed on uninstall?<\/h3><\/dt>\n<dd><p>Its tables, options, caches, scheduled tasks, and capability. WooCommerce data\nis not touched.<\/p>\n\n<p>Deactivation removes storefront ordering and scheduled work but keeps\nconfiguration and history. Reactivation starts in native order until another\nreview and publication.<\/p><\/dd>\n<dt id=\"what%20information%20can%20i%20send%20to%20support%3F\"><h3>What information can I send to support?<\/h3><\/dt>\n<dd><p>The downloadable JSON diagnostic contains allowlisted versions, statuses,\ncounts, and category identifiers\u2014not secrets, personal data, order content,\ncategory names, or store URL.<\/p>\n\n<p>It is generated only on request and never sent automatically.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20help%3F\"><h3>How do I get help?<\/h3><\/dt>\n<dd><p>Email support@pluginsatelier.com and attach the exportable diagnostic.<\/p>\n\n<p>The WordPress.org forum is not a promised support channel. Email is.<\/p>\n\n<p>Phone, chat, store access, consulting, and custom development are outside Free.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Sorts products within WooCommerce categories by net units, availability, and new arrivals, with initial approval and safe Restore.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/354524","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=354524"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pluginsatelier"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=354524"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=354524"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=354524"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=354524"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=354524"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=354524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}