1 Commits

3 changed files with 308 additions and 10 deletions

View File

@ -0,0 +1,189 @@
<?php
/**
* Handles the SUNRISE constant check and notifications.
*
* @package WP_Ultimo
* @subpackage Admin
* @since 2.0.0
*/
namespace WP_Ultimo\Admin;
use WP_Ultimo\Helpers\WP_Config;
// Exit if accessed directly
defined('ABSPATH') || exit;
/**
* Handles the SUNRISE constant check and notifications.
*
* @since 2.0.0
*/
class Sunrise_Admin_Notice {
/**
* Singleton trait.
*/
use \WP_Ultimo\Traits\Singleton;
/**
* Initializes the class.
*
* @since 2.0.0
* @return void
*/
public function init() {
// Only show this in the network admin
if (!is_network_admin()) {
return;
}
// Add the admin notice
add_action('network_admin_notices', array($this, 'check_sunrise_constant'));
// Handle the AJAX request to update wp-config.php
add_action('wp_ajax_wu_update_sunrise_constant', array($this, 'handle_update_sunrise_constant'));
}
/**
* Checks if the SUNRISE constant is defined and shows a notice if not.
*
* @since 2.0.0
* @return void
*/
public function check_sunrise_constant() {
// Check if SUNRISE is defined and true
if (defined('SUNRISE') && SUNRISE === true) {
return;
}
// Check if we can write to wp-config.php
$wp_config_path = WP_Config::get_instance()->get_wp_config_path();
$can_write = is_writable($wp_config_path);
?>
<div class="notice notice-error is-dismissible">
<h3 style="margin-top: 0.5em;"><?php _e('Domain Mapping Not Active', 'wp-ultimo'); ?></h3>
<p>
<?php _e('WP Multisite WaaS domain mapping requires the <code>SUNRISE</code> constant to be defined and set to <code>true</code> in your wp-config.php file.', 'wp-ultimo'); ?>
<?php _e('Without this setting, domain mapping will not work correctly.', 'wp-ultimo'); ?>
</p>
<?php if ($can_write) : ?>
<p>
<button id="wu-update-sunrise-constant" class="button button-primary">
<?php _e('Add SUNRISE Constant to wp-config.php', 'wp-ultimo'); ?>
</button>
<span id="wu-sunrise-spinner" class="spinner" style="float: none; margin-top: 0;"></span>
<span id="wu-sunrise-message" style="display: none; margin-left: 10px;"></span>
</p>
<script>
jQuery(document).ready(function($) {
$('#wu-update-sunrise-constant').on('click', function(e) {
e.preventDefault();
var $button = $(this);
var $spinner = $('#wu-sunrise-spinner');
var $message = $('#wu-sunrise-message');
$button.prop('disabled', true);
$spinner.addClass('is-active');
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'wu_update_sunrise_constant',
nonce: '<?php echo wp_create_nonce('wu_update_sunrise_constant'); ?>'
},
success: function(response) {
$spinner.removeClass('is-active');
if (response.success) {
$message.html(response.data.message).css('color', 'green').show();
setTimeout(function() {
window.location.reload();
}, 1500);
} else {
$button.prop('disabled', false);
$message.html(response.data.message).css('color', 'red').show();
}
},
error: function() {
$button.prop('disabled', false);
$spinner.removeClass('is-active');
$message.html('<?php _e('An unknown error occurred.', 'wp-ultimo'); ?>').css('color', 'red').show();
}
});
});
});
</script>
<?php else : ?>
<p>
<?php _e('We cannot automatically update your wp-config.php file as it is not writable.', 'wp-ultimo'); ?>
<?php _e('Please add the following line to your wp-config.php file:', 'wp-ultimo'); ?>
</p>
<p>
<code style="display: block; padding: 10px; background: #f0f0f1; margin-bottom: 10px;">define('SUNRISE', true);</code>
</p>
<p>
<?php printf(
__('This line should be added right after the line with <code>%s</code>.', 'wp-ultimo'),
'$table_prefix'
); ?>
<?php _e('After adding this line, please refresh this page.', 'wp-ultimo'); ?>
</p>
<?php endif; ?>
</div>
<?php
}
/**
* Handles the AJAX request to update wp-config.php.
*
* @since 2.0.0
* @return void
*/
public function handle_update_sunrise_constant() {
// Check nonce
if (!check_ajax_referer('wu_update_sunrise_constant', 'nonce', false)) {
wp_send_json_error(array(
'message' => __('Security check failed.', 'wp-ultimo')
));
return;
}
// Check if SUNRISE is already defined
if (defined('SUNRISE') && SUNRISE === true) {
wp_send_json_success(array(
'message' => __('SUNRISE constant is already defined.', 'wp-ultimo')
));
return;
}
// Try to update wp-config.php
$result = WP_Config::get_instance()->inject_wp_config_constant('SUNRISE', true);
if (is_wp_error($result)) {
wp_send_json_error(array(
'message' => $result->get_error_message()
));
return;
}
if ($result === false) {
wp_send_json_error(array(
'message' => __('Failed to update wp-config.php. Try adding the constant manually.', 'wp-ultimo')
));
return;
}
wp_send_json_success(array(
'message' => __('SUNRISE constant added successfully! Reloading...', 'wp-ultimo')
));
}
}

View File

@ -39,6 +39,41 @@ class Domain_Mapping {
*/ */
public $original_url = null; public $original_url = null;
/**
* Initializes the Domain Mapping Class
*
* @since 2.0.0
*/
public function __construct() {
if ( ! \WP_Ultimo\Sunrise::should_startup()) {
return;
}
// Make sure we got loaded in the sunrise stage.
add_filter('pre_get_site_by_path', array($this, 'pre_get_site_by_path'), 10, 4);
add_action('template_redirect', array($this, 'disable_canonical_redirect'), 1);
add_filter('network_site_url', array($this, 'network_site_url'), 10, 3);
add_action('admin_init', array($this, 'load_sunrise_notification'));
}
/**
* Load the SUNRISE constant check and notification.
*
* @since 2.0.0
* @return void
*/
public function load_sunrise_notification() {
if (is_network_admin()) {
require_once wu_path('inc/admin/class-sunrise-admin-notice.php');
\WP_Ultimo\Admin\Sunrise_Admin_Notice::get_instance()->init();
}
}
/** /**
* Runs on singleton instantiation. * Runs on singleton instantiation.
* *

View File

@ -6,19 +6,93 @@ License: GPLv2
License URI: http://www.gnu.org/licenses/gpl-2.0.html License URI: http://www.gnu.org/licenses/gpl-2.0.html
Contributors: aanduque, superdav42 Contributors: aanduque, superdav42
The Complete Network Solution. The Complete Network Solution for transforming your WordPress Multisite into a Website as a Service (WaaS) platform.
== Description == == Description ==
WP Multisite WaaS 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.
The WordPress Multisite Website as a Service (Waas) plugin. Now community maintained. Now community maintained.
== Installation == == Installation ==
1. Upload 'wp-multisite-waas' to the '/wp-content/plugins/' directory There are two recommended ways to install WP Multisite WaaS:
2. Activate the plugin through the 'Plugins' menu in WordPress
3. Follow the step by step Wizard to set the plugin up = 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:
```
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:
```
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 =
**"Failed opening required [...]/vendor/autoload_packages.php"**
This error occurs when the required vendor files are missing. This typically happens when:
- You've downloaded the repository directly from GitHub without using a release package
- The composer dependencies haven't been installed
Solution: Use the pre-packaged release from the [Releases page](https://github.com/superdav42/wp-multisite-waas/releases) or run `composer install` in the plugin directory.
**"Cannot declare class ComposerAutoloaderInitWPUltimoDependencies, because the name is already in use"**
This error usually occurs when updating from an older version of WP Ultimo or when multiple versions of the plugin are installed.
Solution: Deactivate and remove any older versions of WP Ultimo or WP Multisite WaaS before activating the new version.
**"Class 'WP_Ultimo\Database\Sites\Site_Query' not found"**
This error can occur if the plugin's autoloader isn't properly loading all the necessary classes.
Solution: Use the pre-packaged release from the [Releases page](https://github.com/superdav42/wp-multisite-waas/releases) which includes all required files.
= Domain Mapping Requirements =
For domain mapping functionality to work properly, you must have the `SUNRISE` constant defined in your wp-config.php file:
1. Open your wp-config.php file (located in your WordPress root directory)
2. Add the following line after the `$table_prefix` line:
```php
define('SUNRISE', true);
```
3. Save the file
If you don't add this constant, all mapped domains will redirect to your main site instead of the correct subsite.
The plugin will display a notification in the Network Admin dashboard if the `SUNRISE` constant is not defined, with an option to add it automatically if your wp-config.php file is writable.
== Requirements ==
- WordPress Multisite 5.3 or higher
- PHP 7.4.30 or higher
- MySQL 5.6 or higher
- HTTPS enabled (recommended for secure checkout)
== Support ==
For support, please open an issue on the [GitHub repository](https://github.com/superdav42/wp-multisite-waas/issues).
== Upgrade Notice == == Upgrade Notice ==
@ -384,7 +458,7 @@ Version 2.0.20 - Released on 2022-09-30
* Added: Security mode to deactivate all plugins except WP Ultimo and mu-plugins at once and reactivate after disable; * Added: Security mode to deactivate all plugins except WP Ultimo and mu-plugins at once and reactivate after disable;
* Added: Allow customers to update the membership to plans and variations with different periods; * Added: Allow customers to update the membership to plans and variations with different periods;
* Added: Allow customers to select one of their sites when creating a new one; * Added: Allow customers to select one of their sites when creating a new one;
* Added: Error message when customers access the add user page over users limit; * Added: Error message when customers access the "add user" page over users limit;
* Added: wu_return_url filter, allowing custom redirections after checkout process; * Added: wu_return_url filter, allowing custom redirections after checkout process;
* Improvement: New payments from manual gateway are now generated by current membership; * Improvement: New payments from manual gateway are now generated by current membership;
* Improvement: Elementor compatibility on mapped sites; * Improvement: Elementor compatibility on mapped sites;
@ -463,8 +537,8 @@ Version 2.0.15 - Released on 2022-06-15
* Added: Currency Saudi Riyal * Added: Currency Saudi Riyal
* Improvement: Removes unlisted countries from the billing address checkout field when using the "Restrict by country" option; * Improvement: Removes unlisted countries from the billing address checkout field when using the "Restrict by country" option;
* Improvement: Disables the "Restrict by country" toggle when saving the form without allowed countries; * Improvement: Disables the "Restrict by country" toggle when saving the form without allowed countries;
* Improvement: Improves the addition of billing address fields by allowing the removal of fields through the wu_billing_address_fields filter and avoiding error in the use of this filter; * Improvement: Improves the addition of billing address fields by allowing the removal of fields through the "wu_billing_address_fields" filter and avoiding error in the use of this filter;
* Improvement: Checks if payment status is completed when building the cart to prevent error with Ultimo defining the cart as retry; * Improvement: Checks if payment status is completed when building the cart to prevent error with Ultimo defining the cart as "retry";
* Improvement: Verifies if the cart has a future value to be paid to better handle downgrades; * Improvement: Verifies if the cart has a future value to be paid to better handle downgrades;
* Improvement: Checks if subscription is not already cancelled on Stripe and Stripe Checkout gateways before trying to cancel; * Improvement: Checks if subscription is not already cancelled on Stripe and Stripe Checkout gateways before trying to cancel;
* Improvement: Improvement: Changes stripe.js handlers to better code readability and to follow Stripe recommendations; * Improvement: Improvement: Changes stripe.js handlers to better code readability and to follow Stripe recommendations;
@ -485,7 +559,7 @@ Version 2.0.15 - Released on 2022-06-15
* Fix: SSO not working on wp-admin page with mapped domains; * Fix: SSO not working on wp-admin page with mapped domains;
* Fix: Stripe saved cards not working; * Fix: Stripe saved cards not working;
* Fix: Downgrade cart not being correctly built when new plan is not free; * Fix: Downgrade cart not being correctly built when new plan is not free;
* Fix: Correctly define a cart as retry and postpone the payment verification when building it to prevent some errors on checkout validation process; * Fix: Correctly define a cart as "retry" and postpone the payment verification when building it to prevent some errors on checkout validation process;
* Fix: Get the enable multiple membership value config from settings value; * Fix: Get the enable multiple membership value config from settings value;
* Fix: Allow updates with current plan on trial period; * Fix: Allow updates with current plan on trial period;
* Fix: Stripe Checkout gateway id with wrong value on get_or_create_customer method; * Fix: Stripe Checkout gateway id with wrong value on get_or_create_customer method;