7 Commits

3 changed files with 532 additions and 820 deletions

205
README.md Normal file
View File

@ -0,0 +1,205 @@
# WP Multisite WaaS
<p align="center">
<img src="https://raw.githubusercontent.com/wpallstars/wp-multisite-waas/main/assets/images/logo.png" alt="WP Multisite WaaS Logo" width="300">
</p>
<p align="center">
<strong>The Complete Network Solution for transforming your WordPress Multisite into a Website as a Service (WaaS) platform.</strong>
</p>
<p align="center">
<a href="http://www.gnu.org/licenses/gpl-2.0.html"><img src="https://img.shields.io/badge/License-GPL%20v2-blue.svg" alt="License: GPL v2"></a>
<a href="https://wordpress.org/"><img src="https://img.shields.io/badge/WordPress-6.7.1%20Tested-green.svg" alt="WordPress: 6.7.1 Tested"></a>
<a href="https://php.net/"><img src="https://img.shields.io/badge/PHP-7.4.30%2B-purple.svg" alt="PHP: 7.4.30+"></a>
<a href="https://github.com/superdav42/wp-multisite-waas/releases"><img src="https://img.shields.io/github/v/release/superdav42/wp-multisite-waas" alt="Latest Release"></a>
</p>
## 🌟 Overview
**WP Multisite WaaS** helps you transform your WordPress Multisite installation into a powerful Website as a Service (WaaS) platform. This plugin enables you to offer website creation, hosting, and management services to your customers through a streamlined interface.
This plugin was formerly known as WP Ultimo and is now community maintained.
## ✨ Key Features
- **Site Creation** - Allow customers to create their own sites in your network
- **Domain Mapping** - Support for custom domains with automated DNS verification
- **Payment Processing** - Integrations with popular payment gateways like Stripe and PayPal
- **Plan Management** - Create and manage subscription plans with different features and limitations
- **Template Sites** - Easily clone and use template sites for new customer websites
- **Customer Dashboard** - Provide a professional management interface for your customers
- **White Labeling** - Brand the platform as your own
- **Hosting Integrations** - Connect with popular hosting control panels like cPanel, RunCloud, and more
## 📋 Requirements
- WordPress Multisite 5.3 or higher
- PHP 7.4.30 or higher
- MySQL 5.6 or higher
- HTTPS enabled (recommended for secure checkout)
## 🔧 Installation
There are two recommended ways to install WP Multisite WaaS:
### Method 1: Using the pre-packaged release (Recommended)
1. Download the latest release ZIP from the [Releases page](https://github.com/superdav42/wp-multisite-waas/releases)
2. Log in to your WordPress Network Admin dashboard
3. Navigate to Plugins > Add New > Upload Plugin
4. Choose the downloaded ZIP file and click "Install Now"
5. Network Activate the plugin through the 'Plugins' menu in WordPress
6. Follow the step-by-step Wizard to set the plugin up
### Method 2: Using Git and Composer (For developers)
This method requires command-line access to your server and familiarity with Git and Composer.
1. Clone the repository to your plugins directory:
```bash
cd wp-content/plugins/
git clone https://github.com/superdav42/wp-multisite-waas.git
cd wp-multisite-waas
```
2. Install the required dependencies using Composer:
```bash
composer install
```
3. Network Activate the plugin in your WordPress Network Admin dashboard
4. Follow the setup wizard to complete the installation
## 🔍 Common Installation Issues
<details>
<summary><strong>"Failed opening required [...]/vendor/autoload_packages.php"</strong></summary>
<p>This error occurs when the required vendor files are missing. This typically happens when:</p>
<ul>
<li>You've downloaded the repository directly from GitHub without using a release package</li>
<li>The composer dependencies haven't been installed</li>
</ul>
<p><strong>Solution:</strong> Use the pre-packaged release from the <a href="https://github.com/superdav42/wp-multisite-waas/releases">Releases page</a> or run <code>composer install</code> in the plugin directory.</p>
</details>
<details>
<summary><strong>"Cannot declare class ComposerAutoloaderInitWPUltimoDependencies, because the name is already in use"</strong></summary>
<p>This error usually occurs when updating from an older version of WP Ultimo or when multiple versions of the plugin are installed.</p>
<p><strong>Solution:</strong> Deactivate and remove any older versions of WP Ultimo or WP Multisite WaaS before activating the new version.</p>
</details>
<details>
<summary><strong>"Class 'WP_Ultimo\Database\Sites\Site_Query' not found"</strong></summary>
<p>This error can occur if the plugin's autoloader isn't properly loading all the necessary classes.</p>
<p><strong>Solution:</strong> Use the pre-packaged release from the <a href="https://github.com/superdav42/wp-multisite-waas/releases">Releases page</a> which includes all required files.</p>
</details>
## 🚀 Contributing
We welcome contributions to WP Multisite WaaS! Here's how you can contribute effectively:
### Development Workflow
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Run `npm install` and `composer install` to set up dependencies
4. Make your changes
5. Before committing, run `npm run build` to:
- Generate translation POT files
- Minify CSS and JS assets
- Process and optimize other assets
6. **Important:** Update both README.md and readme.txt files when making changes that affect:
- Version numbers
- Required WordPress/PHP versions
- Feature additions or changes
- Installation instructions
- Documentation
- Changelog entries
7. Commit your changes (`git commit -m 'Add some amazing feature'`)
8. Push to the branch (`git push origin feature/amazing-feature`)
9. Open a Pull Request
### Pull Request Guidelines
When submitting pull requests, please:
1. Include a clear description of the changes and their purpose
2. Reference any related issues using GitHub's issue linking syntax (#123)
3. Ensure your code follows the existing style and conventions
4. Include screenshots or GIFs for UI changes if applicable
5. Make sure all tests pass (if available)
6. Update documentation as needed
7. Verify that both README.md and readme.txt are updated and synchronized
### Release Process
Releases are automated using GitHub Actions workflows that trigger when a version tag is pushed.
**Tagging Convention:** To trigger a new release build, push a tag following the semantic versioning format:
```bash
git tag v2.3.5 # For example, for version 2.3.5
git push origin v2.3.5
```
The tag must begin with "v" followed by the version number (v*.*.*)
This will automatically:
1. Build the plugin (run `npm run build`)
2. Create a properly packaged ZIP file
3. Create a GitHub release with the ZIP attached
When preparing for a release:
1. Update the version number in the main plugin file and readme.txt
2. Update the changelog in readme.txt
3. Ensure README.md and readme.txt are synchronized with the latest information
4. Create and push the appropriate version tag
## 🆘 Support
For support, please open an issue on the [GitHub repository](https://github.com/superdav42/wp-multisite-waas/issues).
## ⚠️ Upgrade Notice
We recommend running this in a staging environment before updating your production environment.
## 📝 Recent Changes
### Version [2.3.4] - Released on 2024-01-31
- Fixed: Unable to checkout with any payment gateway
- Fixed: Warning Undefined global variable $pagenow
### Version [2.3.3] - Released on 2024-01-29
- Improved: Plugin renamed to WP Multisite WaaS
- Removed: Enforcement of paid license
- Fixed: Incompatibilities with WordPress 6.7 and i18n timing
- Improved: Reduced plugin size by removing many unnecessary files and shrinking images
For the complete changelog, please see [readme.txt](readme.txt).
## 👥 Contributors
WP Multisite WaaS is an open-source project with contributions from:
- [aanduque](https://github.com/aanduque)
- [superdav42](https://github.com/superdav42)
- [And the community](https://github.com/superdav42/wp-multisite-waas/graphs/contributors)
## 📄 License
WP Multisite WaaS is licensed under the GPL v2 or later.
Copyright © 2024 [WP Multisite WaaS Contributors](https://github.com/superdav42/wp-multisite-waas/graphs/contributors)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2, as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

138
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "aa95a1b59acc93d92d18448d166a5f0e",
"content-hash": "c27fa56bfcbf860f1ae2a70ef5153e7a",
"packages": [
{
"name": "amphp/amp",
@ -97,16 +97,16 @@
},
{
"name": "automattic/jetpack-autoloader",
"version": "v5.0.6",
"version": "v5.0.1",
"source": {
"type": "git",
"url": "https://github.com/Automattic/jetpack-autoloader.git",
"reference": "5d533e1ff64ed0107b3b46928705fbfa8d3cdb1b"
"reference": "ba3f5146426367c718312a0da87ebd596ed9cf33"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Automattic/jetpack-autoloader/zipball/5d533e1ff64ed0107b3b46928705fbfa8d3cdb1b",
"reference": "5d533e1ff64ed0107b3b46928705fbfa8d3cdb1b",
"url": "https://api.github.com/repos/Automattic/jetpack-autoloader/zipball/ba3f5146426367c718312a0da87ebd596ed9cf33",
"reference": "ba3f5146426367c718312a0da87ebd596ed9cf33",
"shasum": ""
},
"require": {
@ -114,10 +114,9 @@
"php": ">=7.2"
},
"require-dev": {
"automattic/jetpack-changelogger": "^6.0.3",
"automattic/phpunit-select-config": "^1.0.2",
"automattic/jetpack-changelogger": "^5.1.0",
"composer/composer": "^2.2",
"yoast/phpunit-polyfills": "^3.0.0"
"yoast/phpunit-polyfills": "^1.1.1"
},
"type": "composer-plugin",
"extra": {
@ -156,9 +155,9 @@
"wordpress"
],
"support": {
"source": "https://github.com/Automattic/jetpack-autoloader/tree/v5.0.6"
"source": "https://github.com/Automattic/jetpack-autoloader/tree/v5.0.1"
},
"time": "2025-03-31T17:43:05+00:00"
"time": "2025-01-20T16:46:39+00:00"
},
{
"name": "berlindb/core",
@ -371,16 +370,16 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "7.9.3",
"version": "7.9.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77"
"reference": "d281ed313b989f213357e3be1a179f02196ac99b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
"reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
"reference": "d281ed313b989f213357e3be1a179f02196ac99b",
"shasum": ""
},
"require": {
@ -477,7 +476,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.9.3"
"source": "https://github.com/guzzle/guzzle/tree/7.9.2"
},
"funding": [
{
@ -493,7 +492,7 @@
"type": "tidelift"
}
],
"time": "2025-03-27T13:37:11+00:00"
"time": "2024-07-24T11:22:20+00:00"
},
{
"name": "guzzlehttp/promises",
@ -576,16 +575,16 @@
},
{
"name": "guzzlehttp/psr7",
"version": "2.7.1",
"version": "2.7.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
"reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"shasum": ""
},
"require": {
@ -672,7 +671,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.7.1"
"source": "https://github.com/guzzle/psr7/tree/2.7.0"
},
"funding": [
{
@ -688,7 +687,7 @@
"type": "tidelift"
}
],
"time": "2025-03-27T12:30:47+00:00"
"time": "2024-07-18T11:15:46+00:00"
},
{
"name": "hashids/hashids",
@ -1152,16 +1151,16 @@
},
{
"name": "myclabs/deep-copy",
"version": "1.13.0",
"version": "1.12.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "024473a478be9df5fdaca2c793f2232fe788e414"
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414",
"reference": "024473a478be9df5fdaca2c793f2232fe788e414",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
"shasum": ""
},
"require": {
@ -1200,7 +1199,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.13.0"
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
},
"funding": [
{
@ -1208,7 +1207,7 @@
"type": "tidelift"
}
],
"time": "2025-02-12T12:17:51+00:00"
"time": "2024-11-08T17:47:46+00:00"
},
{
"name": "nyholm/psr7",
@ -1515,16 +1514,16 @@
},
{
"name": "phpstan/phpdoc-parser",
"version": "2.1.0",
"version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68"
"reference": "c00d78fb6b29658347f9d37ebe104bffadf36299"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
"reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299",
"reference": "c00d78fb6b29658347f9d37ebe104bffadf36299",
"shasum": ""
},
"require": {
@ -1556,9 +1555,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0"
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0"
},
"time": "2025-02-19T13:28:12+00:00"
"time": "2024-10-13T11:29:49+00:00"
},
{
"name": "psr/cache",
@ -4171,12 +4170,12 @@
"source": {
"type": "git",
"url": "https://github.com/php-stubs/wordpress-stubs.git",
"reference": "c04f96cb232fab12a3cbcccf5a47767f0665c3f4"
"reference": "27f32faacb65a1230d9dac09f1b6c5ce78a6e61a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/c04f96cb232fab12a3cbcccf5a47767f0665c3f4",
"reference": "c04f96cb232fab12a3cbcccf5a47767f0665c3f4",
"url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/27f32faacb65a1230d9dac09f1b6c5ce78a6e61a",
"reference": "27f32faacb65a1230d9dac09f1b6c5ce78a6e61a",
"shasum": ""
},
"require-dev": {
@ -4211,7 +4210,7 @@
"issues": "https://github.com/php-stubs/wordpress-stubs/issues",
"source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.7.2"
},
"time": "2025-02-12T04:51:58+00:00"
"time": "2025-02-05T17:57:54+00:00"
},
{
"name": "phpcompatibility/php-compatibility",
@ -4633,16 +4632,16 @@
},
{
"name": "phpstan/phpstan",
"version": "2.1.11",
"version": "2.1.3",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "8ca5f79a8f63c49b2359065832a654e1ec70ac30"
"reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/8ca5f79a8f63c49b2359065832a654e1ec70ac30",
"reference": "8ca5f79a8f63c49b2359065832a654e1ec70ac30",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/64ae44e48214f3deebdaeebf2694297a10a2bea9",
"reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9",
"shasum": ""
},
"require": {
@ -4687,7 +4686,7 @@
"type": "github"
}
],
"time": "2025-03-24T13:45:00+00:00"
"time": "2025-02-07T15:05:24+00:00"
},
{
"name": "phpunit/php-code-coverage",
@ -5113,21 +5112,21 @@
},
{
"name": "rector/rector",
"version": "2.0.11",
"version": "2.0.8",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
"reference": "059b827cc648929711606e9824337e41e2f9ed92"
"reference": "3c70238bc677eb98866000a05b19a34f12955954"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/059b827cc648929711606e9824337e41e2f9ed92",
"reference": "059b827cc648929711606e9824337e41e2f9ed92",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/3c70238bc677eb98866000a05b19a34f12955954",
"reference": "3c70238bc677eb98866000a05b19a34f12955954",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
"phpstan/phpstan": "^2.1.9"
"phpstan/phpstan": "^2.1.2"
},
"conflict": {
"rector/rector-doctrine": "*",
@ -5160,7 +5159,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
"source": "https://github.com/rectorphp/rector/tree/2.0.11"
"source": "https://github.com/rectorphp/rector/tree/2.0.8"
},
"funding": [
{
@ -5168,7 +5167,7 @@
"type": "github"
}
],
"time": "2025-03-28T10:25:17+00:00"
"time": "2025-02-06T14:02:49+00:00"
},
{
"name": "sebastian/cli-parser",
@ -6135,16 +6134,16 @@
},
{
"name": "squizlabs/php_codesniffer",
"version": "3.12.1",
"version": "3.11.3",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
"reference": "ea16a1f3719783345febd3aab41beb55c8c84bfd"
"reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ea16a1f3719783345febd3aab41beb55c8c84bfd",
"reference": "ea16a1f3719783345febd3aab41beb55c8c84bfd",
"url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10",
"reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10",
"shasum": ""
},
"require": {
@ -6211,24 +6210,24 @@
"type": "open_collective"
},
{
"url": "https://thanks.dev/u/gh/phpcsstandards",
"url": "https://thanks.dev/phpcsstandards",
"type": "thanks_dev"
}
],
"time": "2025-04-04T12:57:55+00:00"
"time": "2025-01-23T17:04:15+00:00"
},
{
"name": "symplify/vendor-patches",
"version": "11.4.1",
"version": "11.3.7",
"source": {
"type": "git",
"url": "https://github.com/symplify/vendor-patches.git",
"reference": "085a3a3e456e4d2d9a6b4fe02e86f92ce5b1fe35"
"reference": "dec8ec588192a3ee0d886288395b5cd6a768126e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symplify/vendor-patches/zipball/085a3a3e456e4d2d9a6b4fe02e86f92ce5b1fe35",
"reference": "085a3a3e456e4d2d9a6b4fe02e86f92ce5b1fe35",
"url": "https://api.github.com/repos/symplify/vendor-patches/zipball/dec8ec588192a3ee0d886288395b5cd6a768126e",
"reference": "dec8ec588192a3ee0d886288395b5cd6a768126e",
"shasum": ""
},
"require": {
@ -6246,7 +6245,7 @@
"description": "Generate vendor patches for packages with single command",
"support": {
"issues": "https://github.com/symplify/vendor-patches/issues",
"source": "https://github.com/symplify/vendor-patches/tree/11.4.1"
"source": "https://github.com/symplify/vendor-patches/tree/11.3.7"
},
"funding": [
{
@ -6258,7 +6257,7 @@
"type": "github"
}
],
"time": "2025-02-18T08:19:39+00:00"
"time": "2024-01-23T17:12:30+00:00"
},
{
"name": "szepeviktor/phpstan-wordpress",
@ -6479,16 +6478,16 @@
},
{
"name": "yoast/phpunit-polyfills",
"version": "1.1.4",
"version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/Yoast/PHPUnit-Polyfills.git",
"reference": "e6faedf5e34cea4438e341f660e2f719760c531d"
"reference": "0b31ce834facf03b8b44b6587e65b3cf1d7cfb94"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/e6faedf5e34cea4438e341f660e2f719760c531d",
"reference": "e6faedf5e34cea4438e341f660e2f719760c531d",
"url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/0b31ce834facf03b8b44b6587e65b3cf1d7cfb94",
"reference": "0b31ce834facf03b8b44b6587e65b3cf1d7cfb94",
"shasum": ""
},
"require": {
@ -6503,7 +6502,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "4.x-dev"
"dev-main": "3.x-dev"
}
},
"autoload": {
@ -6538,7 +6537,7 @@
"security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy",
"source": "https://github.com/Yoast/PHPUnit-Polyfills"
},
"time": "2025-02-09T18:13:44+00:00"
"time": "2025-01-08T16:58:34+00:00"
}
],
"aliases": [],
@ -6551,8 +6550,7 @@
"prefer-lowest": false,
"platform": {
"php": ">=7.4.1",
"ext-json": "*",
"ext-curl": "*"
"ext-json": "*"
},
"platform-dev": {},
"platform-overrides": {

1009
readme.txt

File diff suppressed because it is too large Load Diff