Last active
April 14, 2024 18:09
-
-
Save filipecsweb/32467a20f2eeb39b0cbf to your computer and use it in GitHub Desktop.
WooCommerce shortcode to output product categories randomly
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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' ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@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.