Make customers read and accept your terms before certain products go in the basket. Pick the categories that need it, write the terms once (or per category, or per product), and a popup handles the rest on your shop, category and product pages.
How it works
When a customer clicks Add to basket on a product in one of your gated categories, the click is paused and a popup opens with your terms. The accept button stays disabled until they tick the checkbox. Once they accept, the product goes into the basket as normal and the popup won’t appear again for that product for 30 minutes.
Products outside your gated categories aren’t touched. There’s also a check on the server: if something tries to add a gated product without going through the popup, WooCommerce shows a notice asking the customer to accept the terms first, and the product isn’t added.
Good fits for it:
- Delivery conditions — pallet delivery, kerbside only, access requirements, redelivery charges.
- Made-to-order or cut-to-size items — no returns once production starts.
- Trade or professional products — installation by a qualified fitter.
- Hazardous goods — handling and storage acknowledgements.
- Age-restricted items — a declaration that the buyer is 18 or over (see the note below).
The popup records that a customer ticked a box. It doesn’t check ID or prove anyone’s age. If the law requires you to verify age for what you sell, you need a proper age-verification service as well.
Install
Requirements
| Minimum | Tested up to | |
|---|---|---|
| WordPress | 5.8 | 6.7 |
| PHP | 7.4 | — |
| WooCommerce | 6.0 | 9.4 |
WooCommerce must be installed and active. The plugin is compatible with WooCommerce High-Performance Order Storage (HPOS).
Install the plugin
- Download the zip from My Account → Downloads on baltic.digital. The plugin is free.
- In WordPress go to Plugins → Add New → Upload Plugin, choose the zip, click Install Now and then Activate. It appears in your plugin list as Product Terms Gate.
- Open WooCommerce → Terms Gate. Until you’ve picked at least one category you’ll see a reminder notice in the admin with a link to the settings.
Quick start
- Under Enable for Categories, pick the product categories that need terms. Each one shows how many products it holds, so you can see what you’re gating.
- Leave Terms Content Location on Global (same for all) for now.
- Write your terms in the editor under Terms Content, or click one of the template buttons to start from a draft.
- Click Save Settings, then open a gated product on your shop and click Add to basket to check the popup appears.
Choosing categories
Gating works by product category. A product needs terms if it’s in any of the categories you’ve selected, so a product in both “Flooring” and “Sale” is gated if either is selected.
Variable products are gated at the parent product. Accepting the terms covers every variation of that product.
If you only need terms on a handful of products, the simplest route is a dedicated category (for example “Pallet delivery”) that you add those products to. Categories can be hidden from your shop menus if you don’t want customers to see them.
Where the terms come from
Terms Content Location decides which text appears in the popup.
- Global (same for all)
- One set of terms, written on the settings page, used for every gated product. Start here.
- Per Category
- Each category has its own terms. Edit them under Products → Categories: open a category and fill in the Terms & Conditions field. If a product sits in more than one gated category, the first one with terms filled in is used.
- Per Product
- Each product has its own terms, set in the Product Terms & Conditions box on the product edit screen. Tick Override terms for this product to show the editor.
- Hierarchical (Product → Category → Global)
- Uses the product’s own terms if it has them, otherwise its category’s terms, otherwise the global terms. This is the most flexible option: write general terms once and override only where you need to.
If nothing is filled in at any level, the popup shows a short default message asking the customer to agree to your terms and conditions. It’s better to write your own.
Writing the terms
The terms editor is the normal WordPress editor, so you can use headings, bold text, lists and links (to your full terms page, for example).
Templates
Four buttons above the editor drop in a starting draft. Each one replaces what’s already in the editor, so use them before you start writing, not after.
- Standard Terms — a general acknowledgement list.
- Hazardous Materials — handling, storage and safety points.
- Age Restriction — an 18+ declaration.
- Custom Template — an empty heading and paragraph to fill in.
The templates are a starting point, not legal advice. Edit them to match what you actually sell and how you sell it.
Keep it short
The popup is a speed bump on the way to the basket. A few clear points the customer will actually read work better than a full legal page. Put the essentials in the popup and link to your full terms for the rest.
Customising the popup
Under Display Settings you can change every piece of text in the popup:
| Setting | Default |
|---|---|
| Popup Heading | Terms & Conditions |
| Checkbox Text | I have read and accept the terms & conditions |
| Accept Button Text | I accept the terms |
| Cancel Button Text | Cancel |
Click Preview Popup to see how it looks before you save.
Customers can close the popup with the cancel button, the × in the corner, by clicking outside it, or with the Escape key. Nothing is added to the basket if they close it. On phones the popup slides up from the bottom of the screen.
Styling
The popup uses its own neutral styles so it works on most themes. To match your brand, add CSS in Appearance → Customize → Additional CSS (or your theme or builder’s custom CSS). The main selectors are:
.bdptg-popup-content /* the white box */
#bdptg-popup-title /* heading */
.bdptg-terms-content /* your terms text */
.bdptg-accept /* accept button */
.bdptg-cancel /* cancel button */
What the customer sees
- They click Add to basket on a gated product — from the shop page, a category page or the product page.
- The popup opens with your terms. The accept button is greyed out.
- They tick the checkbox, which enables the accept button, and click it.
- The popup closes and the product is added to the basket the same way it normally would be (AJAX on shop pages, normal form submit on product pages).
Acceptance is per product and lasts 30 minutes. If they add the same product again within that time, there’s no popup. A different gated product shows the popup again.
The popup loads on the shop page, product category pages and single product pages. If you have Add to basket buttons elsewhere — the homepage, search results, or a custom product grid built in a page builder — customers clicking a gated product there will get a WooCommerce notice asking them to accept the terms, rather than the popup. Link those products through to their product page, or keep gated products out of those grids.
Import and export
Under Import / Export you can download your settings as a JSON file and load them on another site. This is handy for copying a setup from staging to live.
- Export Settings downloads the main settings: categories, terms location, global terms and popup text.
- Import Settings replaces all current settings with the file’s. You’ll be asked to confirm first.
Category and product terms are stored on the categories and products themselves and aren’t included in the export. Category IDs also differ between sites, so check Enable for Categories after importing onto a different site.
Compatibility
- AJAX add to basket on shop and category pages works as normal after acceptance, including mini-cart and basket count updates.
- Other plugins that listen for WooCommerce’s standard
added_to_cartevent (side carts, quick view plugins, analytics) are notified as normal after acceptance. - Themes: works with themes that use standard WooCommerce add-to-basket buttons and product forms. Heavily customised buttons that don’t use WooCommerce’s standard classes may not trigger the popup — get in touch if that’s you.
- WooCommerce Blocks: the block-based product grids and the Product Collection block aren’t supported yet. See Where the popup works above.
Privacy
Acceptance is held in the customer’s WooCommerce session, with a backup cookie (bdptg_accepted_) that expires after 30 minutes. The cookie is HTTP-only and secure on HTTPS sites. Nothing is written to your database about individual customers, and no data leaves your site.
Because the cookie is needed for the feature the customer is using, it’s normally treated as strictly necessary. Check with your own cookie policy if you’re unsure.
Uninstalling
Deactivating the plugin turns the popup off and leaves your settings in place. Deleting it from Plugins removes everything it stored: the settings, all category terms and all product terms. Export your settings first if you might want them back.
Questions
Can I change the 30-minute acceptance time?
Not in version 1.0.0. It’s fixed at 30 minutes. Let us know if you need it longer or shorter.
Can a customer accept once for a whole category?
Not yet. Acceptance is per product, so a customer buying three different gated products sees the popup three times.
Does it keep a record of who accepted?
No. It doesn’t log acceptances. If you need an audit trail, a checkbox at checkout (which WooCommerce stores with the order) is the better tool.
Can customers still browse gated products?
Yes. Nothing changes until they try to add one to the basket.
Does it load on every page?
No. The script and styles only load on shop, category and product pages, and the terms text is only fetched when the popup opens.
Is it on WordPress.org?
Not yet. For now, download it from baltic.digital.
Support
Product Terms Gate is free and supported on a best-effort basis. If something isn’t working, use the Contact support button with your plugin version, your WooCommerce version, and the page where the popup isn’t behaving.