The situations this solves
- Wholesale. Trade customers buy from a range and at prices retail visitors must never see.
- Client-specific products. An agency or printer sells items that exist for one client only.
- Members-only collections. A range for logged-in members, invisible to everyone else.
- Soft launches. A new range visible to staff and a test group before it goes public.
WooCommerce has no visibility model beyond "published" and "private", and "private" hides the product from everyone but administrators. Dragon Product Visibility adds a proper one: a product hidden from you is gone from the shop, search, category archives and its direct URL, not merely unlisted.
Step 1: set up roles for the audiences
Visibility by role needs roles that mean something. WooCommerce gives you Customer and Shop Manager; add a Wholesale role (any role-editor plugin, or a one-line add_role() in a small plugin) and assign it to trade accounts on approval. For members, most membership plugins create a role; if yours does not, add one.
Per-customer visibility does not need roles at all.
Step 2: restrict whole categories or tags
For ranges, work at the category level. Open Products, then Visibility Rules, pick a category or tag, and choose:
- Show only to the selected roles: only those roles can see it, and it is also hidden from logged-out visitors. This is the wholesale and members-only setting.
- Hide from the selected roles: everyone sees it except the roles you name. Useful for retail-only bundles that trade customers should not buy.
A rule on a category covers its sub-categories automatically. Managing rules needs the Shop Manager capability, so store staff can do this without being administrators.
Step 3: restrict individual products
For the exceptions, edit the product and use the Visibility box: choose specific customers, roles, or both, who may see it. A rule on a product always takes precedence over a category or tag rule, so a single retail product inside a wholesale category, or one client's product inside a shared category, is handled without restructuring the catalogue.
Client-specific products are the per-customer case: pick the client's account and nobody else, logged in or not, can find the product.
Step 4: test as the visitor, not as yourself
Administrators see everything, which makes testing in your own session useless. Check each rule three ways:
- Logged out, in a private window: hidden products must be absent from the shop, search and archives, and their direct URL must not resolve.
- As a customer with the wrong role: same result.
- As a customer with the right role: visible, purchasable, and present in search.
Check the sitemap and any product feeds too. Hidden products should not be advertised in places the rules do not cover; if a feed plugin reads products directly, exclude the restricted categories in that plugin as well.
Pricing and the rest of the wholesale stack
Visibility is one half of wholesale. Trade pricing, minimum quantities and tax treatment are the other half and belong to a pricing plugin or WooCommerce's own role-based options. Keep the two concerns separate: visibility decides who can see and buy; pricing decides what they pay. The rules here stay simple as a result.
Related reading
Wholesale accounts are worth protecting: enforcing two-factor authentication covers extending 2FA to customer accounts. And when a trade order lands, WooCommerce order webhooks gets it to the warehouse.
Checklist
- Roles created and assigned for each audience
- Category rules set for each range
- Per-product exceptions set where a category rule is wrong for one item
- Tested logged out, with the wrong role, and with the right role
- Feeds and sitemap checked for leaks