Hi @soggybiscuit
Members doesn’t fully protect a product on the front-end as it protects post content. WooCommerce templates show post content (which will be protected), but it shows a lot more, such as price, short description, etc., which is usually post meta.
That said, here’s a snippet that will hide a product from the loop and redirect it when the user doesn’t have a required role:
add_filter( 'woocommerce_product_is_visible', 'members_maybe_remove_product_from_query', 95, 2 );
/**
* Removes a product from the query depending on if the user has the correct permission.
*
* @param boolean $is_visible Whether the product is visible
* @param int $product_id Product ID
*
* @return boolean
*/
function members_maybe_remove_product_from_query( $is_visible, $product_id ) {
return members_can_current_user_view_post( $product_id );
}
add_action( 'template_redirect', 'members_woocommerce_product_redirect' );
/**
* Redirects users to the shop page when they cannot view the current product.
*
* @return void
*/
function members_woocommerce_product_redirect() {
if ( class_exists( 'WooCommerce' ) && is_singular( 'product' ) ) {
$post_id = get_the_ID();
if ( ! members_can_current_user_view_post( $post_id ) ) {
wp_redirect( apply_filters( 'members_woocommerce_product_redirect', get_permalink( wc_get_page_id( 'shop' ) ) ) );
exit;
}
}
}
Hopefully, that helps.