- Add ModuleRegistry for managing built-in modules (newsletter, wishlist, affiliate, subscription, licensing) - Add ModulesController REST API for module enable/disable - Create Modules settings page with category grouping and toggle controls - Integrate module checks across admin-spa and customer-spa - Add useModules hook for both SPAs to check module status - Hide newsletter from footer builder when module disabled - Hide wishlist features when module disabled (product cards, account menu, wishlist page) - Protect wishlist API endpoints with module checks - Auto-update navigation tree when modules toggled - Clean up obsolete documentation files - Add comprehensive documentation: - MODULE_SYSTEM_IMPLEMENTATION.md - MODULE_INTEGRATION_SUMMARY.md - ADDON_MODULE_INTEGRATION.md (proposal) - ADDON_MODULE_DESIGN_DECISIONS.md (design doc) - FEATURE_ROADMAP.md - SHIPPING_INTEGRATION.md Module system provides: - Centralized enable/disable for all features - Automatic navigation updates - Frontend/backend integration - Foundation for addon-module unification
7.2 KiB
Module System Integration Summary
Date: December 26, 2025
Status: ✅ Complete
Overview
All module-related features have been wired to check module status before displaying. When a module is disabled, its features are completely hidden from both admin and customer interfaces.
Integrated Features
1. Newsletter Module (newsletter)
Admin SPA
File: admin-spa/src/routes/Marketing/Newsletter.tsx
- ✅ Added
useModules()hook - ✅ Shows disabled state UI when module is off
- ✅ Provides link to Module Settings
- ✅ Blocks access to newsletter subscribers page
Navigation:
- ✅ Newsletter menu item hidden when module disabled (NavigationRegistry.php)
Result: When newsletter module is OFF:
- ❌ No "Newsletter" menu item in Marketing
- ❌ Newsletter page shows disabled message
- ✅ User redirected to enable module in settings
2. Wishlist Module (wishlist)
Customer SPA
File: customer-spa/src/pages/Account/Wishlist.tsx
- ✅ Added
useModules()hook - ✅ Shows disabled state UI when module is off
- ✅ Provides "Continue Shopping" button
- ✅ Blocks access to wishlist page
File: customer-spa/src/pages/Product/index.tsx
- ✅ Added
useModules()hook - ✅ Wishlist button hidden when module disabled
- ✅ Combined with settings check (
wishlistEnabled)
File: customer-spa/src/components/ProductCard.tsx
- ✅ Added
useModules()hook - ✅ Created
showWishlistvariable combining module + settings - ✅ All 4 layout variants updated (Classic, Modern, Boutique, Launch)
- ✅ Heart icon hidden when module disabled
File: customer-spa/src/pages/Account/components/AccountLayout.tsx
- ✅ Added
useModules()hook - ✅ Wishlist menu item filtered out when module disabled
- ✅ Combined with settings check
Backend API
File: includes/Frontend/WishlistController.php
- ✅ All endpoints check module status
- ✅ Returns 403 error when module disabled
- ✅ Endpoints: get, add, remove, clear
Result: When wishlist module is OFF:
- ❌ No heart icon on product cards (all layouts)
- ❌ No wishlist button on product pages
- ❌ No "Wishlist" menu item in My Account
- ❌ Wishlist page shows disabled message
- ❌ All wishlist API endpoints return 403
3. Affiliate Module (affiliate)
Status: Not yet implemented (module registered, no features built)
4. Subscription Module (subscription)
Status: Not yet implemented (module registered, no features built)
5. Licensing Module (licensing)
Status: Not yet implemented (module registered, no features built)
Implementation Pattern
Frontend Check (React)
import { useModules } from '@/hooks/useModules';
export default function MyComponent() {
const { isEnabled } = useModules();
if (!isEnabled('my_module')) {
return <DisabledStateUI />;
}
// Normal component render
}
Backend Check (PHP)
use WooNooW\Core\ModuleRegistry;
public function my_endpoint($request) {
if (!ModuleRegistry::is_enabled('my_module')) {
return new WP_Error('module_disabled', 'Module is disabled', ['status' => 403]);
}
// Process request
}
Navigation Check (PHP)
// In NavigationRegistry.php
if (ModuleRegistry::is_enabled('my_module')) {
$children[] = ['label' => 'My Feature', 'path' => '/my-feature'];
}
Files Modified
Admin SPA (1 file)
admin-spa/src/routes/Marketing/Newsletter.tsx- Newsletter page module check
Customer SPA (4 files)
customer-spa/src/pages/Account/Wishlist.tsx- Wishlist page module checkcustomer-spa/src/pages/Product/index.tsx- Product page wishlist buttoncustomer-spa/src/components/ProductCard.tsx- Product card wishlist heartscustomer-spa/src/pages/Account/components/AccountLayout.tsx- Account menu filtering
Backend (2 files)
includes/Frontend/WishlistController.php- API endpoint protectionincludes/Compat/NavigationRegistry.php- Navigation filtering
Testing Checklist
Newsletter Module
- Toggle newsletter OFF in Settings > Modules
- Verify "Newsletter" menu item disappears from Marketing
- Try accessing
/marketing/newsletterdirectly - Expected: Shows disabled message with link to settings
- Toggle newsletter ON
- Verify menu item reappears
Wishlist Module
- Toggle wishlist OFF in Settings > Modules
- Visit shop page
- Expected: No heart icons on product cards
- Visit product page
- Expected: No wishlist button
- Visit My Account
- Expected: No "Wishlist" menu item
- Try accessing
/my-account/wishlistdirectly - Expected: Shows disabled message
- Try API call:
GET /woonoow/v1/account/wishlist - Expected: 403 error "Wishlist module is disabled"
- Toggle wishlist ON
- Verify all features reappear
Performance Impact
Caching
- Module status cached for 5 minutes via React Query
- Navigation tree rebuilt automatically when modules toggled
- Minimal overhead (~1 DB query per page load)
Bundle Size
- No impact - features still in bundle, just conditionally rendered
- Future: Could implement code splitting for disabled modules
Future Enhancements
Phase 2
- Code Splitting: Lazy load module components when enabled
- Module Dependencies: Prevent disabling if other modules depend on it
- Bulk Operations: Enable/disable multiple modules at once
- Module Analytics: Track which modules are most used
Phase 3
- Third-party Modules: Allow installing external modules
- Module Marketplace: Browse and install community modules
- Module Updates: Version management for modules
- Module Settings: Per-module configuration pages
Developer Notes
Adding Module Checks to New Features
-
Import the hook:
import { useModules } from '@/hooks/useModules'; -
Check module status:
const { isEnabled } = useModules(); if (!isEnabled('module_id')) return null; -
Backend protection:
if (!ModuleRegistry::is_enabled('module_id')) { return new WP_Error('module_disabled', 'Module disabled', ['status' => 403]); } -
Navigation filtering:
if (ModuleRegistry::is_enabled('module_id')) { $children[] = ['label' => 'Feature', 'path' => '/feature']; }
Common Pitfalls
- Don't forget backend checks - Frontend checks can be bypassed
- Check both module + settings - Some features have dual toggles
- Update navigation version - Increment when adding/removing menu items
- Clear cache on toggle - ModuleRegistry auto-clears navigation cache
Summary
✅ Newsletter Module: Fully integrated (admin page + navigation)
✅ Wishlist Module: Fully integrated (frontend UI + backend API + navigation)
⏳ Affiliate Module: Registered, awaiting implementation
⏳ Subscription Module: Registered, awaiting implementation
⏳ Licensing Module: Registered, awaiting implementation
Total Integration Points: 7 files modified, 11 integration points added
Next Steps: Implement Newsletter Campaigns feature (as per FEATURE_ROADMAP.md)