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.