Try to think different…
What you can do is to hide the “Publish” Metabox content on admin new product, if the limit of 30 “simple” products has been reached.
For that, you need first to check how many simple products are published in a conditional function (here the limit is set to 30 simple products):
// Conditional function: Check if new simple product is allowed (the limit set to 30)
function is_new_simple_product_allowed( $limit = 30 ) {
// Get all published simple product IDs
$product_ids = get_posts(['post_type' => 'product', 'post_status' => 'publish', 'numberposts' => -1, 'fields' => 'ids']);
return count($product_ids) < $limit;
}
Then we use that conditional function inside both following functions:
1). Display an error notice on admin new product page:
add_action( 'admin_notices', 'sample_admin_notice__success' );
function sample_admin_notice__success() {
global $pagenow, $typenow;
if ( $pagenow === 'post-new.php' && $typenow === 'product' && ! is_new_simple_product_allowed() ) {
printf( '', 'error',
esc_html__( 'You are not allowed to add a new simple product as the allowed limit for simple products has already been reached.', 'woocommerce' ) );
}
}
Seenshot – Displayed error notice when new simple product is not allowed
2). Show or hide the “Publish” Metabox content on admin new product only when the selected product type is “simple” using JavaScript:
add_filter( 'admin_footer', 'new_product_show_or_hide_publish_metabox_js');
function new_product_show_or_hide_publish_metabox_js() {
global $pagenow, $typenow;
if ( $pagenow === 'post-new.php' && $typenow === 'product' && ! is_new_simple_product_allowed() ) :
?>
‘ ).insertAfter(‘#submitpost’);
} else {
$(‘#submitpost’).show();
$(‘#replace-buttons’).remove();
}
}
var productType = $(‘#product-type’).val();
show_hide_publish_metabox_content( productType );
$(‘#product-type’).on(‘change’, function(){
productType = $(this).val();
show_hide_publish_metabox_content( productType );
});
});
endif;
}
Seenshot – When new simple product is not allowed (and the selected product type is simple), you will get:
Seenshot – If you change the product type, for example, to “Variable product”, you will get back the default Metabox content:
To target a specific user role you could use wc_current_user_has_role('shop_manager')
WooCommerce conditional function in the first function (here for “shop Manager” users).