428 lines
9.2 KiB
PHP
428 lines
9.2 KiB
PHP
<?php
|
|
/**
|
|
* WP Multisite WaaS class to hold current objects
|
|
*
|
|
* @package WP_Ultimo
|
|
* @subpackage Current
|
|
* @since 2.0.0
|
|
*/
|
|
|
|
namespace WP_Ultimo;
|
|
|
|
// Exit if accessed directly
|
|
defined('ABSPATH') || exit;
|
|
|
|
/**
|
|
* WP Multisite WaaS class to hold current objects
|
|
*
|
|
* @since 2.0.0
|
|
*/
|
|
class Current {
|
|
|
|
use \WP_Ultimo\Traits\Singleton;
|
|
|
|
/**
|
|
* The current site instance.
|
|
*
|
|
* @since 2.0.0
|
|
* @var \WP_Ultimo\Models\Site
|
|
*/
|
|
protected $site;
|
|
|
|
/**
|
|
* The current customer instance.
|
|
*
|
|
* @since 2.0.0
|
|
* @var \WP_Ultimo\Models\Customer
|
|
*/
|
|
protected $customer;
|
|
|
|
/**
|
|
* The current membership instance.
|
|
*
|
|
* @since 2.0.18
|
|
* @var \WP_Ultimo\Models\Membership
|
|
*/
|
|
protected $membership;
|
|
|
|
/**
|
|
* Wether or not the site was set via request.
|
|
*
|
|
* @since 2.0.0
|
|
* @var boolean
|
|
*/
|
|
protected $site_set_via_request = false;
|
|
|
|
/**
|
|
* Wether or not the customer was set via request.
|
|
*
|
|
* @since 2.0.0
|
|
* @var boolean
|
|
*/
|
|
protected $customer_set_via_request = false;
|
|
|
|
/**
|
|
* Wether or not the membership was set via request.
|
|
*
|
|
* @since 2.0.18
|
|
* @var boolean
|
|
*/
|
|
protected $membership_set_via_request = false;
|
|
|
|
/**
|
|
* Called when the singleton is first initialized.
|
|
*
|
|
* @since 2.0.0
|
|
* @return void
|
|
*/
|
|
public function init(): void {
|
|
/*
|
|
* Add rewrite rules
|
|
*/
|
|
add_action('init', [$this, 'add_rewrite_rules']);
|
|
add_filter('query_vars', [$this, 'add_query_vars']);
|
|
|
|
add_action('wu_after_save_settings', [$this, 'flush_rewrite_rules_on_update']);
|
|
add_action('wu_core_update', [$this, 'flush_rewrite_rules_on_update']);
|
|
|
|
/*
|
|
* Instantiate the currents.
|
|
*/
|
|
add_action('init', [$this, 'load_currents']);
|
|
add_action('wp', [$this, 'load_currents']);
|
|
}
|
|
|
|
/**
|
|
* Flush rewrite rules to make sure any newly added ones get installed on update.
|
|
*
|
|
* @since 2.0.0
|
|
* @return void
|
|
*/
|
|
public function flush_rewrite_rules_on_update(): void {
|
|
|
|
flush_rewrite_rules();
|
|
}
|
|
|
|
/**
|
|
* Adds a new rewrite rule to allow for pretty links.
|
|
*
|
|
* Managing a site would be done via /account/site/{$id}, for example.
|
|
*
|
|
* @since 2.0.0
|
|
* @return void
|
|
*/
|
|
public function add_rewrite_rules(): void {
|
|
|
|
$site_url_param = self::param_key('site');
|
|
|
|
add_rewrite_rule(
|
|
"(.?.+?)/{$site_url_param}/([0-9a-zA-Z]+)/?$",
|
|
'index.php?pagename=$matches[1]&site_hash=$matches[2]',
|
|
'top'
|
|
);
|
|
|
|
if (is_subdomain_install() === false) {
|
|
add_rewrite_rule(
|
|
"blog/(.?.+?)/{$site_url_param}/([0-9a-zA-Z]+)/?$",
|
|
'index.php?name=$matches[1]&site_hash=$matches[2]',
|
|
'top'
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds the necessary query vars to support pretty links.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @param array $query_vars The WP_Query object.
|
|
* @return \WP_Query
|
|
*/
|
|
public function add_query_vars($query_vars) {
|
|
|
|
$query_vars[] = 'site_hash';
|
|
$query_vars[] = 'products';
|
|
$query_vars[] = 'duration';
|
|
$query_vars[] = 'duration_unit';
|
|
$query_vars[] = 'template_name';
|
|
$query_vars[] = 'wu_preselected';
|
|
|
|
return $query_vars;
|
|
}
|
|
|
|
/**
|
|
* List of URL keys to set the current objects.
|
|
*
|
|
* @since 2.0.0
|
|
* @param string $type The type of object to get.
|
|
* @return string
|
|
*/
|
|
public static function param_key($type = 'site') {
|
|
|
|
$params = [
|
|
'site' => apply_filters('wu_current_get_site_param', 'site'),
|
|
'customer' => apply_filters('wu_current_get_customer_param', 'customer'),
|
|
'membership' => apply_filters('wu_current_get_membership_param', 'membership'),
|
|
];
|
|
|
|
return wu_get_isset($params, $type, $type);
|
|
}
|
|
|
|
/**
|
|
* Returns the URL to manage a site/customer on the front-end or back end.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @param int $id The site ID.
|
|
* @param string $type The type. Can be either site or customer.
|
|
* @return string
|
|
*/
|
|
public static function get_manage_url($id, $type = 'site') {
|
|
|
|
// Uses hash instead of the ID.
|
|
$site_hash = \WP_Ultimo\Helpers\Hash::encode($id, $type);
|
|
|
|
if ( ! is_admin()) {
|
|
$current_url = rtrim((string) wu_get_current_url(), '/');
|
|
|
|
$url_param = self::param_key($type);
|
|
|
|
/*
|
|
* Check if the current URL already has a site parameter and remove it.
|
|
*/
|
|
if (str_contains($current_url, '/' . $url_param . '/')) {
|
|
$current_url = preg_replace('/\/' . $url_param . '\/(.+)/', '/', $current_url);
|
|
}
|
|
|
|
$pretty_url = $current_url . '/' . $url_param . '/' . $site_hash;
|
|
|
|
$manage_site_url = get_option('permalink_structure') ? $pretty_url : add_query_arg($url_param, $site_hash);
|
|
} else {
|
|
$manage_site_url = get_admin_url($id);
|
|
}
|
|
|
|
/**
|
|
* Allow developers to modify the manage site URL parameters.
|
|
*
|
|
* @since 2.0.9
|
|
*
|
|
* @param string $manage_site_url The manage site URL.
|
|
* @param int $id The site ID.
|
|
* @param string $site_hash The site hash.
|
|
* @return string The modified manage URL.
|
|
*/
|
|
return apply_filters("wu_current_{$type}_get_manage_url", $manage_site_url, $id, $site_hash);
|
|
}
|
|
|
|
/**
|
|
* Loads the current site and makes it available.
|
|
*
|
|
* @since 2.0.0
|
|
* @return void
|
|
*/
|
|
public function load_currents(): void {
|
|
|
|
$site = false;
|
|
|
|
/**
|
|
* On the front-end, we need to check for url overrides.
|
|
*/
|
|
if ( ! is_admin()) {
|
|
/*
|
|
* By default, we'll use the `site` parameter.
|
|
*/
|
|
$site_url_param = self::param_key('site');
|
|
|
|
$site_hash = wu_request($site_url_param, get_query_var('site_hash'));
|
|
|
|
$site_from_url = wu_get_site_by_hash($site_hash);
|
|
|
|
if ($site_from_url) {
|
|
$this->site_set_via_request = true;
|
|
|
|
$site = $site_from_url;
|
|
}
|
|
} else {
|
|
$site = wu_get_current_site();
|
|
}
|
|
|
|
if ($site) {
|
|
$this->set_site($site);
|
|
}
|
|
|
|
$customer = wu_get_current_customer();
|
|
|
|
/**
|
|
* On the front-end, we need to check for url overrides.
|
|
*/
|
|
if ( ! is_admin()) {
|
|
/*
|
|
* By default, we'll use the `site` parameter.
|
|
*/
|
|
$customer_url_param = self::param_key('customer');
|
|
|
|
$customer_from_url = wu_get_customer(wu_request($customer_url_param, 0));
|
|
|
|
if ($customer_from_url) {
|
|
$this->customer_set_via_request = true;
|
|
|
|
$customer = $customer_from_url;
|
|
}
|
|
}
|
|
|
|
$this->set_customer($customer);
|
|
|
|
$membership = false;
|
|
|
|
/*
|
|
* By default, we'll use the `membership` parameter.
|
|
*/
|
|
$membership_url_param = self::param_key('membership');
|
|
|
|
$membership_hash = wu_request($membership_url_param, get_query_var('membership_hash'));
|
|
|
|
if ($membership_hash) {
|
|
$this->membership_set_via_request = true;
|
|
|
|
$membership = wu_get_membership_by_hash($membership_hash);
|
|
} elseif ($site) {
|
|
$membership = $site->get_membership();
|
|
}
|
|
|
|
if ($customer && ! $membership) {
|
|
$memberships = (array) $customer->get_memberships();
|
|
|
|
$membership = wu_get_isset($memberships, 0, false);
|
|
}
|
|
|
|
$this->set_membership($membership);
|
|
}
|
|
|
|
/**
|
|
* Get the current site instance.
|
|
*
|
|
* @since 2.0.0
|
|
* @return \WP_Ultimo\Models\Site
|
|
*/
|
|
public function get_site() {
|
|
|
|
return $this->site;
|
|
}
|
|
|
|
/**
|
|
* Set the current site instance.
|
|
*
|
|
* @since 2.0.0
|
|
* @param \WP_Ultimo\Models\Site $site The current site instance.
|
|
* @return void
|
|
*/
|
|
public function set_site($site): void {
|
|
|
|
/**
|
|
* Allow developers to modify the default behavior and set
|
|
* the current site differently.
|
|
*
|
|
* @since 2.0.9
|
|
*
|
|
* @param \WP_Ultimo\Models\Site $site The current site to set.
|
|
* @param self The Current class instance.
|
|
* @return \WP_Ultimo\Models\Site
|
|
*/
|
|
$site = apply_filters('wu_current_set_site', $site, $this);
|
|
|
|
$this->site = $site;
|
|
}
|
|
|
|
/**
|
|
* Get wether or not the site was set via request.
|
|
*
|
|
* @since 2.0.0
|
|
* @return boolean
|
|
*/
|
|
public function is_site_set_via_request() {
|
|
|
|
return $this->site_set_via_request;
|
|
}
|
|
|
|
/**
|
|
* Get the current customer instance.
|
|
*
|
|
* @since 2.0.0
|
|
* @return \WP_Ultimo\Models\Customer
|
|
*/
|
|
public function get_customer() {
|
|
|
|
return $this->customer;
|
|
}
|
|
|
|
/**
|
|
* Set the current customer instance.
|
|
*
|
|
* @since 2.0.0
|
|
* @param \WP_Ultimo\Models\Customer $customer The current customer instance.
|
|
* @return void
|
|
*/
|
|
public function set_customer($customer): void {
|
|
|
|
/**
|
|
* Allow developers to modify the default behavior and set
|
|
* the current customer differently.
|
|
*
|
|
* @since 2.0.9
|
|
*
|
|
* @param \WP_Ultimo\Models\Customer $customer The current customer to set.
|
|
* @param self The Current class instance.
|
|
* @return \WP_Ultimo\Models\Customer
|
|
*/
|
|
$customer = apply_filters('wu_current_set_customer', $customer, $this);
|
|
|
|
$this->customer = $customer;
|
|
}
|
|
|
|
/**
|
|
* Get the current membership instance.
|
|
*
|
|
* @since 2.0.18
|
|
* @return \WP_Ultimo\Models\Membership
|
|
*/
|
|
public function get_membership() {
|
|
|
|
return $this->membership;
|
|
}
|
|
|
|
/**
|
|
* Set the current membership instance.
|
|
*
|
|
* @since 2.0.18
|
|
* @param \WP_Ultimo\Models\Membership $membership The current membership instance.
|
|
* @return void
|
|
*/
|
|
public function set_membership($membership): void {
|
|
|
|
/**
|
|
* Allow developers to modify the default behavior and set
|
|
* the current membership differently.
|
|
*
|
|
* @since 2.0.18
|
|
*
|
|
* @param \WP_Ultimo\Models\Membership $membership The current membership to set.
|
|
* @param self The Current class instance.
|
|
* @return \WP_Ultimo\Models\Membership
|
|
*/
|
|
$membership = apply_filters('wu_current_set_membership', $membership, $this);
|
|
|
|
$this->membership = $membership;
|
|
}
|
|
|
|
/**
|
|
* Get wether or not the membership was set via request.
|
|
*
|
|
* @since 2.0.18
|
|
* @return boolean
|
|
*/
|
|
public function is_membership_set_via_request() {
|
|
|
|
return $this->membership_set_via_request;
|
|
}
|
|
}
|