Skip to content

Instantly share code, notes, and snippets.

@filipecsweb
Last active April 14, 2024 18:09
Show Gist options
  • Save filipecsweb/32467a20f2eeb39b0cbf to your computer and use it in GitHub Desktop.
Save filipecsweb/32467a20f2eeb39b0cbf to your computer and use it in GitHub Desktop.
WooCommerce shortcode to output product categories randomly
<?php
/**
* Create the new WooCommerce shortcode [random_product_categories] to output product categories randomly.
* Based on [product_categories] (/plugins/woocommerce/includes/class-wc-shortcodes.php).
*
* This new shortcode accepts all attributes used by [product_categories], except 'orderby' and 'order', of course.
* See more at @link https://woocommerce.com/document/woocommerce-shortcodes/.
*
* @param array $atts User defined attributes in shortcode tag.
*/
function random_product_categories_shortcode( $atts ) {
global $woocommerce_loop;
$atts = shortcode_atts( [
'number' => null,
'columns' => '4',
'hide_empty' => 1,
'parent' => '',
'ids' => '',
'hide_title' => 0,
], $atts );
if ( isset( $atts['ids'] ) ) {
$ids = explode( ',', $atts['ids'] );
$ids = array_map( 'trim', $ids );
} else {
$ids = [];
}
$hide_empty = (bool) $atts['hide_empty'];
// Get terms and workaround WP bug with parents/pad counts.
$args = [
'hide_empty' => $hide_empty,
'include' => $ids,
'pad_counts' => true,
'child_of' => $atts['parent']
];
$product_categories = get_terms( 'product_cat', $args );
// Shuffle the array of objects `$product_categories`.
shuffle( $product_categories );
if ( '' !== $atts['parent'] ) {
$product_categories = wp_list_filter( $product_categories, [ 'parent' => $atts['parent'] ] );
}
if ( $hide_empty ) {
foreach ( $product_categories as $key => $category ) {
if ( $category->count == 0 ) {
unset( $product_categories[ $key ] );
}
}
}
if ( $atts['number'] ) {
$product_categories = array_slice( $product_categories, 0, $atts['number'] );
}
$columns = absint( $atts['columns'] );
$woocommerce_loop['columns'] = $columns;
ob_start();
// Reset loop/columns globals when starting a new loop.
$woocommerce_loop['loop'] = $woocommerce_loop['column'] = '';
if ( $product_categories ) {
woocommerce_product_loop_start();
if ( ! empty( $atts['hide_title'] ) ) {
remove_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_title' );
}
foreach ( $product_categories as $category ) {
wc_get_template( 'content-product-cat.php', [
'category' => $category
] );
}
if ( ! empty( $atts['hide_title'] ) ) {
add_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_title' );
}
woocommerce_product_loop_end();
}
wc_reset_loop();
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
}
add_shortcode( 'random_product_categories', 'random_product_categories_shortcode' );
@filipecsweb
Copy link
Author

@Hebhansen It seems the cache comes from Cloudflare. You'd have to correctly setup your cache settings under the Cloudflare platform and/or under any WP plugin that integrates your website with Cloudflare.

About the overflow I couldn't reproduce what you described.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment