30% off Pro plugins with LAUNCH30 See plugins
Dragon Product Visibility for WooCommerce box
All plugins

Dragon Product Visibility for WooCommerce

Restrict WooCommerce product visibility by specific customers or user roles. Simple per-customer restrictions without complex membership plugins.

Show or hide whole product categories and tags by user role — wholesale-only ranges, members-only collections, hidden clearance lines — with per-product rules that always take precedence.

Features

What Dragon Product Visibility for WooCommerce does

Products can be made exclusive to certain users without complex membership plugins.

Per-Customer Restrictions

Make products visible only to specific customers

Role-Based Access

Restrict products by WordPress user role

Whitelist Mode

Only selected users/roles can see the product

Blacklist Mode

Hide products from specific users/roles (everyone else can see)

Complete Hiding

Restricted products are hidden from shop, search, and direct URL access

Cart Protection

Prevents adding restricted products to cart

Lightweight

No bloat, just focused functionality

B2B Stores

Show wholesale products only to approved business customers (whitelist)

VIP Products

Create exclusive items for your best customers (whitelist)

Competitor Blocking

Hide products from known competitor accounts (blacklist)

Custom Pricing

Different product catalogs for different customer tiers

Pre-release Access

Let select customers preview new products (whitelist)

Regional Restrictions

Hide products from certain user groups (blacklist)

Guides

Put Dragon Product Visibility for WooCommerce to work

Step-by-step guides from the team that builds it. All guides

Requirements

  • · WordPress 6.2 or newer
  • · PHP 8.0 or newer
  • · WordPress 6.0+ · PHP 8.0+

Changelog

v1.0.9

An interrupted save can no longer make a product visible to a customer you blocked, and a failed save is reported instead of shown as saved. ## What's fixed in 1.0.9 - **A failed save can no longer make a product visible to someone you blocked.** The customer list was deleted before the new one was written, with no check on either step, so a database error part-way through could leave a blocked customer able to see the product while the screen still said "saved". The save now applies its changes in the order that tightens access first, so an interrupted save never leaves the product more visible than it was. Where the database supports transactions the save is reverted on failure; where it does not, each write that landed is undone individually and confirmed. If even that cannot be completed, the notice tells you what is actually stored instead of claiming your previous rules survived. - **The AJAX save checks permission for the specific product.** It previously only required the general "edit products" capability; it now also requires that you can edit the product whose rules are being changed. - **Activation only records the database version once the table really exists.** Previously the version was stored regardless, so a table that failed to create was never retried. The table is now confirmed first, and a missing table (including one dropped later) is recreated on a later admin page load, checked at most once every five minutes. - **The table definition can now be upgraded in place.** It is written in the form WordPress's dbDelta() can compare against the existing table, so future schema changes will apply on update rather than being skipped. No change is made to the table itself in this release. - **Category/tag rules report save failures.** On the Visibility Rules screen, adding or deleting a rule whose save did not land was still shown as a success. Both now show an error and leave your existing rules unchanged. - **A failed read can no longer save as a success.** If the list of a product's existing customer rules could not be read, the save treated it as "no rules" and committed, leaving the stored rules untouched while reporting success. The read is now checked and the save is refused instead. No settings or data changes otherwise.

View full changelog →