I'm trying to create a custom shortcode that will allow me to display products with stock levels equal to, or higher than a set numerical value.
So ideally I could place a shortcode along the lines of: [product_category category="secret-wars" stock="3"]
Which would display products in the secret wars category with 3 or more in stock.
Update #1:
So I found some code by LoicTheAztec which I'm hoping I can alter to my requirements here Display WooCommerce products with a shortcode using a custom meta_query
I've tried making some changes but can't get the code to work, here's the code I currently have:
if( ! function_exists('minimum_stock') ) {
// Add Shortcode
function minimum_stock( $atts ) {
global $woocommerce_loop;
// Attributes
$atts = shortcode_atts(
array(
'columns' => '5',
'limit' => '40',
'stock' => '3',
),
$atts, 'minimum_stock'
);
$woocommerce_loop['columns'] = $atts['columns'];
// The WP_Query
$products = new WP_Query( array (
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => $atts['limit'],
'meta_query' => array(
'stock' => array(
'key' =>'_stock',
'type' => 'numeric',
'value' => ''
'compare' => '>=',
),
)
));
ob_start();
if ( $products->have_posts() ) { ?>
<?php woocommerce_product_loop_start(); ?>
<?php while ( $products->have_posts() ) : $products->the_post(); ?>
<?php wc_get_template_part( 'content', 'product' ); ?>
<?php endwhile; // end of the loop. ?>
<?php woocommerce_product_loop_end(); ?>
<?php
} else {
do_action( "woocommerce_shortcode_products_loop_no_results", $atts );
echo "<p>There are no results.</p>"
}
woocommerce_reset_loop();
wp_reset_postdata();
return '<div class="woocommerce columns-' . $atts['columns'] . '">' . ob_get_clean() . '</div>';
}
add_shortcode( 'stock', 'minimum_stock' );
}
I've also tried coming at it a slightly different way:
// Add Minimum Stock Shortcode
function minimum_stock_func ( $atts , $args ) {
$a = shortcode_atts( array(
'stock' => $args = array(
'meta_key' => '_stock',
'type' => 'numeric',
'meta_value' => '',
'compare' => '>='
), $atts ) );
return "stock = {$a['stock']}";
}
add_shortcode( 'stock', 'minimum_stock_func' );
If anyone has any idea what I'm doing wrong your help would be very much appreciated!
Update #2: Okay, so I think I'm getting there... I've managed to get minimum stock of 3 to show using this code:
// Minimum Stock Shortcode
add_shortcode( 'minimum_stock', 'minimum_stock_shortcode' );
function minimum_stock_shortcode( $atts ) {
global $product, $woocommerce, $woocommerce_loop;
// Attributes
$atts = shortcode_atts(
array(
'limit' => '40',
'columns' => '5',
'orderby' => 'title',
'order' => 'asc',
'category' => '',
'cat_operator' => 'IN',
),
$atts, 'minimum_stock'
);
$woocommerce_loop['columns'] = $atts['columns'];
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => $atts['limit'],
'orderby' => $atts['orderby'],
'order' => $atts['order'],
'meta_query' => array(
array(
'key' => '_stock',
'value' => 3,
'compare' => '>='
)
),
'tax_query' => array( array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $atts['category'],
)
)
);
$loop = new WP_Query($args);
ob_start();
woocommerce_product_loop_start();
while ( $loop->have_posts() ) : $loop->the_post();
wc_get_template_part( 'content', 'product' );
endwhile;
woocommerce_product_loop_end();
woocommerce_reset_loop();
wp_reset_postdata();
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
}
This will display products within a category that has minimum stock amount of 3, with this shortcode:
[minimum_stock category="comic-book-publishers"]
Does anyone know how I can get it to work if the shortcode were like so:
[products minimum_stock="2" category="comic-book-publishers"]
I'd like to be able to use the Woocommerce [products] shortcode as with it I'll also get pagination and the store 'orderby' dropdown menu will appear above the products. I'd also like to be able to specify the minimum_stock amount with [minimum_stock="2"] rather than it be set in the shortcode stock.
Any help would be very much appreciated.
Kind regards, JP