220 lines
8.0 KiB
PHP
220 lines
8.0 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This file is part of mundschenk-at/check-wp-requirements.
|
|
*
|
|
* Copyright 2014-2019 Peter Putzer.
|
|
* Copyright 2009-2011 KINGdesk, LLC.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* ***
|
|
*
|
|
* @package mundschenk-at/check-wp-requirements
|
|
* @license http://www.gnu.org/licenses/gpl-2.0.html
|
|
*/
|
|
namespace Avatar_Privacy\Vendor\Mundschenk;
|
|
|
|
/**
|
|
* This class checks if the required runtime environment is available.
|
|
*
|
|
* Included checks:
|
|
* - PHP version
|
|
* - mb_string extension
|
|
* - UTF-8 encoding
|
|
*
|
|
* Note: All code must be executable on PHP 5.2.
|
|
*/
|
|
class WP_Requirements
|
|
{
|
|
/**
|
|
* The minimum requirements for running the plugins. Must contain:
|
|
* - 'php'
|
|
* - 'multibyte'
|
|
* - 'utf-8'
|
|
*
|
|
* @var array A hash containing the version requirements for the plugin.
|
|
*/
|
|
private $install_requirements;
|
|
/**
|
|
* The user-visible name of the plugin.
|
|
*
|
|
* @todo Should the plugin name be translated?
|
|
* @var string
|
|
*/
|
|
private $plugin_name;
|
|
/**
|
|
* The full path to the main plugin file.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $plugin_file;
|
|
/**
|
|
* The textdomain used for loading plugin translations.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $textdomain;
|
|
/**
|
|
* The base directory of the Check_WP_Requirements component (i.e. the equivalent of __DIR__).
|
|
*
|
|
* @var string
|
|
*/
|
|
private $base_dir;
|
|
/**
|
|
* Sets up a new Mundschenk\WP_Requirements object.
|
|
*
|
|
* @param string $name The plugin name.
|
|
* @param string $plugin_path The full path to the main plugin file.
|
|
* @param string $textdomain The text domain used for i18n.
|
|
* @param array $requirements The requirements to check against.
|
|
*/
|
|
public function __construct($name, $plugin_path, $textdomain, $requirements)
|
|
{
|
|
$this->plugin_name = $name;
|
|
$this->plugin_file = $plugin_path;
|
|
$this->textdomain = $textdomain;
|
|
$this->base_dir = \dirname(__FILE__);
|
|
$this->install_requirements = \wp_parse_args($requirements, ['php' => '5.2.0', 'multibyte' => \false, 'utf-8' => \false]);
|
|
}
|
|
/**
|
|
* Checks if all runtime requirements for the plugin are met.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function check()
|
|
{
|
|
$requirements_met = \true;
|
|
foreach ($this->get_requirements() as $requirement) {
|
|
if (!empty($this->install_requirements[$requirement['enable_key']]) && !\call_user_func($requirement['check'])) {
|
|
$notice = $requirement['notice'];
|
|
$requirements_met = \false;
|
|
break;
|
|
}
|
|
}
|
|
if (!$requirements_met && !empty($notice) && \is_admin()) {
|
|
// Load text domain to ensure translated admin notices.
|
|
\load_plugin_textdomain($this->textdomain);
|
|
// Add admin notice.
|
|
\add_action('admin_notices', $notice);
|
|
}
|
|
return $requirements_met;
|
|
}
|
|
/**
|
|
* Retrieves an array of requirement specifications.
|
|
*
|
|
* @return array {
|
|
* An array of requirements checks.
|
|
*
|
|
* @type string $enable_key An index in the $install_requirements array to switch the check on and off.
|
|
* @type callable $check A function returning true if the check was successful, false otherwise.
|
|
* @type callable $notice A function displaying an appropriate error notice.
|
|
* }
|
|
*/
|
|
protected function get_requirements()
|
|
{
|
|
return [['enable_key' => 'php', 'check' => [$this, 'check_php_support'], 'notice' => [$this, 'admin_notices_php_version_incompatible']], ['enable_key' => 'multibyte', 'check' => [$this, 'check_multibyte_support'], 'notice' => [$this, 'admin_notices_mbstring_incompatible']], ['enable_key' => 'utf-8', 'check' => [$this, 'check_utf8_support'], 'notice' => [$this, 'admin_notices_charset_incompatible']]];
|
|
}
|
|
/**
|
|
* Deactivates the plugin.
|
|
*/
|
|
public function deactivate_plugin()
|
|
{
|
|
\deactivate_plugins(\plugin_basename($this->plugin_file));
|
|
}
|
|
/**
|
|
* Checks if the PHP version in use is at least equal to the required version.
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function check_php_support()
|
|
{
|
|
return \version_compare(\PHP_VERSION, $this->install_requirements['php'], '>=');
|
|
}
|
|
/**
|
|
* Checks if multibyte functions are supported.
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function check_multibyte_support()
|
|
{
|
|
return \function_exists('mb_strlen') && \function_exists('mb_strtolower') && \function_exists('mb_substr') && \function_exists('mb_detect_encoding');
|
|
}
|
|
/**
|
|
* Checks if the blog charset is set to UTF-8.
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function check_utf8_support()
|
|
{
|
|
return 'utf-8' === \strtolower(\get_bloginfo('charset'));
|
|
}
|
|
/**
|
|
* Print 'PHP version incompatible' admin notice
|
|
*/
|
|
public function admin_notices_php_version_incompatible()
|
|
{
|
|
$this->display_error_notice(
|
|
/* translators: 1: plugin name 2: target PHP version number 3: actual PHP version number */
|
|
\__('The activated plugin %1$s requires PHP %2$s or later. Your server is running PHP %3$s. Please deactivate this plugin, or upgrade your server\'s installation of PHP.', $this->textdomain),
|
|
"<strong>{$this->plugin_name}</strong>",
|
|
$this->install_requirements['php'],
|
|
\PHP_VERSION
|
|
);
|
|
}
|
|
/**
|
|
* Prints 'mbstring extension missing' admin notice
|
|
*/
|
|
public function admin_notices_mbstring_incompatible()
|
|
{
|
|
$this->display_error_notice(
|
|
/* translators: 1: plugin name 2: mbstring documentation URL */
|
|
\__('The activated plugin %1$s requires the mbstring PHP extension to be enabled on your server. Please deactivate this plugin, or <a href="%2$s">enable the extension</a>.', $this->textdomain),
|
|
"<strong>{$this->plugin_name}</strong>",
|
|
/* translators: URL with mbstring PHP extension installation instructions */
|
|
\__('http://www.php.net/manual/en/mbstring.installation.php', $this->textdomain)
|
|
);
|
|
}
|
|
/**
|
|
* Prints 'Charset incompatible' admin notice
|
|
*/
|
|
public function admin_notices_charset_incompatible()
|
|
{
|
|
$this->display_error_notice(
|
|
/* translators: 1: plugin name 2: current character encoding 3: options URL */
|
|
\__('The activated plugin %1$s requires your blog use the UTF-8 character encoding. You have set your blogs encoding to %2$s. Please deactivate this plugin, or <a href="%3$s">change your character encoding to UTF-8</a>.', $this->textdomain),
|
|
"<strong>{$this->plugin_name}</strong>",
|
|
\get_bloginfo('charset'),
|
|
'/wp-admin/options-reading.php'
|
|
);
|
|
}
|
|
/**
|
|
* Shows an error message in the admin area.
|
|
*
|
|
* @param string $format ... An `sprintf` format string, followd by an unspecified number of optional parameters.
|
|
*/
|
|
protected function display_error_notice($format)
|
|
{
|
|
if (\func_num_args() < 1 || empty($format)) {
|
|
return;
|
|
// abort.
|
|
}
|
|
$args = \func_get_args();
|
|
$format = \array_shift($args);
|
|
$message = \vsprintf($format, $args);
|
|
require "{$this->base_dir}/partials/requirements-error-notice.php";
|
|
}
|
|
}
|