344 lines
9.7 KiB
PHP
344 lines
9.7 KiB
PHP
<?php
|
||
defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
|
||
|
||
/**
|
||
* Class to check if the current WordPress and PHP versions meet our requirements.
|
||
*
|
||
* @since 1.9
|
||
* @source Based on class WP_Rocket_Requirements_Check from WP Rocket plugin.
|
||
* @author Grégory Viguier
|
||
* @author Remy Perona
|
||
*/
|
||
class Imagify_Requirements_Check {
|
||
/**
|
||
* Plugin Name.
|
||
*
|
||
* @var string
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*/
|
||
private $plugin_name;
|
||
|
||
/**
|
||
* Plugin filepath.
|
||
*
|
||
* @var string
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*/
|
||
private $plugin_file;
|
||
|
||
/**
|
||
* Plugin version.
|
||
*
|
||
* @var string
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*/
|
||
private $plugin_version;
|
||
|
||
/**
|
||
* Last plugin version handling the current version of WP.
|
||
*
|
||
* @var string
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*/
|
||
private $wp_last_version;
|
||
|
||
/**
|
||
* Last plugin version handling the current version of PHP.
|
||
*
|
||
* @var string
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*/
|
||
private $php_last_version;
|
||
|
||
/**
|
||
* Required WordPress version.
|
||
*
|
||
* @var string
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*/
|
||
private $wp_version;
|
||
|
||
/**
|
||
* Required PHP version.
|
||
*
|
||
* @var string
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*/
|
||
private $php_version;
|
||
|
||
/**
|
||
* Constructor.
|
||
*
|
||
* @since 1.9
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @param array $args {
|
||
* Arguments to populate the class properties.
|
||
*
|
||
* @type string $plugin_name Plugin name.
|
||
* @type string $plugin_file Plugin filepath.
|
||
* @type string $plugin_version Plugin version.
|
||
* @type string $wp_last_version Last plugin version handling the current version of WP.
|
||
* @type string $php_last_version Last plugin version handling the current version of PHP.
|
||
* @type string $wp_version Required WordPress version.
|
||
* @type string $php_version Required PHP version.
|
||
* }
|
||
*/
|
||
public function __construct( $args ) {
|
||
foreach ( array( 'plugin_name', 'plugin_file', 'plugin_version', 'wp_last_version', 'php_last_version', 'wp_version', 'php_version' ) as $setting ) {
|
||
if ( isset( $args[ $setting ] ) ) {
|
||
$this->$setting = $args[ $setting ];
|
||
}
|
||
}
|
||
|
||
if ( empty( $this->wp_last_version ) ) {
|
||
$this->wp_last_version = '1.6.14.2';
|
||
}
|
||
|
||
if ( empty( $this->php_last_version ) ) {
|
||
$this->php_last_version = '1.8.4.1';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Check if all requirements are ok, if not, display a notice and the rollback.
|
||
*
|
||
* @since 1.9
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return bool
|
||
*/
|
||
public function check() {
|
||
if ( ! $this->php_passes() || ! $this->wp_passes() ) {
|
||
add_action( 'admin_notices', array( $this, 'print_notice' ) );
|
||
add_action( 'admin_post_imagify_rollback', array( $this, 'rollback' ) );
|
||
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Check if the current PHP version is equal or superior to the required PHP version.
|
||
*
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return bool
|
||
*/
|
||
private function php_passes() {
|
||
return version_compare( PHP_VERSION, $this->php_version ) >= 0;
|
||
}
|
||
|
||
/**
|
||
* Check if the current WordPress version is equal or superior to the required PHP version.
|
||
*
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return bool
|
||
*/
|
||
private function wp_passes() {
|
||
global $wp_version;
|
||
|
||
return version_compare( $wp_version, $this->wp_version ) >= 0;
|
||
}
|
||
|
||
/**
|
||
* Get the last version of the plugin that can run with the current WP and PHP versions.
|
||
*
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return string
|
||
*/
|
||
private function get_last_version() {
|
||
$last_version = '';
|
||
|
||
if ( ! $this->php_passes() ) {
|
||
$last_version = $this->php_last_version;
|
||
}
|
||
|
||
if ( ! $this->wp_passes() ) {
|
||
$last_version = ! $last_version || version_compare( $last_version, $this->wp_last_version ) > 0 ? $this->wp_last_version : $last_version;
|
||
}
|
||
|
||
return $last_version;
|
||
}
|
||
|
||
/**
|
||
* Tell if the current user can rollback.
|
||
*
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return bool
|
||
*/
|
||
private function current_user_can() {
|
||
$describer = 'manage';
|
||
$capacity = $this->is_active_for_network() ? 'manage_network_options' : 'manage_options';
|
||
// This filter is documented in classes/Context/AbstractContext.php.
|
||
$capacity = (string) apply_filters( 'imagify_capacity', $capacity, $describer, 'wp' );
|
||
|
||
$user_can = current_user_can( $capacity );
|
||
// This filter is documented in classes/Context/AbstractContext.php.
|
||
$user_can = (bool) apply_filters( 'imagify_current_user_can', $user_can, $capacity, $describer, null, 'wp' );
|
||
|
||
return $user_can;
|
||
}
|
||
|
||
/**
|
||
* Tell if Imagify is activated on the network.
|
||
*
|
||
* @since 1.9
|
||
* @access private
|
||
* @author Grégory Viguier
|
||
*
|
||
* return bool True if Imagify is activated on the network.
|
||
*/
|
||
private function is_active_for_network() {
|
||
if ( ! is_multisite() ) {
|
||
return false;
|
||
}
|
||
|
||
if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
|
||
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
||
}
|
||
|
||
return is_plugin_active_for_network( plugin_basename( $this->plugin_file ) );
|
||
}
|
||
|
||
/**
|
||
* Warn if PHP version is less than 5.4 and offers to rollback.
|
||
*
|
||
* @since 1.9
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*/
|
||
public function print_notice() {
|
||
if ( ! $this->current_user_can() ) {
|
||
return;
|
||
}
|
||
|
||
imagify_load_translations();
|
||
|
||
$message = array();
|
||
$required = array();
|
||
$rollback_url = wp_nonce_url( admin_url( 'admin-post.php?action=imagify_rollback' ), 'imagify_rollback' );
|
||
|
||
if ( ! $this->php_passes() ) {
|
||
/* translators: %1$s = Plugin name, %2$s = PHP version required. */
|
||
$message[] = sprintf( esc_html__( 'To use this %1$s version, please ask your web host how to upgrade your server to PHP %2$s or higher.', 'imagify' ), $this->plugin_name, $this->php_version );
|
||
$required[] = 'PHP ' . $this->php_version;
|
||
}
|
||
|
||
if ( ! $this->wp_passes() ) {
|
||
/* translators: %1$s = Plugin name, %2$s = WordPress version required. */
|
||
$message[] = sprintf( esc_html__( 'To use this %1$s version, please upgrade WordPress to version %2$s or higher.', 'imagify' ), $this->plugin_name, $this->wp_version );
|
||
$required[] = 'WordPress ' . $this->wp_version;
|
||
}
|
||
|
||
$message = '<p>' . implode( '<br/>', $message ) . "</p>\n";
|
||
$required = wp_sprintf_l( '%l', $required );
|
||
|
||
/* translators: %1$s = Plugin name, %2$s = Plugin version, $3$s is something like "PHP 5.4" or "PHP 5.4 and WordPress 4.0". */
|
||
$message = '<p>' . sprintf( esc_html__( 'To function properly, %1$s %2$s requires at least %3$s.', 'imagify' ), '<strong>' . $this->plugin_name . '</strong>', $this->plugin_version, $required ) . "</p>\n" . $message;
|
||
|
||
$message .= '<p>' . esc_html__( 'If you are not able to upgrade, you can rollback to the previous version by using the button below.', 'imagify' ) . "</p>\n";
|
||
/* translators: %s = Previous plugin version. */
|
||
$message .= '<p class="submit"><a href="' . esc_url( $rollback_url ) . '" class="button">' . sprintf( __( 'Re-install version %s', 'imagify' ), $this->get_last_version() ) . '</a></p>';
|
||
|
||
echo '<div class="notice notice-error">' . $message . '</div>';
|
||
}
|
||
|
||
/**
|
||
* Do the rollback.
|
||
*
|
||
* @since 1.9
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*/
|
||
public function rollback() {
|
||
check_ajax_referer( 'imagify_rollback' );
|
||
|
||
if ( ! $this->current_user_can() ) {
|
||
wp_die();
|
||
}
|
||
|
||
imagify_load_translations();
|
||
|
||
$plugin_transient = get_site_transient( 'update_plugins' );
|
||
$plugin_basename = plugin_basename( $this->plugin_file );
|
||
$plugin_folder = dirname( $plugin_basename );
|
||
$last_version = $this->get_last_version();
|
||
$package_filename = $plugin_folder . '.' . $last_version . '.zip';
|
||
|
||
$plugin_transient->checked[ $plugin_basename ] = $last_version;
|
||
|
||
if ( ! empty( $plugin_transient->response[ $plugin_basename ] ) ) {
|
||
$tmp_obj = $plugin_transient->response[ $plugin_basename ];
|
||
} elseif ( ! empty( $plugin_transient->no_update[ $plugin_basename ] ) ) {
|
||
$tmp_obj = $plugin_transient->no_update[ $plugin_basename ];
|
||
} else {
|
||
$tmp_obj = (object) array(
|
||
'id' => 'w.org/plugins/' . $plugin_folder,
|
||
'slug' => $plugin_folder,
|
||
'plugin' => $plugin_basename,
|
||
'new_version' => $last_version,
|
||
'url' => 'https://wordpress.org/plugins/' . $plugin_folder . '/',
|
||
'package' => 'https://downloads.wordpress.org/plugin/' . $package_filename,
|
||
'icons' => array(),
|
||
'banners' => array(),
|
||
'banners_rtl' => array(),
|
||
);
|
||
}
|
||
|
||
$tmp_obj->new_version = $last_version;
|
||
$tmp_obj->package = preg_replace( '@/[^/]+$@', '/' . $package_filename, $tmp_obj->package );
|
||
|
||
$plugin_transient->response[ $plugin_basename ] = $tmp_obj;
|
||
unset( $plugin_transient->no_update[ $plugin_basename ] );
|
||
|
||
set_site_transient( 'update_plugins', $plugin_transient );
|
||
|
||
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
|
||
|
||
/* translators: %s is the plugin name. */
|
||
$title = sprintf( __( '%s Update Rollback', 'imagify' ), $this->plugin_name );
|
||
$nonce = 'upgrade-plugin_' . $plugin_basename;
|
||
$url = 'update.php?action=upgrade-plugin&plugin=' . rawurlencode( $plugin_basename );
|
||
$upgrader_skin = new Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'plugin' ) );
|
||
$upgrader = new Plugin_Upgrader( $upgrader_skin );
|
||
|
||
$upgrader->upgrade( $plugin_basename );
|
||
|
||
wp_die(
|
||
'',
|
||
/* translators: %s is the plugin name. */
|
||
sprintf( __( '%s Update Rollback', 'imagify' ), $this->plugin_name ),
|
||
array( 'response' => 200 )
|
||
);
|
||
}
|
||
}
|