I have the following code that set a global download limit and expiry, for all WooCommerce downloadable products:
//FOR VARIATION DOWNLOADABLE PRODUCTS
// set 3 downloads for all variation downloadable products
add_filter('woocommerce_product_variation_get_download_limit', function ($val, $obj) {
return $val <= 0 ? 3 : $val;
}, 30, 2);
// set 3 days expiration for all variation downloadable products
add_filter('woocommerce_product_variation_get_download_expiry', function ($val, $obj) {
return $val <= 0 ? 3 : $val;
}, 30, 2);
//FOR SIMPLE DOWNLOADABLE PRODUCTS
// set 3 downloads for all simple downloadable products
add_filter('woocommerce_product_get_download_limit', function ($val, $obj) {
return $val <= 0 ? 3 : $val;
}, 30, 2);
// set 3 days expiration for all simple downloadable products
add_filter('woocommerce_product_get_download_expiry', function ($val, $obj) {
return $val <= 0 ? 3 : $val;
}, 30, 2);
MY PROBLEM:
I don’t want to set the download limit and expiry globally (for all downloadable products), but only for specific product categories instead.
Any help is appreciated.
1 Answer
You can use WordPress conditional function has_term()
to target specific product categories this way:
// Set a different Download limit for specific downloadable products
add_filter('woocommerce_product_get_download_limit', 'product_get_download_limit_filter_callback', 30, 2 ); // Simple
add_filter('woocommerce_product_variation_get_download_limit', 'product_get_download_limit_filter_callback', 30, 2 ); // Variation
function product_get_download_limit_filter_callback( $value, $product ) {
$categories = array( 'action', 'adventure' ); // <== HERE define your product categories (terms ids, slugs or names)
if( has_term( $categories, 'product_cat', $product->get_id() ) && $value <= 0 ) {
$value = 3;
}
return $value;
}
// Set a different Download expiration for specific downloadable products
add_filter('woocommerce_product_get_download_expiry', 'product_get_download_expiry_filter_callback', 30, 2 ); // Simple
add_filter('woocommerce_product_variation_get_download_expiry', 'product_get_download_expiry_filter_callback', 30, 2 ); // Variation
function product_get_download_expiry_filter_callback( $value, $product ) {
$categories = array( 'action', 'adventure' ); // <== HERE define your product categories (terms ids, slugs or names)
if( has_term( $categories, 'product_cat', $product->get_id() ) && $value <= 0 ) {
$value = 3;
}
return $value;
}
Code goes in functions.php file of your active child theme (or active theme). It should work.