Notas de lanzamiento

Qué cambió en GrabWP

El historial de lanzamientos se compila a partir del readme.txt de cada plugin. Cada entrada refleja una instantánea de esos archivos fuente.

Fuente de verdad

Los readmes de los plugins son la fuente autorizada. Esta página se actualiza cuando se publica un lanzamiento.

Plugin base

GrabWP Tenancy

Versión estable actual: v1.1.15

Historial de lanzamientos: 28

v1.1.15

  • New: Hosting setup card on the setup wizard Check screen and on Status. It checks for leftover Multisite settings, an https site address, HTTPS behind a proxy or CDN, and wildcard domain readiness, and can add a safe HTTPS proxy block to wp-config.php.
  • New: Remove Multisite settings, with Undo, in the Hosting setup card. It removes leftover Multisite lines from wp-config.php (including `$base` and COOKIE_DOMAIN, WP_HOME or WP_SITEURL set from HTTP_HOST), keeps a backup, checks that the site still loads and rolls back if not. Old Multisite rules in .htaccess are listed as a note only, because GrabWP does not use them.
  • New: The Status page and the setup wizard Check screen now show the same checks, plus System Information and a Copy diagnostics button for support requests. Passwords, keys, salts, emails and file paths are left out, and nothing is sent anywhere.
  • New: Setting to hide the Themes screen for tenants while keeping Customize, Menus and Widgets.
  • New: Tenant file safety warning when Disable Install Plugins & Themes or Disable Plugin & Theme File Editor is off, when code in wp-config.php forces them off, or when a tenant's own Pro override turns them off. These let a tenant admin run PHP on the server.
  • Enhance: The integrity watchdog now repairs only GrabWP's own blocks in wp-config.php and .htaccess and keeps your other edits. It checks wp-config.php with the PHP parser, never writes a broken file, repairs in one atomic step, and shows its notice on the Status page.
  • Enhance: Setup wizard polish: the routing save creates tenants.php when it is missing and names the real cause of a failed write, the wizard offers path or domain routing (both stays in Settings), recommended choices are preselected, and the site step suggests a domain.
  • Fix: Tenant pretty permalinks, REST and feed URLs returned 404 on OpenLiteSpeed (xCloud). Tenant URLs are now routed in one rewrite pass, and Fix on Status upgrades the old .htaccess block.
  • Fix: Tenants no longer share the main site's object cache drop-in. It is kept only when the cache keys stay separate (xSpeed with a per-tenant salt, Redis Object Cache with the tenant's own table prefix).
  • Fix: Creating a site behind Cloudflare or a proxy could report an empty site as ready. The installer now retries over HTTPS when the address is only upgraded, checks that the answer really comes from the new site, and waits a bounded time.
  • Fix: Cloning keeps working when a stored value holds an object of a plugin class that is not loaded, and clone URLs are rewritten in one transaction.
  • Enhance: All strings are translated in the six bundled languages.
  • Dev: Filters `grabwp_tenancy_tenant_object_cache_dropin`, `grabwp_tenancy_tenant_install_route_wait`, `grabwp_tenancy_unsafe_tenant_file_overrides` and `grabwp_tenancy_wildcard_domain`, and an admin-only read-only diagnostics REST route.

v1.1.14

  • New: A warning under a setting when wp-config.php or another plugin already sets its WordPress constant to a different value, so the setting has no effect. It shows on Settings and on Status > Base.
  • Enhance: Clearer setting labels and help text for non-technical admins. Each label says what Yes does (for example Disable Install Plugins & Themes), and the WordPress constant a setting controls is shown next to its choice.
  • Enhance: Status > Base lists every GrabWP setting, Performance & Security included, with the same labels and order as the Settings screen.
  • Enhance: Help tips use the WordPress 7.1 toggle tip. Older WordPress keeps the help icon with its hover text.
  • Fix: Hide GrabWP Plugins now hides every GrabWP plugin from the tenant Plugins list, including WaaS, Partner and the add-ons, not only GrabWP Tenancy and Pro.
  • Enhance: Reviewed and improved Arabic translation, contributed by hanidarrag. Thank you!
  • Enhance: Updated translations for the new and reworded strings in all six bundled languages.
  • Dev: `GrabWP_Tenancy_Admin::help_tip()` and `get_help_tip()` for add-ons, the `grabwp_tenancy_use_core_help_tip` filter, and an optional `tip` on setup wizard option cards.

v1.1.13

  • New: Setup wizard. After activation on a new site, GrabWP opens a short guided setup: server check, routing mode, first site, done. Exit keeps your place, and Tenancy > Status > Run (or Resume) setup wizard opens it again at any time.
  • New: Routing mode under Tenancy > Settings > Routing: path URLs, custom domains, or both. In domain mode a tenant's path URL redirects (301) to its domain. Switching modes asks for confirmation and never deletes or rewrites existing sites.
  • New: Add New installs WordPress in the new site right away (option ticked by default) and shows the admin username and a one-time password, with a 1-click Admin button.
  • Enhance: Add New defaults to the path URL; a domain can be mapped later.
  • Enhance: Automatic installs complete the WordPress install step, so a new site never stays open on install.php.
  • Enhance: Server checks read fresh files and bypass page caches, and Fix buttons run one at a time, so a fix shows as done right away.

v1.1.12

  • New: Early suspended-site block. When a tenant is flagged as suspended, its stored page is served with a 503 status before WordPress loads, for the front end, wp-admin, REST, XML-RPC and cron. WP-CLI always passes. Active tenants pay only one file check per request.
  • Enhance: Deleting a tenant also removes its suspension flag.

v1.1.11

  • Enhance: Bundled Arabic translation. The plugin shows in Arabic out of the box, including the six Arabic plural forms.

v1.1.10

  • Enhance: Bundled translations for Vietnamese, Spanish, Indonesian, French and Simplified Chinese. The plugin shows in these languages out of the box, no Loco Translate or extra language pack needed.

v1.1.9

  • New: Shared files lock. wp-config.php, .htaccess, .user.ini and web.config in the WordPress root are made read-only (0444) so tenant plugins cannot rewrite them. It is on by default, including on sites that update. Turn it off with Unlock shared files on the Status page.
  • New: Integrity watchdog. GrabWP keeps a snapshot of each protected file. If a tenant admin, AJAX, cron or form request changes one, the file is restored, the event is logged, and the main-site admin sees a notice.
  • Enhance: GrabWP's own writes and main-site permalink saves unlock the files and lock them again automatically.
  • Enhance: Tenant requests no longer rewrite the shared root .htaccess or web.config. Tenant rewrite rules still update, so routing keeps working.
  • Change: If a main-site plugin (for example a cache plugin) needs to write these files, Unlock temporarily, then Lock again. The Status page shows each file's permissions.
  • Change: Deactivating the plugin unlocks the files and removes the snapshots.

v1.1.8

  • New: Shared slug sanitizer (grabwp_sanitize_slug) used by GrabWP add-ons. Slugs become lowercase letters, numbers, and hyphens; accented characters (including Vietnamese) are folded to plain letters, and underscores become hyphens.
  • New: Slug fields in the admin (class grabwp-slug-input) convert input live as you type, so invalid characters never reach the form.
  • New: Early custom-domain verification probe (?grabwp-verify-domain=1). It answers before WordPress fully boots so add-ons can confirm a domain is routed to the right tenant.
  • Enhance: When a form field fails validation inside a hidden admin tab, that tab opens automatically so the error is visible.
  • Fix: Auto-generated tenant domains on a subdomain install now use the parent domain instead of stacking the full hostname.

v1.1.7

  • Enhance: Compact admin UI spacing across the tenant, settings, and status screens for a denser, more efficient layout
  • New: Shared admin UI script (grabwp-admin-shared.js) providing in-page tabs that persist the active tab in localStorage per admin page, enqueued ahead of the base and Pro admin scripts
  • Enhance: Domain names are normalized to lowercase during tenant create and edit, so mixed-case entries no longer create duplicate or unmatched domains
  • Enhance: After creating a tenant the list highlights the newly created row
  • Change: Tested up to WordPress 7.1

v1.1.6

  • Enhance: Deferred tenant settings to plugins_loaded priority 20 so Pro (and other plugins) can filter effective values for per-tenant overrides
  • New: `get_effective_setting()` method with `grabwp_tenancy_effective_setting` filter, letting plugins override individual global settings per tenant
  • New: `get_setting_fields()` public method returns a canonical field schema (label, type, group, description, min, max) for each global setting, used by Pro's per-tenant overrides UI
  • Change: `get_setting_types()` is now public so external code can read the type map
  • Change: Plugin/theme hide methods and `remove_tenant_admin_menus()` use `get_effective_setting()` instead of reading the settings store directly, so filtered overrides take effect

v1.1.5

  • New: "Upgrade to Pro" admin page with a free-vs-Pro feature comparison and a call-to-action button, shown only when GrabWP Tenancy Pro is not active
  • New: Contextual Pro upsell cards across the tenant, settings, and status screens, plus an "Upgrade to Pro" link on the Plugins page and in the admin footer, all suppressed automatically once Pro is installed
  • Fix: load-helper.php is now loaded as a fallback during bootstrap when wp-config.php does not include load.php, preventing missing early-boot helpers
  • Fix: Status page no longer lists the same tenants.php, config.php, or tenant-aliases.php path twice when candidate locations resolve to the same file

v1.1.4

  • New: Performance & Security settings tab applies per-tenant constants: `DISABLE_WP_CRON`, XML-RPC off, `WP_POST_REVISIONS`, `EMPTY_TRASH_DAYS`, and `WP_HTTP_BLOCK_EXTERNAL` with a `WP_ACCESSIBLE_HOSTS` allowlist
  • New: Path routing prefix is configurable - `/site/{tenant-id}` becomes `/{prefix}/{tenant-id}` across rewrite rules, `.htaccess`, admin URLs, and the status page, via `GRABWP_TENANCY_PATH_PREFIX` (defaults to `site`)
  • New: Tenant URLs resolve Pro path aliases through `grabwp_tenancy_get_tenant_path_slug()`, so homepage and dashboard links use the alias when one is set
  • New: Status page warns about path confusion - duplicate `tenants.php`, `config.php`, or `tenant-aliases.php` copies, data directories inside `uploads/`, and directory constants hardcoded in `wp-config.php`
  • Enhance: Settings support integer and text values in addition to checkboxes, sanitized per type and written correctly to the settings file
  • Enhance: Settings screen split into tabs, with the active tab remembered between visits
  • Enhance: Base directory detection honors `GRABWP_WORDPRESS_CONTENT_DIR` and the `wp-content/grabwp-tenancy/tenants.php` location
  • Enhance: `.htaccess` rules and status checks accept alias slugs while still recognizing the legacy 6-character rule
  • Change: The SQLite integration plugin is hidden from plugin lists - activating or deactivating it breaks every SQLite-backed site
  • Fix: Duplicate "Settings saved successfully" notice on the settings page

v1.1.3

  • Enhance: Tenant detection now supports `GRABWP_TENANCY_TENANT_ID` env var for CLI boot without wp-config constants
  • Enhance: CLI tenant context auto-populates `HTTP_HOST` and `HTTPS` from tenant mappings when missing
  • Enhance: WP-CLI `$table_prefix` synchronization - file-scope global re-bind prevents stale prefix after eval
  • Enhance: CDN URL included in database export metadata when Pro storage is configured
  • Enhance: Tenant list table uses natural column widths for better extension compatibility
  • Enhance: Responsive CSS for tenant list on mobile screens
  • Fix: `UPLOADS` constant only defined when upload dir is inside ABSPATH, preventing path resolution errors on custom layouts
  • Fix: Server info cache can be reset via `grabwp_tenancy_reset_server_info_cache()` after environment changes

v1.1.2

  • Security: Replaced the file-based admin access token (a secret written to `tokens.php` and consumed via rename) with stateless HMAC-SHA256 tokens bound to the tenant ID, signed with `AUTH_KEY`/`AUTH_SALT` and given a short TTL (default 30 minutes, configurable via `GRABWP_TENANCY_TOKEN_TTL`). No token secret is persisted to disk anymore.
  • New: The clone "complete" screen now shows the target tenant ID with quick links to Edit tenant, Homepage, and Dashboard.
  • Enhance: Admin UI refactor - inline styles moved into a shared stylesheet (`admin/css/grabwp-admin-shared.css`) with utility classes; section show/hide now toggles a `hidden` class.
  • Change: Clone pipeline reordered - site URL replacement now runs before copying uploads.
  • Change: Installer removes legacy `tokens.php` / `.consumed` artifacts on activation; removed the now-unused `get_tokens_file_path()` helper.

v1.1.1

  • Security: Admin access tokens are now **single-use** - consumed atomically on first successful login; concurrent or replayed token requests are rejected.
  • Security: Domain hash validation is mandatory for admin token login; comparisons use timing-safe `hash_equals()`.
  • Security: Path-based admin URLs no longer expose `tenant_domain` in the query string; hash validation uses internal routing context instead.
  • Enhance: Added `GrabWP_Tenancy_Path_Manager::atomic_put_php_file()` for atomic writes of settings, tenant mappings, and admin token files (tmp + rename, ABSPATH guard, OpCache invalidation).
  • Fix: Tenant clone file copy now skips symlinks, preventing accidental duplication of shared plugin/theme directories.
  • Fix: WordPress cron requests again run in mainsite context (tenant detection disabled during `DOING_CRON`).

v1.1.0

  • Refactor: Split early-boot `load-helper.php` into focused modules (security, server detection, tenant detection, boot constants, cache) - same boot behavior, easier maintenance and extension.
  • Refactor: Extracted admin form handling, tenant CRUD, and domain validation into dedicated classes (`GrabWP_Tenancy_Admin_Form_Handler`, `GrabWP_Tenancy_Tenant_Crud`, `GrabWP_Tenancy_Domain_Validator`); public `handle_create_tenant()`, `handle_update_tenant()`, and `handle_delete_tenant()` methods remain for backward compatibility.
  • Refactor: Status page reorganized into tab partials with centralized environment checks via `GrabWP_Tenancy_Status_Checker` (General, Base Plugin, Pro Plugin tabs unchanged).
  • Fix: Settings page now shows the "Settings saved successfully." notice after saving (previously redirected but notice was never displayed).
  • Developer: All existing action hooks (`grabwp_tenancy_before_create_tenant`, `grabwp_tenancy_after_create_tenant`, etc.) preserved; no migration required.

v1.0.11

  • New: **Cache isolation for tenant context** - disables page-cache drop-ins per tenant request (`WP_CACHE`) and prefixes object-cache keys with the tenant ID (`WP_CACHE_KEY_SALT`) to prevent cross-tenant cache collisions on shared Redis/Memcached backends.
  • New: Added `grabwp_tenancy_get_tenant_url()` helper to resolve a tenant front-end URL by ID without loading a full tenant object.
  • Enhance: Centralized tenant URL resolution - `get_site_url()`, `get_admin_access_url()`, and static helpers (`resolve_site_url()`, `resolve_admin_url()`, `build_site_url()`) now handle domain-based and path-based routing in one place; tenant list and clone flows use these shared methods.
  • Enhance: Log messages are automatically prefixed with `[tenant_id]` or `[Mainsite]` for easier multi-tenant debugging.

v1.0.10

  • Fix: Tenant directory cleanup now handles symlinks safely during recursive deletion, removing only the symlink itself instead of following it into the original shared plugin or theme directory.
  • Enhance: Tested up to WordPress 7.0.

v1.0.9

  • Fix: Default tenant data directory moved from `wp-content/uploads/grabwp-tenancy` to `wp-content/grabwp-tenancy` (outside uploads) to prevent direct web access to tenant data. Existing installs that already use the uploads path are preserved automatically - no migration needed.
  • Fix: Corrected legacy-path migration notice in the Status page to use `WP_CONTENT_DIR` directly instead of `wp_upload_dir()`, matching the new default path.
  • Fix: Downgraded oversized "Clone to existing site" / "Clone to new site" hero buttons on the clone page to standard buttons for visual consistency.
  • Enhance: Plugin/theme admin bar nodes (`plugins`, `themes`) are now removed on tenant sites when the corresponding Hide Plugin Management / Hide Theme Management settings are enabled, closing a gap where the toolbar still exposed those links.
  • Enhance: Tenant create page UX - the first domain field is now auto-filled with a suggested domain (`tenant-{6digits}.{hostname}`); a new **Clear** button lets users wipe the field quickly; the domain input grows up to 500 px wide; and the domain section is visually indented under its radio button.
  • Enhance: GrabWP Tenancy admin menu position moved higher (position 3) so it appears near the top of the sidebar.
  • Change: Default values for **Hide Plugin Management** and **Hide Theme Management** settings changed from `true` to `false` for fresh installs, giving new tenants full access by default until explicitly restricted.

v1.0.8

  • New: **Tenant Cloning** - clone any existing tenant (or the mainsite) to a new tenant, including database tables and uploaded files with automatic URL replacement.
  • New: Added `GRABWP_MAINSITE_ID` constant (`__mainsite__`) to allow the main site to be used as a clone source.
  • Enhance: Mainsite domain detection now supports localhost and local-network domains that have no TLD extension (e.g., `mysite.local`, bare `localhost`).
  • Fix: Resolved plugin asset URL resolution on hosts where the plugin directory is symlinked - switched to `content_url()` to avoid incorrect absolute paths.
  • Fix: Refactored tenant ID generation to guarantee uniqueness and avoid collisions on busy installations.
  • Quality: Normalised all PHP source files from CRLF to LF line endings.

v1.0.7

  • Major: Introducing **Path-Based Routing**! You can now host tenants on subdirectories/paths (e.g., `example.com/site/abcdef`) without requiring separate domains. This completely eliminates the need for complex domain mappings and serves as a true, lightweight replacement for WordPress Multisite.
  • Enhance: Added comprehensive `.htaccess` diagnostic admin notices specifically tailored for path-based routing support.
  • Enhance: Centralized configuration and diagnostic tools into a transparent, read-only Status Page UI with manual fallback instructions for environment issues.
  • Refactor: Streamlined the installation, uninstallation, and environment-fixing processes into a single `GrabWP_Tenancy_Installer` class.
  • Security: Improved code compliance by integrating complete nonce verification on sensitive administrative handlers and securely transitioning to `wp_is_writable()`.
  • Fix: Resolved PHP fatal errors (e.g., `Class Not Found`) relating to the class autoloader sequence during the initial activation process.
  • Quality: Standardized codebase formatting for consistent line endings (CRLF to LF) and file encoding across all files.

v1.0.6

  • New: Dedicated **Status** admin page with system information, file structure, database config, content isolation, and domain routing details (moved out of Settings page)
  • New: One-click **Auto Install MU-Plugin** button with AJAX handler - auto-creates the must-use plugin file, or shows copy-to-clipboard fallback when the directory is not writable
  • New: One-click **Auto Install to wp-config.php** button with AJAX handler - injects the `load.php` require line before the stop-editing marker, or shows copy-to-clipboard fallback when `wp-config.php` is not writable
  • New: Admin notices for missing MU-plugin and missing `wp-config.php` loader, shown only on plugin pages, with writability-aware UI (auto-install vs. manual copy)
  • New: Pro Features section added to the plugin readme
  • Improved: Default tenant capability settings are now **enabled** (Disallow File Mods, Disallow File Edit, Hide Plugin Management, Hide Theme Management) for stronger security out of the box
  • Improved: Added fallback definition of `grabwp_tenancy_validate_tenant_id()` in Path Manager so validation works even when `load-helper.php` is not loaded
  • Improved: Tenant edit page title now displays the tenant ID for clarity
  • Improved: Moved AJAX nonces (`muPluginNonce`, `loaderNonce`) into localized admin script data
  • Improved: Refactored JS - extracted `bindCopyButton()` helper, added `initMuPluginInstall()` and `initLoaderInstall()` handlers in `grabwp-admin.js`
  • Improved: Streamlined `load-helper.php` base-dir resolution logic and added `GRABWP_TENANCY_DIRS_FROM_PLUGIN` constant
  • Improved: Renamed local variables in tenant views to use `grabwp_tenancy_` prefix to avoid potential conflicts
  • Improved: Tested up to WordPress 6.9

v1.0.5

  • New: Settings page for tenant capability controls (Disallow File Mods, Disallow File Edit, Hide Plugin Management, Hide Theme Management, Hide GrabWP Plugins)
  • Fix: Tenant ID starting with a number causes database errors on table prefix

v1.0.4

  • Enhance tenant management with a new list table for admin
  • Implement logging functionality, and improve tenant deletion process with confirmation prompts.
  • Refactor path management and database handling for better organization and security.
  • Update translations and enhance admin UI elements for improved user experience.
  • Refactor tenant initialization process to streamline functionality for tenant and main site.
  • Remove deprecated asset loading class and configuration management.
  • Enhance tenant context handling and improve upload directory management.
  • Introduce hooks for pro plugin extensibility and improve code organization for better maintainability.

v1.0.3

  • **Major Enhancement**: Added comprehensive early loading system with load-helper.php
  • **Security Improvements**: Enhanced input sanitization and validation functions for early loading
  • **Path Management**: Introduced centralized Path Manager with backward compatibility support
  • **WordPress Compliance**: Improved path structure with fallback to WordPress-compliant uploads directory
  • **CLI Support**: Added command-line interface support for tenant operations
  • **Performance**: Optimized tenant detection with caching and reduced file system calls
  • **Backward Compatibility**: Maintained support for existing wp-content/grabwp structure

v1.0.2

  • Improved tenant management interface
  • Direct login button to tenant from main site admin (If plugin also activated on tenant)
  • No longer access to plugin admin page and menu from tenant's admin dashboard

v1.0.1

  • Refactored core plugin for improved tenant management and protocol handling
  • Added admin notice registration for better user feedback in the admin area
  • Defined GRABWP_TENANCY_LOADED constant for reliable plugin load detection
  • Added translation support by loading the plugin text domain on initialization
  • Added Vietnamese language support

v1.0.0

  • Initial release
  • Basic multi-tenant functionality
  • Domain-based routing
  • Admin interface for tenant management
  • Shared MySQL with tenant prefixes
  • Separated upload directories