Skip to content
Advertisement

Woocommerce conditionally load a custom product template

I am creating a custom theme and I have copied the file content-product.php to my theme folder. There I have made changes to the html structure and css. I can load of list of products and see the changes working via the short code [products].

However elsewhere on the site I want to display another list of products but from a different category. I would use the shortcode [products category="special category"] These products should be displayed using a different template.

My question is: Where can I inspect the shortcode query? and how can I conditionally load a different template depending on which products are being displayed?

In my themes functions.php file I have started to extend the [products] shortcode like this:

function my_wc_shortcode_product_query_args($args, $atts){

    if ( isset( $args['category'] ) && $args['category'] == "Daoine Óga") {
        var_dump($args);
    // Tell Woocommerce to load my custom template instead of the my-theme/woocommerce/content-product.php
    }
    return $args;

}

But I’m not sure how I can return or get woocommerce to display my custom template at this point.

Advertisement

Answer

The woocommerce file that creates the [products] shortcode can be found at plugins/woocommerce/includes/shortcodes/class-wc-shortcode-products.php

Make a folder in plugins folder called custom-product-templates and make a copy of the woocommerce file class-wc-shortcode-products.php to that folder.

Add the plugin comments to the top of that file:

/*
Plugin name: Custom Product Template
Plugin URI: https://anirishwebdesigner.com
Description: Display custom product templates in woocommerce loop 
Author: Linda Keating
Author URI: http://anirishwebdesigner.com
Version: 1.0
*/

Navigate to localhost/wp-admin in browser and to the plugins and activate newly created plugin

I can now safely edit that file so that the shortcode behaviour loads the template I want based on certain criteria.

First extend the class so that it accepts a template attribute

In the parse attributes function add

'template' => '',

Then search for wc_get_template_part('content', 'product'); and modify the code here to load different templates in an if..else statement. Something like:

`if($this->attributes['template'] == 'Daoine Óga') {
    wc_get_template_part( 'content', 'childrenproduct' );
     } else {
    wc_get_template_part( 'content', 'product' );
 }`

If there are simpler / better solutions please let me know.

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement