{"id":82221,"date":"2018-02-27T17:33:36","date_gmt":"2018-02-27T17:33:36","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/rockon-woo-variations-table\/"},"modified":"2026-08-27T07:11:11","modified_gmt":"2026-08-27T07:11:11","slug":"rockon-woo-variations-table","status":"publish","type":"plugin","link":"https:\/\/lo.wordpress.org\/plugins\/rockon-woo-variations-table\/","author":15298435,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"7.0.0","stable_tag":"7.0.0","tested":"7.0.4","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"RockOn Woo Variations Table","header_author":"Vikas Sharma","header_description":"Plugin to turn Woocommerce normal variations select menus to table - grid. Short-code [rovartable id='1,2,4']","assets_banners_color":"","last_updated":"2026-08-27 07:11:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/rockon-woo-variations-table\/","header_author_uri":"https:\/\/profiles.wordpress.org\/devikas301","rating":0,"author_block_rating":0,"active_installs":0,"downloads":1518,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"6.0":{"tag":"6.0","author":"devikas301","date":"2020-12-06 05:05:20","revision":2432435},"7.0.0":{"tag":"7.0.0","author":"devikas301","date":"2026-08-27 07:11:11","revision":3668242}},"upgrade_notice":{"7.0.0":"<p>Security and compatibility rewrite for WooCommerce 8+ and PHP 8. Existing shortcodes keep rendering the same columns, and the version 6 template functions still work. See &quot;Upgrading from version 6&quot; for the few things to check.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":0},"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["6.0","7.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3668239,"resolution":"1","location":"assets","locale":"","width":926,"height":238},"screenshot-2.PNG":{"filename":"screenshot-2.PNG","revision":3668239,"resolution":"2","location":"assets","locale":"","width":581,"height":59}},"screenshots":{"1":"Products shown in table format on the front end.","2":"Shortcode example."}},"plugin_section":[],"plugin_tags":[359,146135,2289,6602,286],"plugin_category":[43,45],"plugin_contributors":[144127],"plugin_business_model":[],"class_list":["post-82221","plugin","type-plugin","status-publish","hentry","plugin_tags-order-form","plugin_tags-product-table","plugin_tags-table","plugin_tags-variations","plugin_tags-woocommerce","plugin_category-customization","plugin_category-ecommerce","plugin_contributors-devikas301","plugin_committers-devikas301"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/rockon-woo-variations-table.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/rockon-woo-variations-table\/assets\/screenshot-1.png?rev=3668239","caption":"Products shown in table format on the front end."},{"src":"https:\/\/ps.w.org\/rockon-woo-variations-table\/assets\/screenshot-2.PNG?rev=3668239","caption":"Shortcode example."}],"raw_content":"<!--section=description-->\n<p>RockOn Woo Variations Table turns WooCommerce's variation dropdowns into a compact table, so shoppers can compare and order several products from one page instead of visiting each product in turn.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Shortcode <code>[rovartable]<\/code> and a \"Variations Table\" block.<\/li>\n<li>Pick products by ID, category, tag, or product attribute.<\/li>\n<li>Optional columns: image, title, SKU, attributes, price, stock, quantity, basket.<\/li>\n<li>Live price, stock, SKU and image updates as options are chosen, with no page reload.<\/li>\n<li>AJAX add to basket, including an optional \"Add selected to basket\" button for the whole table.<\/li>\n<li>Works without JavaScript: every row falls back to a link to the product page.<\/li>\n<li>Accessible markup: real table headers, labelled form controls, live-region status messages.<\/li>\n<li>Responsive: the table stacks into cards on small screens.<\/li>\n<li>Respects the visitor's light or dark colour scheme.<\/li>\n<li>Fully translatable.<\/li>\n<\/ul>\n\n<p><strong>Performance<\/strong><\/p>\n\n<p>Variation data is embedded in the page so option matching happens instantly in the browser. Products with more variations than the threshold (30 by default, filterable via <code>rwvt_ajax_variation_threshold<\/code>) fall back to a single AJAX lookup, mirroring WooCommerce's own behaviour.<\/p>\n\n<h3>Shortcode<\/h3>\n\n<p>Basic use:<\/p>\n\n<pre><code>[rovartable id=\"12,34,56\"]\n<\/code><\/pre>\n\n<p><strong>Choosing products<\/strong><\/p>\n\n<ul>\n<li><code>id<\/code> \u2014 comma separated product IDs, rendered in the order given.<\/li>\n<li><code>category<\/code> \u2014 comma separated product category slugs.<\/li>\n<li><code>tag<\/code> \u2014 comma separated product tag slugs.<\/li>\n<li><code>attribute<\/code> + <code>terms<\/code> \u2014 a product attribute slug and its term slugs, e.g. <code>attribute=\"colour\" terms=\"red,blue\"<\/code>.<\/li>\n<li><code>exclude<\/code> \u2014 product IDs to leave out.<\/li>\n<li><code>categories_exc<\/code> \u2014 category slugs to leave out.<\/li>\n<li><code>limit<\/code> \u2014 maximum number of products (0 = no limit).<\/li>\n<li><code>orderby<\/code> \u2014 <code>date<\/code>, <code>title<\/code>, <code>menu_order<\/code>, <code>ID<\/code>, <code>rand<\/code> or <code>modified<\/code>. Default <code>date<\/code>.<\/li>\n<li><p><code>order<\/code> \u2014 <code>ASC<\/code> or <code>DESC<\/code>. Default <code>DESC<\/code>.<\/p>\n\n<p>id takes priority: when it is set, the category, tag and attribute filters are ignored.<\/p><\/li>\n<\/ul>\n\n<p><strong>Controlling the table<\/strong><\/p>\n\n<ul>\n<li><code>columns<\/code> \u2014 comma separated, in display order. Available: <code>image<\/code>, <code>title<\/code>, <code>sku<\/code>, <code>attributes<\/code>, <code>price<\/code>, <code>stock<\/code>, <code>quantity<\/code>, <code>button<\/code>. Default <code>title,attributes,price,stock,quantity,button<\/code>.<\/li>\n<li><code>thead<\/code> \u2014 custom header labels, comma separated, replacing the defaults in order.<\/li>\n<li><code>caption<\/code> \u2014 a visible caption above the table.<\/li>\n<li><code>class<\/code> \u2014 extra CSS classes on the wrapper.<\/li>\n<li><code>link_titles<\/code> \u2014 <code>yes<\/code> (default) or <code>no<\/code>.<\/li>\n<li><code>add_all<\/code> \u2014 <code>yes<\/code> to show an \"Add selected to basket\" button. Default <code>no<\/code>.<\/li>\n<li><code>disabled<\/code> \u2014 <code>yes<\/code> renders a read-only table with no dropdowns, quantity fields or basket buttons. Default <code>no<\/code>.<\/li>\n<\/ul>\n\n<p><strong>Examples<\/strong><\/p>\n\n<pre><code>[rovartable id=\"12,34\" thead=\"Product,Colour,Size,Price,Stock,Qty,Basket\"]\n\n[rovartable category=\"t-shirts\" limit=\"10\" orderby=\"title\" order=\"ASC\" columns=\"image,title,sku,attributes,price,quantity,button\" add_all=\"yes\"]\n\n[rovartable attribute=\"colour\" terms=\"red\" caption=\"Everything in red\"]&lt;h3&gt;Hooks&lt;\/h3&gt;\n<\/code><\/pre>\n\n<p>Filters:<\/p>\n\n<ul>\n<li><code>rwvt_product_ids<\/code> \u2014 the resolved product ID list for a table.<\/li>\n<li><code>rwvt_table_columns<\/code> \u2014 the resolved column definitions.<\/li>\n<li><code>rwvt_render_custom_column<\/code> \u2014 render a custom column's cell.<\/li>\n<li><code>rwvt_no_products_message<\/code> \u2014 the output when a table matches nothing.<\/li>\n<li><code>rwvt_script_settings<\/code> \u2014 the configuration handed to the front-end script.<\/li>\n<li><code>rwvt_ajax_variation_threshold<\/code> \u2014 inline variation payload cut-off.<\/li>\n<\/ul>\n\n<h3>Upgrading from version 6<\/h3>\n\n<p><strong>Your existing shortcodes keep working.<\/strong> <code>[rovartable id=\"12,34\"]<\/code> and <code>[rovartable id=\"12,34\" thead=\"Title,Colour,Size,Basket\"]<\/code> render the same columns they always did.<\/p>\n\n<p>A shortcode that supplies <code>thead<\/code> keeps the version 6 column set (title, one column per attribute, then basket), because <code>thead<\/code> labels are positional and adding the new columns would shift every label onto the wrong one. To take the new Price, Stock and Qty columns, name them explicitly:<\/p>\n\n<pre><code>[rovartable id=\"12,34\" columns=\"title,attributes,price,stock,quantity,button\" thead=\"Product,Colour,Cost,Availability,Amount,Basket\"]\n<\/code><\/pre>\n\n<p>Shortcodes without <code>thead<\/code> gain the new columns automatically.<\/p>\n\n<p><strong>Two behaviour changes to be aware of<\/strong><\/p>\n\n<ul>\n<li><code>disabled<\/code> was accepted but never did anything in version 6. It now renders a read-only table. If you had <code>disabled<\/code> on a shortcode, remove it unless you want that.<\/li>\n<li><code>categories_exc<\/code> was also accepted and ignored. It now genuinely excludes those categories.<\/li>\n<\/ul>\n\n<p><strong>Custom CSS<\/strong><\/p>\n\n<p>These version 6 hooks are unchanged: <code>.ron-woo-table-section<\/code>, <code>tbody.row-hover<\/code>, <code>tr.row-2<\/code>, <code>.even<\/code>, <code>.odd<\/code>, <code>td.value<\/code>, <code>td.column-5<\/code>, <code>select.user_vote<\/code>.<\/p>\n\n<p>These are gone, because the markup they belonged to was invalid or buggy: <code>div.ro-loader-*<\/code>, <code>input#ron-att-name-*<\/code>, <code>select#ron-attr-*<\/code>, and <code>a#add-cart-*<\/code>. The basket control is now <code>button.rwvt-add-to-cart<\/code>, and each cell carries <code>data-column<\/code> so it can be targeted reliably.<\/p>\n\n<p><strong>Custom PHP<\/strong><\/p>\n\n<pre><code>ron_woo_variations_table(), `ron_woo_variable_add_to_cart()` and `ron_woo_find_matching_product_variation()` still exist as deprecated wrappers, so template customisations will not fatal. They log a deprecation notice when `WP_DEBUG` is on and will be removed in a future major release; move to `do_shortcode( '[rovartable ...]' )`.\n<\/code><\/pre>\n\n<p><strong>Custom JavaScript<\/strong><\/p>\n\n<p>The <code>check_choosed_var<\/code> AJAX action and the global <code>getVarData()<\/code> function have been removed. The replacement endpoints require a nonce. If you wrote custom scripts against them, they need updating.<\/p>\n\n<p><strong>Requirements<\/strong><\/p>\n\n<p>Version 7 needs WordPress 6.4+, PHP 7.4+ and WooCommerce 8.0+. On older setups WordPress will not offer the update, so those sites simply stay on version 6 rather than breaking.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>rockon-woo-variations-table<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it through Plugins \u2192 Add New.<\/li>\n<li>Activate the plugin through the Plugins menu.<\/li>\n<li>Add the <code>[rovartable]<\/code> shortcode to any post or page, or insert the \"Variations Table\" block.<\/li>\n<\/ol>\n\n<p>WooCommerce must be installed and active.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20simple%20products%3F\"><h3>Does this work with simple products?<\/h3><\/dt>\n<dd><p>Yes. Simple products are shown as ordinary rows with a working add to basket button. Where a column does not apply to a product, the cell shows a dash so the table stays aligned.<\/p><\/dd>\n<dt id=\"what%20if%20two%20products%20have%20different%20attributes%3F\"><h3>What if two products have different attributes?<\/h3><\/dt>\n<dd><p>The header is the union of every attribute in the table. A product that does not use one of them shows a dash in that column.<\/p><\/dd>\n<dt id=\"can%20shoppers%20deep%20link%20to%20a%20preselected%20option%3F\"><h3>Can shoppers deep link to a preselected option?<\/h3><\/dt>\n<dd><p>Yes. Append WooCommerce's usual attribute parameters, for example <code>?attribute_pa_colour=blue<\/code>, and matching dropdowns are preselected on load.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20javascript%3F\"><h3>Does it work without JavaScript?<\/h3><\/dt>\n<dd><p>The table renders in full, and each row shows a link to the product page instead of the basket button.<\/p><\/dd>\n<dt id=\"how%20do%20i%20change%20the%20number%20of%20variations%20sent%20to%20the%20browser%3F\"><h3>How do I change the number of variations sent to the browser?<\/h3><\/dt>\n<dd><p>Filter <code>rwvt_ajax_variation_threshold<\/code>. Products above the threshold use a single AJAX request per selection instead.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20hpos%20and%20block%20checkout%3F\"><h3>Is it compatible with HPOS and block checkout?<\/h3><\/dt>\n<dd><p>Yes, compatibility is declared for high performance order storage, cart and checkout blocks, and the product block editor.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>7.0.0<\/h4>\n\n<p>A full rewrite. Please review your existing shortcodes after updating.<\/p>\n\n<p><strong>Security<\/strong><\/p>\n\n<ul>\n<li>Both AJAX endpoints now require a nonce and reject unverified requests.<\/li>\n<li>All request input is sanitised and validated; product and variation IDs are checked for existence, status and parentage.<\/li>\n<li>All output is escaped. Fixes a stored XSS vector through the <code>thead<\/code> attribute.<\/li>\n<li>Responses use <code>wp_send_json_*()<\/code> instead of echoing raw text.<\/li>\n<li>Added an <code>ABSPATH<\/code> guard and directory index files.<\/li>\n<\/ul>\n\n<p><strong>Compatibility<\/strong><\/p>\n\n<ul>\n<li>Replaced every deprecated WooCommerce 2.x\/3.x call: <code>$product-&gt;id<\/code>, array access on attributes, and <code>get_matching_variation()<\/code> are gone.<\/li>\n<li>Products are loaded with <code>wc_get_product()<\/code> instead of <code>new WC_Product_Variable()<\/code>.<\/li>\n<li>Declared compatibility with HPOS, cart and checkout blocks, and the product block editor.<\/li>\n<li>Fixed PHP 8.1+ deprecation notices.<\/li>\n<li>The plugin now degrades to an admin notice when WooCommerce is inactive, instead of a fatal error.<\/li>\n<li>Added <code>Requires at least<\/code>, <code>Requires PHP<\/code>, <code>WC requires at least<\/code> and <code>WC tested up to<\/code> headers.<\/li>\n<\/ul>\n\n<p><strong>Fixes<\/strong><\/p>\n\n<ul>\n<li>Table headers and row cells now always line up, even when products have different attributes.<\/li>\n<li>Removed an invalid <code>&lt;div&gt;<\/code> between <code>&lt;table&gt;<\/code> and <code>&lt;thead&gt;<\/code>.<\/li>\n<li>The basket control is a real <code>&lt;button disabled&gt;<\/code>, so an unavailable combination can no longer be added.<\/li>\n<li>DOM IDs are unique per table instance, fixing collisions between products and repeated shortcodes.<\/li>\n<li>Add to basket links no longer depend on the current page's permalink, so they work on archives and shop pages.<\/li>\n<li>An empty or invalid <code>id<\/code> now shows \"No products found.\" instead of a blank row.<\/li>\n<li>Implemented <code>categories_exc<\/code>, which was previously accepted and ignored.<\/li>\n<li>Removed the unused preselected-value code and reimplemented it properly as query string deep linking.<\/li>\n<li>Each product is now loaded once per table instead of twice.<\/li>\n<\/ul>\n\n<p><strong>Front end<\/strong><\/p>\n\n<ul>\n<li>CSS and JS are enqueued only on pages that render a table, and no longer printed inline in <code>wp_head<\/code> on every request.<\/li>\n<li>Rewritten in dependency-free vanilla JavaScript, so it no longer breaks on themes that do not load jQuery.<\/li>\n<li>No inline event handlers, so the plugin works under a strict Content Security Policy.<\/li>\n<li>Assets carry a version string for cache busting.<\/li>\n<\/ul>\n\n<p><strong>New<\/strong><\/p>\n\n<ul>\n<li>\"Variations Table\" block with a live editor preview.<\/li>\n<li>Image, SKU, price, stock and quantity columns.<\/li>\n<li>AJAX add to basket with cart fragment refresh.<\/li>\n<li>\"Add selected to basket\" bulk action.<\/li>\n<li>Product selection by category, tag or attribute.<\/li>\n<li>Read-only table mode.<\/li>\n<li>Responsive card layout on small screens, and full keyboard and screen reader support.<\/li>\n<li>Surface-aware colours: neutral tones are alpha based so they sit correctly on any theme background, and the table measures the theme's actual background rather than trusting the operating system's dark mode preference. A light-only theme viewed on a machine set to dark mode keeps readable colours.<\/li>\n<li>Complete internationalisation with a <code>.pot<\/code> template.<\/li>\n<\/ul>\n\n<h4>6.0<\/h4>\n\n<ul>\n<li>Earlier releases.<\/li>\n<\/ul>","raw_excerpt":"Show WooCommerce variable products as a table, with price, stock, quantity and AJAX add to basket. Shortcode and block.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/82221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=82221"}],"author":[{"embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/devikas301"}],"wp:attachment":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=82221"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=82221"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=82221"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=82221"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=82221"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=82221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}