Files
wp-multisite-waas/inc/limits/class-site-template-limits.php
2025-02-08 13:57:32 -07:00

185 lines
5.1 KiB
PHP

<?php
/**
* Handles limitations to disk space
*
* @todo We need to move posts on downgrade.
* @package WP_Ultimo
* @subpackage Limits
* @since 2.0.0
*/
namespace WP_Ultimo\Limits;
use WP_Ultimo\Checkout\Checkout;
// Exit if accessed directly
defined('ABSPATH') || exit;
/**
* Handles limitations to post types, uploads and more.
*
* @since 2.0.0
*/
class Site_Template_Limits {
use \WP_Ultimo\Traits\Singleton;
/**
* Runs on the first and only instantiation.
*
* @since 2.0.0
* @return void
*/
public function init(): void {
add_action('plugins_loaded', [$this, 'setup']);
}
/**
* Sets up the hooks and checks.
*
* @since 2.0.0
* @return void
*/
public function setup(): void {
add_filter('wu_template_selection_render_attributes', [$this, 'maybe_filter_template_selection_options']);
add_filter('wu_checkout_template_id', [$this, 'maybe_force_template_selection'], 10, 2);
add_filter('wu_cart_get_extra_params', [$this, 'maybe_force_template_selection_on_cart'], 10, 2);
}
/**
* Maybe filter the template selection options on the template selection field.
*
* @since 2.0.0
*
* @param array $attributes The template rendering attributes.
* @return array
*/
public function maybe_filter_template_selection_options($attributes) {
$attributes['should_display'] = true;
$products = array_map('wu_get_product', wu_get_isset($attributes, 'products', []));
$products = array_filter($products);
if ( ! empty($products)) {
$limits = new \WP_Ultimo\Objects\Limitations();
[$plan, $additional_products] = wu_segregate_products($products);
$products = array_merge([$plan], $additional_products);
foreach ($products as $product) {
$limits = $limits->merge($product->get_limitations());
}
if ($limits->site_templates->get_mode() === 'default') {
$attributes['sites'] = wu_get_isset($attributes, 'sites', explode(',', ($attributes['template_selection_sites'] ?? '')));
return $attributes;
} elseif ($limits->site_templates->get_mode() === 'assign_template') {
$attributes['should_display'] = false;
} else {
$site_list = wu_get_isset($attributes, 'sites', explode(',', ($attributes['template_selection_sites'] ?? '')));
$available_templates = $limits->site_templates->get_available_site_templates();
$attributes['sites'] = array_intersect($site_list, $available_templates);
}
}
return $attributes;
}
/**
* Decides if we need to force the selection of a given template during the site creation.
*
* @since 2.0.0
*
* @param int $template_id The current template id.
* @param \WP_Ultimo\Models\Membership $membership The membership object.
* @return int
*/
public function maybe_force_template_selection($template_id, $membership) {
if ($membership && $membership->get_limitations()->site_templates->get_mode() === 'assign_template') {
$template_id = $membership->get_limitations()->site_templates->get_pre_selected_site_template();
}
return $template_id;
}
/**
* Pre-selects a given template on the checkout screen depending on permissions.
*
* @since 2.0.0
*
* @param array $extra List if extra elements.
* @param \WP_Ultimo\Checkout\Cart $cart The cart object.
* @return array
*/
public function maybe_force_template_selection_on_cart($extra, $cart) {
$limits = new \WP_Ultimo\Objects\Limitations();
$products = $cart->get_all_products();
[$plan, $additional_products] = wu_segregate_products($products);
$products = array_merge([$plan], $additional_products);
$products = array_filter($products);
foreach ($products as $product) {
$limits = $limits->merge($product->get_limitations());
}
if ($limits->site_templates->get_mode() === 'assign_template') {
$extra['template_id'] = $limits->site_templates->get_pre_selected_site_template();
} elseif ($limits->site_templates->get_mode() === 'choose_available_templates') {
$template_id = Checkout::get_instance()->request_or_session('template_id');
$extra['template_id'] = $this->is_template_available($products, $template_id) ? $template_id : false;
}
return $extra;
}
/**
* Check if site template is available in current limits
*
* @param array $products the list of products to check for limit.
* @param int $template_id the site template id.
* @return boolean
*/
protected function is_template_available($products, $template_id) {
$template_id = (int) $template_id;
if ( ! empty($products)) {
$limits = new \WP_Ultimo\Objects\Limitations();
[$plan, $additional_products] = wu_segregate_products($products);
$products = array_merge([$plan], $additional_products);
foreach ($products as $product) {
$limits = $limits->merge($product->get_limitations());
}
if ($limits->site_templates->get_mode() === 'assign_template') {
return $limits->site_templates->get_pre_selected_site_template() === $template_id;
} else {
$available_templates = $limits->site_templates->get_available_site_templates();
return in_array($template_id, $available_templates, true);
}
}
return true;
}
}