Worth clearing up first: WooCommerce doesn’t ship a [shop] shortcode. The Shop page isn’t built from a shortcode at all, it’s an automatically generated product archive using your theme’s archive-product.php template. What people actually mean by “shop page shortcode” is replicating that same product grid somewhere else, a landing page, a custom page, a section of the homepage, and that’s done with [products].
The Code
To recreate the default shop grid (all products, standard sort order) on any page:
[products limit="-1" columns="4" paginate="true"]
limit="-1" shows every published product instead of a fixed number, and paginate="true" breaks that into pages instead of rendering everything at once, which matters once your catalog grows past a page or two.
If you specifically want the Shop page itself to look or behave differently, that’s a separate problem from shortcodes entirely, and here’s the code for that instead. This snippet changes how many products per row the actual Shop page displays, since that’s controlled by a filter, not a shortcode:
add_filter( 'loop_shop_columns', 'fixelar_shop_columns' );
function fixelar_shop_columns() {
return 3;
}
Where to Put This Code
The [products] shortcode goes into the content of whichever page you’re building, not into functions.php.
The loop_shop_columns filter is PHP, so it belongs in your child theme’s functions.php or a snippets plugin like Code Snippets. This one only affects the real Shop page and category archives, it has no effect on a [products] shortcode elsewhere, since columns on the shortcode itself already controls that independently.
Keep in mind loop_shop_columns only works with themes that still respect it. Many modern block themes have moved shop grid columns into the Product Collection block’s own settings, in which case this filter won’t do anything, since there’s no classic loop for it to hook into.
Why There’s No Real Shop Shortcode
The Shop page is fundamentally different from Cart, Checkout, and My Account. Those three are regular WordPress pages with a shortcode placed in their content. The Shop page is a special archive, generated from your product post type, using whatever archive-product.php template your active theme provides (or WooCommerce’s own default if the theme doesn’t override it).
That’s why you can’t “add the shop shortcode to a new page” the way you can with cart or checkout. There’s no shortcode to move. If you want shop-like functionality somewhere else, [products] with no filtering attributes is the closest equivalent, since it pulls every product using the same underlying query logic, just rendered as a shortcode instead of through the archive template.
Real Use Cases
A “Shop” section on the homepage instead of a separate page. [products limit="8" columns="4"] on the homepage gives visitors a preview grid without sending them to a full archive page.
Replicating the shop grid on a page outside the normal WooCommerce flow. If a page builder or custom template can’t render the actual Shop archive correctly, [products limit="-1" paginate="true"] becomes the fallback that still shows the full catalog.
Changing how many columns the real Shop page displays. This is where loop_shop_columns comes in specifically, since it’s the setting classic themes use to build the grid.
A store running two different product displays. Some stores use the actual Shop page for the full catalog and a [products] shortcode elsewhere for a curated subset, like new arrivals or a themed collection, without needing two separate plugins.
Common Issues
Someone is looking for “the shop shortcode” and can’t find it in a shortcode list. That’s expected. It doesn’t exist. If a plugin or tutorial claims to offer one, it’s likely either wrapping [products] under a different name or referring to editing the actual Shop page template.
loop_shop_columns isn’t changing anything. Confirm the theme is a classic (non-block) theme still using the traditional shop loop. Block themes using the Product Collection block manage columns through block settings instead, and this filter has no effect there.
[products limit=”-1″] loads slowly on a large catalog. Removing the limit pulls every product in one query. Pairing it with paginate="true" avoids rendering hundreds of products on a single page load, which is both a performance issue and a poor experience for the visitor scrolling through it.
The replicated grid on a custom page looks different from the real Shop page. The Shop page inherits your theme’s specific archive template styling. A [products] shortcode dropped into a regular page uses WooCommerce’s shortcode-specific markup instead, which can look slightly different unless your theme’s CSS accounts for both.
If your store needs the Shop page itself restructured, faster loading, or a custom layout that goes beyond what filters and shortcodes can do, that’s exactly the kind of work Fixelar handles as part of our WooCommerce custom development services. We work with the actual archive template, not just shortcode workarounds.