{"id":245376,"date":"2025-09-03T05:49:22","date_gmt":"2025-09-03T05:49:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/grabwp-tenancy\/"},"modified":"2026-03-29T18:15:21","modified_gmt":"2026-03-29T18:15:21","slug":"grabwp-tenancy","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/grabwp-tenancy\/","author":16136912,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.7","stable_tag":"1.0.7","tested":"6.9.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"GrabWP Tenancy","header_author":"GrabWP","header_description":"Foundation multi-tenant WordPress solution with shared MySQL database and separated uploads. Designed to be extended by GrabWP Tenancy Pro for advanced features.","assets_banners_color":"0260bb","last_updated":"2026-03-29 18:15:21","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/grabwp.com","header_plugin_uri":"https:\/\/grabwp.com\/tenancy","header_author_uri":"https:\/\/grabwp.com","rating":5,"author_block_rating":0,"active_installs":10,"downloads":686,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0.1":{"tag":"1.0.0.1","author":"taicv","date":"2025-09-03 05:50:52"},"1.0.1":{"tag":"1.0.1","author":"taicv","date":"2025-09-06 19:25:57"},"1.0.2":{"tag":"1.0.2","author":"taicv","date":"2025-09-06 19:27:58"},"1.0.3":{"tag":"1.0.3","author":"taicv","date":"2025-09-09 18:44:47"},"1.0.4":{"tag":"1.0.4","author":"taicv","date":"2026-01-05 18:06:31"},"1.0.5":{"tag":"1.0.5","author":"taicv","date":"2026-02-17 16:48:18"},"1.0.6":{"tag":"1.0.6","author":"taicv","date":"2026-03-23 21:54:14"},"1.0.7":{"tag":"1.0.7","author":"taicv","date":"2026-03-29 18:15:21"}},"upgrade_notice":{"1.0.0":"<p>Initial release of GrabWP Tenancy.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3357794,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3357794,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3493952,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3493952,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3493960,"resolution":false,"location":"assets","locale":"","contents":"{\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=grabwp-tenancy\",\"preferredVersions\":{\"php\":\"7.4\",\"wp\":\"5.9\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"grabwp-tenancy\"},\"options\":{\"activate\":true}}]}"}},"all_blocks":[],"tagged_versions":["1.0.0.1","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3493576,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3493576,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3493576,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3493576,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3493578,"resolution":"5","location":"assets","locale":""}},"screenshots":{"1":"Adding one domain per tenant","2":"Support multiple domains per tenant","3":"Simple listing all tenants"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[10643,2686,258932,441,1603],"plugin_category":[51],"plugin_contributors":[245697],"plugin_business_model":[],"class_list":["post-245376","plugin","type-plugin","status-publish","hentry","plugin_tags-multi-domain","plugin_tags-multi-site","plugin_tags-multi-tenant","plugin_tags-multisite","plugin_tags-saas","plugin_category-multisite","plugin_contributors-taicv","plugin_committers-taicv"],"banners":{"banner":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/banner-772x250.png?rev=3493952","banner_2x":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/banner-1544x500.png?rev=3493952","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/icon-128x128.png?rev=3357794","icon_2x":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/icon-256x256.png?rev=3357794","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/screenshot-1.png?rev=3493576","caption":"Adding one domain per tenant"},{"src":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/screenshot-2.png?rev=3493576","caption":"Support multiple domains per tenant"},{"src":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/screenshot-3.png?rev=3493576","caption":"Simple listing all tenants"},{"src":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/screenshot-4.png?rev=3493576","caption":""},{"src":"https:\/\/ps.w.org\/grabwp-tenancy\/assets\/screenshot-5.png?rev=3493578","caption":""}],"raw_content":"<!--section=description-->\n<p>https:\/\/www.youtube.com\/watch?v=SAd_QeUZEDw<\/p>\n\n<h4>WORDPRESS MULTISITE ALTERNATIVE - ENABLE MULTI-TENANT AT NO COST<\/h4>\n\n<p>GrabWP Tenancy provides the foundation for multi-tenant WordPress with essential isolation features. Host your tenants effortlessly on a single domain using our new <strong>Path-Based Routing<\/strong> (e.g., example.com\/site\/abcdef), or map them to full custom domains. It is the perfect, lightweight, drop-in replacement for WordPress Multisite built for simplicity and scale.<\/p>\n\n<p><strong>\ud83d\udcd6 Complete Documentation<\/strong>: <a href=\"https:\/\/grabwp.com\">grabwp.com<\/a><br \/>\n<strong>\ud83d\udcbb Source Code<\/strong>: <a href=\"https:\/\/github.com\/grabwp\/grabwp-tenancy\">GitHub Repository<\/a><br \/>\n<strong>\ud83d\udc1b Report Issues<\/strong>: <a href=\"https:\/\/github.com\/grabwp\/grabwp-tenancy\/issues\">GitHub Issues<\/a><\/p>\n\n<h4>Core Features<\/h4>\n\n<ul>\n<li><strong>Shared MySQL Database<\/strong>: Cost-effective tenant isolation using unique table prefixes<\/li>\n<li><strong>Separated Upload Directories<\/strong>: Each tenant gets isolated upload directories<\/li>\n<li><strong>Shared Themes &amp; Plugins<\/strong>: All tenants share the same themes and plugins for simplicity<\/li>\n<li><strong>Flexible Routing Options<\/strong>: Choose between domain-based routing or our new <strong>path-based (subdirectory) routing<\/strong> for an effortless setup without DNS changes.<\/li>\n<li><strong>Basic Admin Interface<\/strong>: Simple tenant management through WordPress admin<\/li>\n<li><strong>Early Initialization<\/strong>: Plugin loads before WordPress core hooks<\/li>\n<\/ul>\n\n<h4>Need More? Upgrade to Pro<\/h4>\n\n<p>Managing multiple client sites and need enterprise-grade isolation? <strong><a href=\"https:\/\/grabwp.com\/pro\/\">GrabWP Tenancy Pro<\/a><\/strong> adds:<\/p>\n\n<ul>\n<li><strong>Dedicated MySQL or SQLite<\/strong> database per tenant \u2014 complete data isolation, zero cross-tenant risk<\/li>\n<li><strong>Full wp-content separation<\/strong> \u2014 isolated themes, plugins &amp; uploads per tenant<\/li>\n<li><strong>AJAX backup &amp; restore<\/strong> \u2014 7-step backup, 8-step restore with real-time progress UI<\/li>\n<li><strong>Cross-database migration<\/strong> \u2014 move tenants freely between shared MySQL, dedicated MySQL, and SQLite<\/li>\n<li><strong>Extension sync &amp; management<\/strong> \u2014 sync plugins\/themes with filesystem, switch between symlink and copy installs<\/li>\n<li><strong>Broken symlink auto-repair<\/strong> \u2014 one-click detection and repair<\/li>\n<li><strong>Custom tenant data location<\/strong> \u2014 store content outside wp-content\/uploads using settings or wp-config.php<\/li>\n<li><strong>Per-tenant config files<\/strong> \u2014 each tenant gets its own config; new tenants inherit master defaults<\/li>\n<\/ul>\n\n<p><strong>From $9.99\/month<\/strong> \u2014 all plans include every feature. Use code <code>EARLYBIRDPRO<\/code> for 20% off.<\/p>\n\n<p>\ud83d\udc49 <strong><a href=\"https:\/\/grabwp.com\/pro\/\">Get Pro Now<\/a><\/strong><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/grabwp-tenancy<\/code> directory<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress\n<strong>\ud83d\udcd6 Need detailed setup instructions?<\/strong> Visit our <a href=\"https:\/\/grabwp.com\">complete documentation<\/a> for step-by-step guides and troubleshooting.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20work%20with%20wordpress%20multisite%3F\"><h3>Does this plugin work with WordPress multisite?<\/h3><\/dt>\n<dd><p>No, this plugin provides multi-tenancy functionality without requiring WordPress multisite. It creates tenant isolation through domain-based or path-based routing and database prefixes.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20custom%20domain%20for%20every%20tenant%3F\"><h3>Do I need a custom domain for every tenant?<\/h3><\/dt>\n<dd><p>No! With our new path-based routing feature, you can completely bypass complex domain and DNS configurations. You can host tenants dynamically on subdirectories underneath your main site (e.g., <code>yoursite.com\/client-a<\/code>).<\/p><\/dd>\n<dt id=\"can%20i%20use%20custom%20domains%20for%20tenants%3F\"><h3>Can I use custom domains for tenants?<\/h3><\/dt>\n<dd><p>Yes, you can configure custom domains for each tenant through the admin interface or by editing the tenant mapping file.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20compatible%20with%20other%20plugins%3F\"><h3>Is this plugin compatible with other plugins?<\/h3><\/dt>\n<dd><p>The plugin is designed to be compatible with most WordPress plugins. However, plugins that directly access database tables may need to be configured to work with tenant prefixes.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20help%3F\"><h3>Where can I get help?<\/h3><\/dt>\n<dd><ul>\n<li><strong>Documentation<\/strong>: Visit <a href=\"https:\/\/grabwp.com\">grabwp.com<\/a> for complete guides and tutorials<\/li>\n<li><strong>Support Forum<\/strong>: Use the <a href=\"https:\/\/wordpress.org\/support\/plugin\/grabwp-tenancy\/\">WordPress.org support forum<\/a> for community help<\/li>\n<li><strong>Technical Issues<\/strong>: Report bugs on <a href=\"https:\/\/github.com\/grabwp\/grabwp-tenancy\/issues\">GitHub Issues<\/a><\/li>\n<\/ul><\/dd>\n<dt id=\"how%20is%20this%20different%20from%20wordpress%20multisite%3F\"><h3>How is this different from WordPress Multisite?<\/h3><\/dt>\n<dd><p>WordPress Multisite shares one database, one set of plugins, and one set of themes across all sites. GrabWP Tenancy gives each tenant true isolation \u2014 separate table prefixes, separate upload directories, and with Pro, completely dedicated databases and per-tenant plugins\/themes. No network admin complexity, no shared-database risks.<\/p><\/dd>\n<dt id=\"can%20i%20manage%2050%2B%20client%20sites%20with%20this%3F\"><h3>Can I manage 50+ client sites with this?<\/h3><\/dt>\n<dd><p>Yes. GrabWP Tenancy is built for WordPress freelancers and agencies managing multiple client sites from a single installation. The admin interface handles tenant CRUD, and Pro adds backup\/restore per tenant for easy management at scale.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Major: Introducing <strong>Path-Based Routing<\/strong>! You can now host tenants on subdirectories\/paths (e.g., <code>example.com\/site\/abcdef<\/code>) without requiring separate domains. This completely eliminates the need for complex domain mappings and serves as a true, lightweight replacement for WordPress Multisite.<\/li>\n<li>Enhance: Added comprehensive <code>.htaccess<\/code> diagnostic admin notices specifically tailored for path-based routing support.<\/li>\n<li>Enhance: Centralized configuration and diagnostic tools into a transparent, read-only Status Page UI with manual fallback instructions for environment issues.<\/li>\n<li>Refactor: Streamlined the installation, uninstallation, and environment-fixing processes into a single <code>GrabWP_Tenancy_Installer<\/code> class.<\/li>\n<li>Security: Improved code compliance by integrating complete nonce verification on sensitive administrative handlers and securely transitioning to <code>wp_is_writable()<\/code>.<\/li>\n<li>Fix: Resolved PHP fatal errors (e.g., <code>Class Not Found<\/code>) relating to the class autoloader sequence during the initial activation process.<\/li>\n<li>Quality: Standardized codebase formatting for consistent line endings (CRLF to LF) and file encoding across all files.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>New: Dedicated <strong>Status<\/strong> admin page with system information, file structure, database config, content isolation, and domain routing details (moved out of Settings page)<\/li>\n<li>New: One-click <strong>Auto Install MU-Plugin<\/strong> button with AJAX handler \u2014 auto-creates the must-use plugin file, or shows copy-to-clipboard fallback when the directory is not writable<\/li>\n<li>New: One-click <strong>Auto Install to wp-config.php<\/strong> button with AJAX handler \u2014 injects the <code>load.php<\/code> require line before the stop-editing marker, or shows copy-to-clipboard fallback when <code>wp-config.php<\/code> is not writable<\/li>\n<li>New: Admin notices for missing MU-plugin and missing <code>wp-config.php<\/code> loader, shown only on plugin pages, with writability-aware UI (auto-install vs. manual copy)<\/li>\n<li>New: Pro Features section added to the plugin readme<\/li>\n<li>Improved: Default tenant capability settings are now <strong>enabled<\/strong> (Disallow File Mods, Disallow File Edit, Hide Plugin Management, Hide Theme Management) for stronger security out of the box<\/li>\n<li>Improved: Added fallback definition of <code>grabwp_tenancy_validate_tenant_id()<\/code> in Path Manager so validation works even when <code>load-helper.php<\/code> is not loaded<\/li>\n<li>Improved: Tenant edit page title now displays the tenant ID for clarity<\/li>\n<li>Improved: Moved AJAX nonces (<code>muPluginNonce<\/code>, <code>loaderNonce<\/code>) into localized admin script data<\/li>\n<li>Improved: Refactored JS \u2014 extracted <code>bindCopyButton()<\/code> helper, added <code>initMuPluginInstall()<\/code> and <code>initLoaderInstall()<\/code> handlers in <code>grabwp-admin.js<\/code><\/li>\n<li>Improved: Streamlined <code>load-helper.php<\/code> base-dir resolution logic and added <code>GRABWP_TENANCY_DIRS_FROM_PLUGIN<\/code> constant<\/li>\n<li>Improved: Renamed local variables in tenant views to use <code>grabwp_tenancy_<\/code> prefix to avoid potential conflicts<\/li>\n<li>Improved: Tested up to WordPress 6.9<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>New: Settings page for tenant capability controls (Disallow File Mods, Disallow File Edit, Hide Plugin Management, Hide Theme Management, Hide GrabWP Plugins)<\/li>\n<li>Fix: Tenant ID starting with a number causes database errors on table prefix<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Enhance tenant management with a new list table for admin<\/li>\n<li>Implement logging functionality, and improve tenant deletion process with confirmation prompts.<\/li>\n<li>Refactor path management and database handling for better organization and security.<\/li>\n<li>Update translations and enhance admin UI elements for improved user experience.<\/li>\n<li>Refactor tenant initialization process to streamline functionality for tenant and main site.<\/li>\n<li>Remove deprecated asset loading class and configuration management.<\/li>\n<li>Enhance tenant context handling and improve upload directory management.<\/li>\n<li>Introduce hooks for pro plugin extensibility and improve code organization for better maintainability.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li><strong>Major Enhancement<\/strong>: Added comprehensive early loading system with load-helper.php<\/li>\n<li><strong>Security Improvements<\/strong>: Enhanced input sanitization and validation functions for early loading<\/li>\n<li><strong>Path Management<\/strong>: Introduced centralized Path Manager with backward compatibility support<\/li>\n<li><strong>WordPress Compliance<\/strong>: Improved path structure with fallback to WordPress-compliant uploads directory<\/li>\n<li><strong>CLI Support<\/strong>: Added command-line interface support for tenant operations<\/li>\n<li><strong>Performance<\/strong>: Optimized tenant detection with caching and reduced file system calls<\/li>\n<li><strong>Backward Compatibility<\/strong>: Maintained support for existing wp-content\/grabwp structure<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Improved tenant management interface<\/li>\n<li>Direct login button to tenant from main site admin (If plugin also activated on tenant)<\/li>\n<li>No longer access to plugin admin page and menu from tenant's admin dashboard<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Refactored core plugin for improved tenant management and protocol handling<\/li>\n<li>Added admin notice registration for better user feedback in the admin area<\/li>\n<li>Defined GRABWP_TENANCY_LOADED constant for reliable plugin load detection<\/li>\n<li>Added translation support by loading the plugin text domain on initialization<\/li>\n<li>Added Vietnamese language support<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Basic multi-tenant functionality<\/li>\n<li>Domain-based routing<\/li>\n<li>Admin interface for tenant management<\/li>\n<li>Shared MySQL with tenant prefixes<\/li>\n<li>Separated upload directories<\/li>\n<\/ul>","raw_excerpt":"Multi-tenant WordPress with shared MySQL, domain and path routing, and isolated uploads.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/245376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=245376"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/taicv"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=245376"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=245376"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=245376"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=245376"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=245376"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=245376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}