WordPress T&C Acceptance for Developers: a Practical, Audit-Ready Approach (Login + WooCommerce)

Why devs care (and what to require)
When legal asks for “proof the user accepted,” a checkbox isn’t enough. You need:
- DB-logged proof (user ID + timestamp + context) you can query later
- Enforcement points: login, wp-admin, checkout (and optionally “every login”)
- WooCommerce order reference (so support/finance can resolve disputes)
- Email confirmations (admin and/or user)
- Reset all / single user after policy updates
- Exportable logs (CSV) for audits or client handoffs
- Role targeting (only the roles that need it)
- A developer hook to decide exactly when/where to show
- Lightweight UI that’s mobile-safe, accessible, and cache-friendly
Not legal advice—treat this as implementation guidance and confirm requirements with counsel.
What this plugin does (dev-first overview)
- Legal-grade consent: writes a proof string to your WordPress DB
- WooCommerce integration: block checkout until acceptance; Pro links consent to the order
- Email confirmations: optional emails to user/admin (Pro)
- Resets: one-click reset all or reset single user (Pro)
- CSV export: audit-ready logs in seconds (Pro)
- Role targeting + “show on every login” mode
- Developer control via tpul_override_show_popup filter
Install the free version to gate login and store responses; upgrade to Pro for logs/CSV, resets, Woo order reference, emails, and advanced controls.
Quick start (5 minutes)
- Install & activate the plugin
- Pick enforcement points: Login, wp-admin, WooCommerce (product/cart/checkout)
- Add your Terms (rich text, links, shortcodes supported)
- Choose behavior: decline → log + logout, accept → redirect (optional), show on every login (optional)
- (Pro) Toggle email confirmations, reset options, and CSV export
- (Pro) For WooCommerce, confirm order reference is enabled so consent attaches to orders
You’re live.
Developer control: when the popup should (not) appear
You get a filter to override default logic and precisely gate the popup by role, route, meta, or querystring.
/**
* Decide when to show the T&C popup.
* Return true to force showing, false to suppress, or $show to keep default behavior.
*/
add_filter('tpul_override_show_popup', function ($show) {
// 1) Never show to admins
if ( is_user_logged_in() && current_user_can('manage_options') ) {
return false;
}
// 2) Don’t show on home/blog archive
if ( is_home() || is_front_page() ) {
return false;
}
// 3) Force-show on checkout even if accepted before (edge case)
if ( function_exists('is_checkout') && is_checkout() ) {
return true;
}
// 4) Allow QA to disable via querystring: ?tpul=disable
if ( isset($_GET['tpul']) && $_GET['tpul'] === 'disable' ) {
return false;
}
return $show;
});Reading consent for an order (Pro)
If you need to surface consent in support tooling, you can read the order meta:
add_action('add_meta_boxes_shop_order', function() {
add_meta_box('tpul_consent_box', 'T&C Consent', function($post) {
$consent = get_post_meta($post->ID, '_tpul_consent_ref', true); // example key
if ($consent) {
echo '<p><code>'.esc_html($consent).'</code></p>';
} else {
echo '<p>No consent reference found.</p>';
}
}, 'shop_order', 'side');
});UX details that reduce drop-off
- Mobile first: big tap targets, focus outlines, never trap scroll; keep “Accept” primary, “Decline” safe but obvious
- Performance: inline the modal’s critical styles, lazy-load extras; avoid blocking fonts; keep modal under ~12KB CSS
- Accessibility: role="dialog", proper aria-labelledby/aria-describedby, focus trap, ESC to close (when allowed), and readable contrast
- Copy: single plain-language sentence + link to full terms; add a one-liner about what happens on decline
Common deployments (copy/paste framing)
- Membership sites: require re-acceptance on next login after policy changes; export CSV for compliance
- WooCommerce stores: gate checkout; attach consent reference to order; email confirmations for paper trail
- Agencies: standardize consent across portfolios; give clients exportable logs; use one hook for custom gating
- Internal portals: block wp-admin until security/IT policies are accepted
Troubleshooting & edge cases
- Caching/CDN: the popup is user-specific; bypass cache for logged-in users and checkout endpoints
- Ajax logins: if you use a custom login form, test that the popup still fires after auth
- Role migrations: when users change roles, confirm your tpul_override_show_popup logic still holds
- Terms updates: use Reset all so everyone re-accepts; verify in logs/CSV
- Localization: set <html lang="…"> and translate the modal strings; consider RTL layout if needed
Example policy update flow (playbook)
- Update Terms page (version/date at top)
- In plugin settings, Reset all users (Pro)
- Turn on email confirmations for a week (optional)
- Monitor dashboard/CSV for re-acceptance rates
- After 7–14 days, export CSV and store with your change log
FAQ (dev-focused)
Where is consent stored?
A proof string in your WordPress DB with timestamp and user ID. Pro adds CSV export and Woo order reference.
Can I limit by role or only on admin?
Yes—built-in role targeting, plus a hook to gate by any context you need.
What happens on decline?
Configurable: log the decline, optionally log the user out and/or redirect to a policy page.
Can I force re-acceptance after changes?
Yes—reset all users or a single user. Next login/checkout requires acceptance.
Performance impact?
It’s lightweight and cache-friendly. The modal styles are small; no page-builder lock-in.
Ready to implement?
- Free version: enforce at login/admin and log responses to DB
- Pro: CSV exports, resets, Woo order reference, email confirmations, advanced logging, dev hook
Stay compliant without custom code.
→ Get the plugin | → Read the docs
