Construct a Tabbed Product Archive for Your WooCommerce Retailer

On this tutorial you’ll discover ways to make your WooCommerce retailer a bit extra fashionable by organizing the product archive with tabs. We’ll create tabs with a multi-column format, a multi-row carousel, and a grid format.

What We’re Going to Construct

Over the approaching steps we’ll create a WordPress plugin, inside which we will setup the required shortcodes. Must you want to take your WooCommerce product archive additional, you may convert it to a Gutenberg block, use it with Elementor as a widget, or combine it with Visible Composer.

This tabbed product archive might be good for displaying latest, featured, sale, and finest promoting merchandise, like this:

Our product archive, displaying tabs and carousel controls

So let’s get began!

1. Create a WordPress Plugin

In your WordPress web site underneath wp-content/plugins create a folder known as (maybe not probably the most unique identify) “woocommerce-products”, then inside that folder create a php file with the identical identify. Open the file and paste into it the code beneath (change the small print to suit your personal):

/* Plugin Identify: WooCommerce merchandise Plugin URI: Description: Higher product grouping presentation in your WooCommerce store Writer: Enovathemes Model: Writer URI: */ if ( ! outlined( ‘ABSPATH’ ) ) exit; // Exit if accessed immediately  

Right here we’ve performed nothing greater than outline our plugin identify and supplied some meta data.

Enqueue Scripts and Types

For our WooCommerce product archive plugin we’ll subsequent have to enqueue the required scripts and types, so add the next code snippet:

// Enqueue/register types and scripts perform plugin_scripts_styles() add_action( ‘wp_enqueue_scripts’, ‘plugin_scripts_styles’ );

First, we’ve added a fundamental CSS file to retailer our types. Subsequent we loaded the built-in imageLoaded plugin (which comes with the WordPress core), and to create the carousel we’ll use the wildly in style jQuery plugin owlCarousel. And, in fact, the primary js file. 

Be aware: Be sure that these information are added to your plugin folder within the related subfolders. 

For extra on WordPress plugin and shortcode creation, or additional data on utilizing owl.js, listed here are some advisable tutorials on Tuts+:

2. Create a Tab Shortcode

On this step we’ll create a tab shortcode. It can encompass two shortcodes really; the mother or father tab container, after which little one tab objects. For the first mother or father container add this code to the PHP file:

// Create tab shortcode perform et_tab($atts, $content material = null) add_shortcode(‘et_tab’, ‘et_tab’);

This shortcode doesn’t require any attributes, it simply wraps the tab objects inside it.

Talking of tab objects, subsequent add the code beneath to create the kid tab merchandise factor:

perform et_tab_item($atts, $content material = null) extract(shortcode_atts(array( ‘title’ => ”, ‘lively’ => ‘false’, ), $atts)); $output = ”; static $id_counter = 1; $class = array(); $class[] = ‘tab-item’; $class[] = ‘et-clearfix’; $class[] = ‘active-‘.esc_attr($lively); $output .= ‘
‘; if (isset($title) && !empty($title)) $output .= ‘
‘; $output .= ‘
‘; $output .= do_shortcode($content material); $output .= ‘
‘; $id_counter++; return $output; add_shortcode(‘et_tab_item’, ‘et_tab_item’);

This shortcode has two attributes; the title and the lively indicator, in case you need to make the focused tab lively on first load. 

When used within the WordPress editor the 2 shortcodes collectively will appear to be this:

[et_tab] [et_tab_item title=”Your title”] …content material right here[/et_tab_item][/et_tab]

At this level, for those who had been so as to add them to your front-page, then view the lead to your browser, you would see unstyled and non-functional HTML output. So let’s repair it. 

three. Add jQuery to Energy the Tabbed Content material

Go to the primary.js file and paste the code

(perform($){ “use strict”; $(‘.et-tab’).every(perform(){ var $this = $(this), tabs = $‘.tab-item’), tabsQ = tabs.size, tabsContent = $‘.tab-content’); tabs.wrapAll(‘
‘); tabsContent.wrapAll(‘
‘); var tabSet = $‘.tabset’); if(!tabs.hasClass(‘lively’)) tabs.first().addClass(‘lively’); tabs.every(perform() var $thiz = $(this); if ($thiz.hasClass(‘lively’)) $thiz.siblings() .removeClass(“lively”); tabsContent.conceal(zero).removeClass(‘lively’); tabsContent.eq($thiz.index()).present(zero).addClass(‘lively’); ); if(tabsQ >= 2) tabs.on(‘click on’, perform() var $self = $(this); if(!$self.hasClass(“lively”)) $self.addClass(“lively”); $self.siblings() .removeClass(“lively”); tabsContent.conceal(zero).removeClass(‘lively’); tabsContent.eq($self.index()).present(zero).addClass(‘lively’); ); }); })(jQuery);

I received’t describe all this code in nice element, however the logic right here powers the tab performance. If you’re not acquainted with JavaScript or jQuery, I extremely suggest this superb free course for learners:

Fashion the Tabs

Now the tabs work, however they nonetheless seem ugly, so let’s add some fundamental CSS:

.tabset margin-bottom: 24px; .tabset > * .tabset > .lively .tabset > :last-child margin-right: zero;  

four. Create WooCommerce Merchandise Shortcode

We’re making nice progress; our tabbed WooCommerce product archive is almost there! The time has come to create a shortcode for the merchandise. This may fetch the merchandise with a question, then from these outcomes create a sequence of arrays: featured, sale, and best-selling merchandise. It can then output the contents of these arrays to provide us our tabs of merchandise.

Add this code to the PHP file:

perform et_products($atts, $content material = null) { extract(shortcode_atts( array( ‘format’ => ‘grid’, // grid OR carousel ‘autoplay’ => ‘false’, // true OR false ‘columns’ => ‘1’, // 1 | 2 | three | four ‘rows’ => ‘1’, // 1 | 2 | three | four – carousel solely ‘amount’ => ’12’, ‘sort’ => ‘latest’, // latest | featured | sale | best_selling ), $atts) ); static $id_counter = 1; if (class_exists(‘Woocommerce’)) { $output = ”; international $put up; $query_options = array( ‘post_type’ => ‘product’, ‘post_status’ => ‘publish’, ‘meta_query’ => WC()->query->get_meta_query(), ‘tax_query’ => WC()->query->get_tax_query(), ‘ignore_sticky_posts’ => 1, ‘posts_per_page’ => absint($amount), ); if ($sort == “featured”) $query_options = array( ‘post_type’ => ‘product’, ‘post_status’ => ‘publish’, ‘meta_query’ => WC()->query->get_meta_query(), ‘ignore_sticky_posts’ => 1, ‘posts_per_page’ => absint($amount), ‘tax_query’ => array( array( ‘taxonomy’ => ‘product_visibility’, ‘area’ => ‘identify’, ‘phrases’ => ‘featured’, ‘operator’ => ‘IN’, ) ), ); if ($sort == “sale”) if ($sort == “best_selling”) $query_options = array( ‘post_type’ => ‘product’, ‘post_status’ => ‘publish’, ‘meta_query’ => WC()->query->get_meta_query(), ‘tax_query’ => WC()->query->get_tax_query(), ‘ignore_sticky_posts’ => 1, ‘posts_per_page’ => absint($amount), ‘orderby’ => ‘meta_value_num’, ‘meta_key’ => ‘total_sales’, ); $merchandise = new WP_Query($query_options); if($products->have_posts()) } else echo “Please set up/activate Woocommerce plugin”; } add_shortcode(‘et_products’, ‘et_products’);

The shortcode we’ve created right here has a number of attributes:

Structure – this will be grid or carousel Autoplay – true or false, that is a further choice for the carousel format Columns – right here you may specify what number of columns you need Rows – this is similar as columns, and solely applies to the carousel format Amount – the variety of objects to show Sort – right here you can specify latest merchandise, finest sellers, sale, or featured merchandise

A Be aware on Our Carousel Rows

When you could have a carousel, every product turns into a carousel merchandise–regular habits when you could have one row. Nevertheless, what occurs in order for you two, three, or 4 rows per carousel merchandise? 

On this case you would wish to wrap every of those potentialities inside a wrapper that might act because the carousel merchandise. And you’ve got the query: do you do that with JavaScript or with PHP? I want the second choice, as JS has some delay on execution. So for those who study the shortcode one can find the next:

$product_wrapper_start = ”; $product_wrapper_end = ”; if (($counter % 2 == 1 && $rows == 2) || ($counter % three == 1 && $rows == three) || ($counter % four == 1 && $rows == four)) if (($counter % 2 == zero && $rows == 2) || ($counter % three == zero && $rows == three) || ($counter % four == zero && $rows == four)) $product_wrapper_end = ‘‘;

Be aware the

$counter = 1;

proper after the


That is similar to a for loop, we want an increment to loop via our question and wrap every two, every three, and every 4 product objects contained in the carousel merchandise wrapper markup.

You’ll discover the %, which is the modulo operator. It offers the the rest of a division; zero when the quantity is strictly divisible by 2/three/four, and 1 when not. And with every loop we might want to increment the counter with:


This occurs proper after the code:

$output .= $product_wrapper_start; $output .= ‘
5. Add Owl Types 🦉

We’re nearly prepared, however first let’s add some owl carousel types and a few extra styling to our merchandise. 

Open the type.css file and paste the owl carousel types (it is best to discover these in your owlCarousel plugin obtain .zip file). And a few extra type for carousel navigation and our merchandise:

ul.merchandise list-style: none; margin: zero; padding: zero; ul.merchandise.grid show: grid; grid-row-gap: 24px; grid-column-gap: 24px; ul.merchandise.grid[data-columns=”2″]grid-template-columns: repeat(2, 2fr); ul.merchandise.grid[data-columns=”3″] ul.merchandise.grid[data-columns=”4″] ul li show: block; padding: zero; margin: zero .product place: relative; text-align: heart; .woocommerce-loop-product__title .product a show: block; text-decoration: none; border-bottom: none !essential; .product .onsale .et-tab .owl-nav .et-tab .owl-nav > * show: inline-block; vertical-align: center; width: 40px; top: 40px; text-align: heart; line-height: 40px; background: #f5f5f5 !essential; .et-tab .owl-nav > :last-child .et-tab .owl-nav > *:hover

However wait a minute, we haven’t but known as the carousel plugin, so let’s now go to the primary.js file, and proper after the tab code add the next:

// Initialize carousel for the primary load $(‘.merchandise.carousel’).every(perform(){ var $this = $(this); $this.imagesLoaded(perform(){ $this.owlCarousel(); }); });

Right here we use two plugins on the identical time: first we be sure that that our photos are loaded to keep away from any sort of content material overlapping, after which we name the plugin for our carousel merchandise format.

6. Repair Carousel Glitch

One factor stays to be performed: for those who now go to the tabs and state that you really want a carousel primarily based format you will note it engaged on the lively tab for the primary web page load, however for those who begin switching from tab to tab your carousel format will break. On the tab change occasion our carousel must up to date. So on the very starting of the file add the perform:

perform refreshCarousel(tab)‘.merchandise.carousel’).every(perform() jQuery(this).set off(‘refresh.owl.carousel’); );

This perform refreshes the carousel format every time the tab is modified. And now inside tab perform proper after the code:


name the perform:


Now, clear the browser cache and add the next shortcode content material to your web page:

[et_tab][et_tab_item title=”recent”][et_products layout=”grid” autoplay=”false” columns=”3″ rows=”1″ quantity=”6″ type=”recent” /][/et_tab_item][et_tab_item title=”featured”][et_products layout=”grid” autoplay=”false” columns=”3″ rows=”1″ quantity=”6″ type=”featured” /][/et_tab_item][et_tab_item title=”sale”][et_products layout=”grid” autoplay=”false” columns=”3″ rows=”1″ quantity=”6″ type=”sale” /][/et_tab_item][et_tab_item title=”best selling”][et_products layout=”grid” autoplay=”false” columns=”3″ rows=”1″ quantity=”6″ type=”best_selling” /][/et_tab_item][/et_tab]

[et_tab][et_tab_item title=”recent”][et_products layout=”grid” autoplay=”false” columns=”4″ rows=”1″ quantity=”8″ type=”recent” /][/et_tab_item][et_tab_item title=”featured”][et_products layout=”grid” autoplay=”false” columns=”4″ rows=”1″ quantity=”8″ type=”featured” /][/et_tab_item][et_tab_item title=”sale”][et_products layout=”grid” autoplay=”false” columns=”4″ rows=”1″ quantity=”8″ type=”sale” /][/et_tab_item][et_tab_item title=”best selling”][et_products layout=”grid” autoplay=”false” columns=”4″ rows=”1″ quantity=”8″ type=”best_selling” /][/et_tab_item][/et_tab]

[et_tab][et_tab_item title=”recent”][et_products layout=”carousel” autoplay=”false” columns=”3″ rows=”1″ quantity=”12″ type=”recent” /][/et_tab_item][et_tab_item title=”featured”][et_products layout=”carousel” autoplay=”false” columns=”3″ rows=”1″ quantity=”12″ type=”featured” /][/et_tab_item][et_tab_item title=”sale”][et_products layout=”carousel” autoplay=”false” columns=”3″ rows=”1″ quantity=”12″ type=”sale” /][/et_tab_item][et_tab_item title=”best selling”][et_products layout=”carousel” autoplay=”false” columns=”3″ rows=”1″ quantity=”12″ type=”best_selling” /][/et_tab_item][/et_tab]

[et_tab][et_tab_item title=”recent”][et_products layout=”carousel” autoplay=”false” columns=”4″ rows=”2″ quantity=”12″ type=”recent” /][/et_tab_item][et_tab_item title=”featured”][et_products layout=”carousel” autoplay=”false” columns=”2″ rows=”2″ quantity=”12″ type=”featured” /][/et_tab_item][et_tab_item title=”sale”][et_products layout=”carousel” autoplay=”false” columns=”3″ rows=”2″ quantity=”12″ type=”sale” /][/et_tab_item][et_tab_item title=”best selling”][et_products layout=”carousel” autoplay=”false” columns=”3″ rows=”1″ quantity=”12″ type=”best_selling” /][/et_tab_item][/et_tab]

On this case I’m utilizing the default WordPress theme with Gutenberg editor (therefore the Gutenberg feedback ), if you could have the traditional editor, simply copy the shortcodes.

And now if in case you have performed the whole lot proper you will note an exquisite format like this!


You might be free to make use of and modify this plugin in your tasks, each industrial and non-commercial. Go to the repo on Github to seize the supply code in full. I hope you discover it helpful, thanks for studying!

Greatest WooCommerce Themes on Envato Market


19+ Greatest WooCommerce Themes: To Make a Higher On-line Retailer

Brenda Barron


18+ Greatest eCommerce WordPress Themes for 2019

Brenda Barron

Leave a Reply