New Constant, ...]
* ['WP_STATELESS_MEDIA_ON_FLY' => 'WP_STATELESS_DYNAMIC_IMAGE_SUPPORT']
*/
protected $constant = '';
protected $enabled = true;
protected $description = '';
protected $plugin_file = null;
protected $theme_name = null;
protected $first_party = false;
protected $non_library_sync = false;
protected $server_constant = false;
protected $sm_mode_required = '';
protected $sm_mode_not_supported = [];
protected $is_internal = false;
public function __construct() {
// Prevent conflict between internal built-in compatibility modules and addon plugins
$restrict = apply_filters('wp_stateless_restrict_compatibility', false, $this->id, $this->is_internal);
if ($restrict) {
$this->enabled = false;
return;
}
if ( !$this->is_internal ) {
add_filter('wp_stateless_restrict_compatibility', array($this, 'restrict_compatibility'), 10, 3);
}
$this->init();
}
/**
* Checking whether the plugin is active or not.
* If the plugin_file is specified then check whether plugin is active or not.
* We can't use is_plugin_active function because it's defined later in init.
* By default return true.
*
* @todo caching.
*/
public function is_plugin_active() {
if (!empty($this->theme_name)) {
return Helper::is_theme_name($this->theme_name);
}
if (!empty($this->plugin_file)) {
// Converting string to array for foreach
if (is_string($this->plugin_file)) {
$this->plugin_file = array($this->plugin_file);
}
// If multisite then check if plugin is network active
if (is_multisite()) {
$active_plugins = (array)get_site_option('active_sitewide_plugins');
foreach ($this->plugin_file as $plugin_file) {
if (isset($active_plugins[$plugin_file])) {
return true;
}
}
// If we are in network admin then return, unless it will get data from main site.
if (is_network_admin()) {
return false;
}
}
$active_plugins = (array)get_option('active_plugins', array());
foreach ($this->plugin_file as $plugin_file) {
if (in_array($plugin_file, $active_plugins)) {
return true;
}
}
return false;
}
/**
* If server constant is set - check if exist it on global $_SERVER
*/
if (!empty($this->server_constant)) {
if (isset($_SERVER[$this->server_constant])) {
return true;
}
return false;
}
return true;
}
/**
* Checking whether current mode is supported.
* By default return true.
*
* @todo caching.
*/
public function is_mode_supported() {
$sm_mode = isset($_POST['sm']['mode']) ? $_POST['sm']['mode'] : ud_get_stateless_media()->get('sm.mode');
if (in_array($sm_mode, $this->sm_mode_not_supported)) {
return false;
}
return true;
}
/**
* Initialize the module
* Check whether plugin is active or not.
* Register module.
*
* Add action for sm::module::init hook for module_init, which is fired(do_action) on Bootstrap::init()
*/
public function init() {
$is_constant = false;
$is_network_override = false;
$sm_mode = isset($_POST['sm']['mode']) ? $_POST['sm']['mode'] : ud_get_stateless_media()->get('sm.mode');
if (is_network_admin()) {
$this->enabled = null;
}
if (is_array($this->constant)) {
foreach ($this->constant as $old_const => $new_const) {
if (defined($new_const)) {
$is_constant = true;
$this->enabled = constant($new_const);
break;
}
if (is_string($old_const) && defined($old_const)) {
$is_constant = true;
$this->enabled = constant($old_const);
ud_get_stateless_media()->errors->add(array(
'key' => $this->id,
'title' => sprintf(__("%s: Deprecated Notice (%s)", ud_get_stateless_media()->domain), ud_get_stateless_media()->name, $this->title),
'message' => sprintf(__("%s constant is deprecated, please use %s instead.", ud_get_stateless_media()->domain), $old_const, $new_const),
), 'notice');
break;
}
}
} elseif (defined($this->constant)) {
$this->enabled = constant($this->constant);
$is_constant = true;
}
if (!$is_constant) {
$modules = get_option('stateless-modules', array());
if (empty($this->enabled)) {
$this->enabled = !empty($modules[$this->id]) && $modules[$this->id] == 'true' ? true : false;
}
if (is_multisite()) {
$modules = get_site_option('stateless-modules', array());
if (is_network_admin()) {
$this->enabled = !empty($modules[$this->id]) ? ($modules[$this->id] == 'true' ? true : false) : '';
} elseif (!empty($modules[$this->id])) {
$this->enabled = !empty($modules[$this->id]) ? ($modules[$this->id] == 'true' ? true : false) : '';
$is_network_override = true;
}
}
}
if (!is_network_admin() && (!$this->is_plugin_active() || !$this->is_mode_supported())) {
$this->enabled = 'inactive';
}
/**
* Checking whether to show manual sync option.
*/
if ($this->is_plugin_active() && $this->non_library_sync == true) {
global $show_non_library_sync;
$show_non_library_sync = true;
}
Module::register_module(array(
'id' => $this->id,
'self' => $this,
'title' => $this->title,
'enabled' => $this->enabled,
'description' => $this->description,
'is_constant' => $is_constant,
'is_network_override' => $is_network_override,
'is_plugin_active' => $this->is_plugin_active(),
'is_network_admin' => is_network_admin(),
'is_plugin' => !empty($this->plugin_file),
'is_theme' => !empty($this->theme_name),
'is_mode_supported' => $this->is_mode_supported(),
'mode' => ucfirst($sm_mode),
'is_internal' => $this->is_internal,
));
if ($this->enabled && $this->is_plugin_active() && $this->is_mode_supported()) {
add_action('sm::module::init', array($this, 'module_init'));
}
if (!$this->enabled && !$this->first_party && $this->is_plugin_active()) {
ud_get_stateless_media()->errors->add(array(
'key' => $this->id,
'title' => sprintf(__("%s: Compatibility for %s isn't enabled.", ud_get_stateless_media()->domain), ud_get_stateless_media()->name, $this->title),
'button' => __("Enable Compatibility", ud_get_stateless_media()->domain),
'message' => __("Please enable the compatibility to ensure the functionality will work properly between {$this->title} and WP-Stateless.", ud_get_stateless_media()->domain),
), 'notice');
}
/**
* Check requires WP-Stateless mode
*/
if (!empty($this->sm_mode_required) && $this->enabled !== 'inactive') {
if ($sm_mode !== $this->sm_mode_required) {
ud_get_stateless_media()->errors->add(array(
'key' => $this->id,
'title' => sprintf(__("%s: Current Mode is not compatible with %s.", ud_get_stateless_media()->domain), ud_get_stateless_media()->name, $this->title),
'message' => sprintf(__("%s compatibility requires %s in %s mode.", ud_get_stateless_media()->domain), $this->title, ud_get_stateless_media()->name, ucfirst($this->sm_mode_required)),
), 'notice');
}
}
}
/**
* @return bool
*/
public function enable_compatibility() {
if (is_network_admin()) {
$modules = get_site_option('stateless-modules', array());
if (empty($modules[$this->id]) || $modules[$this->id] != 'true') {
$modules[$this->id] = 'true';
update_site_option('stateless-modules', $modules, true);
}
} else {
$modules = get_option('stateless-modules', array());
if (empty($modules[$this->id]) || $modules[$this->id] != 'true') {
$modules[$this->id] = 'true';
update_option('stateless-modules', $modules, true);
}
}
return true;
}
/**
* add_webp_mime
* @param $t
* @param $user
* @return mixed
*/
public function add_webp_mime($t, $user) {
$t['webp'] = 'image/webp';
return $t;
}
/**
* Restrict internal compatibility.
* @param $restrict bool
* @param $id string
* @param $is_internal bool
* @return bool
*/
public function restrict_compatibility($restrict, $id, $is_internal) {
// If we have internal compatibility with the same ID - then disable internal compatibility
return $is_internal && $this->id == $id ? true : $restrict;
}
}