Skip to content
Snippets Groups Projects
Commit 89266f6e authored by dyszczo's avatar dyszczo
Browse files

disable plugin temporary when requirement are upgraded

parent 7084c414
No related branches found
No related tags found
1 merge request!13Feature/repository plugins
......@@ -4,6 +4,7 @@
### Added
- Factory can create checker from requirement array
- Support for update suggestion when required plugin not found
- WPDesk_Basic_Requirement_Checker_With_Update_Disable can temporarily say that requirements are not met when required plugin is in the process of being updated
## [2.4.0] - 2019-06-04
### Added
......
......@@ -15,10 +15,9 @@ if ( ! class_exists( 'WPDesk_Basic_Requirement_Checker' ) ) {
const PLUGIN_INFO_KEY_NICE_NAME = 'nice_name';
const PLUGIN_INFO_KEY_NAME = 'name';
const PLUGIN_INFO_KEY_REPOSITORY_URL = 'repository_url';
/** @var string */
private $plugin_name;
protected $plugin_name;
/** @var string */
private $plugin_file;
/** @var string */
......@@ -169,6 +168,8 @@ if ( ! class_exists( 'WPDesk_Basic_Requirement_Checker' ) ) {
}
/**
* Returns true if are requirements are met.
*
* @return bool
*/
public function are_requirements_met() {
......@@ -353,7 +354,7 @@ if ( ! class_exists( 'WPDesk_Basic_Requirement_Checker' ) ) {
if ( ! self::is_wp_plugin_active( $name ) ) {
$activate_url = 'plugins.php?action=activate&plugin=' . urlencode( $plugin_info[ self::PLUGIN_INFO_KEY_NAME ] ) . '&plugin_status=all&paged=1&s&_wpnonce=' . urlencode( wp_create_nonce( 'activate-plugin_' . $name ) );
return sprintf( wp_kses( __( 'The &#8220;%s&#8221; plugin activating %s plugin. <a href="%s">Activate %s →</a>',
return sprintf( wp_kses( __( 'The &#8220;%s&#8221; plugin requires activating %s plugin. <a href="%s">Activate %s →</a>',
$this->get_text_domain() ), array( 'a' => array( 'href' => array() ) ) ),
$this->plugin_name, $nice_name, esc_url( admin_url( $activate_url ) ), $nice_name );
......
......@@ -4,6 +4,10 @@ if ( ! class_exists( 'Basic_Requirement_Checker' ) ) {
require_once 'Basic_Requirement_Checker.php';
}
if ( ! class_exists( 'WPDesk_Basic_Requirement_Checker_With_Update_Disable' ) ) {
require_once 'Basic_Requirement_Checker_With_Update_Disable.php';
}
/**
* Falicitates createion of requirement checker
*/
......@@ -13,14 +17,12 @@ class WPDesk_Basic_Requirement_Checker_Factory {
*
* @param string $plugin_file
* @param string $plugin_name
* @param string $text_domain
* @param string $php_version
* @param string $wp_version
* @param string|null $text_domain
*
* @return WPDesk_Requirement_Checker
*/
public function create_requirement_checker( $plugin_file, $plugin_name, $text_domain ) {
return new WPDesk_Basic_Requirement_Checker( $plugin_file, $plugin_name, $text_domain, null, null );
public function create_requirement_checker( $plugin_file, $plugin_name, $text_domain = null ) {
return new WPDesk_Basic_Requirement_Checker( $plugin_file, $plugin_name, $this->initialize_translations($text_domain), null, null );
}
/**
......@@ -28,16 +30,16 @@ class WPDesk_Basic_Requirement_Checker_Factory {
*
* @param string $plugin_file
* @param string $plugin_name
* @param string $plugin_text_domain
* @param string $text_domain
* @param array $requirements
*
* @return WPDesk_Requirement_Checker
*/
public function create_from_requirement_array( $plugin_file, $plugin_name, $plugin_text_domain, $requirements ) {
$requirements_checker = new WPDesk_Basic_Requirement_Checker(
public function create_from_requirement_array( $plugin_file, $plugin_name, $requirements, $text_domain = null ) {
$requirements_checker = new WPDesk_Basic_Requirement_Checker_With_Update_Disable(
$plugin_file,
$plugin_name,
$plugin_text_domain,
$this->initialize_translations($text_domain),
$requirements['php'],
$requirements['wp']
);
......@@ -48,6 +50,13 @@ class WPDesk_Basic_Requirement_Checker_Factory {
}
}
if ( isset( $requirements['repo_plugins'] ) ) {
foreach ( $requirements['repo_plugins'] as $requirement ) {
$requirements_checker->add_plugin_repository_require( $requirement['name'], $requirement['version'],
$requirement['nice_name'] );
}
}
if ( isset( $requirements['modules'] ) ) {
foreach ( $requirements['modules'] as $requirement ) {
$requirements_checker->add_php_module_require( $requirement['name'], $requirement['nice_name'] );
......@@ -56,4 +65,15 @@ class WPDesk_Basic_Requirement_Checker_Factory {
return $requirements_checker;
}
/**
* Tries to initialize translations for requirement checker. If not given then default library translation is used.
*
* @param string|null $text_domain
*
* @return string
*/
private function initialize_translations( $text_domain = null ) {
return $text_domain;
}
}
<?php
if ( ! class_exists( 'WPDesk_Basic_Requirement_Checker' ) ) {
require_once 'Basic_Requirement_Checker.php';
}
if ( ! class_exists( 'WPDesk_Basic_Requirement_Checker_With_Update_Disable' ) ) {
/**
* Checks requirements for plugin. When required plugin is updated right now, then say that requirements are not met temporary.
* have to be compatible with PHP 5.2.x
*/
class WPDesk_Basic_Requirement_Checker_With_Update_Disable extends WPDesk_Basic_Requirement_Checker {
/**
* Returns true if are requirements are met.
*
* @return bool
*/
public function are_requirements_met() {
$has_been_met = parent::are_requirements_met();
if ( ! $has_been_met ) {
return $has_been_met;
}
foreach ( $this->plugin_require as $name => $plugin_info ) {
if ( $this->is_currently_updated( $name ) ) {
$nice_name = $plugin_info[self::PLUGIN_INFO_KEY_NICE_NAME];
$this->notices[] = sprintf( __( 'The &#8220;%s&#8221; plugin disables temporarily as required %s plugin is being upgraded.',
$this->get_text_domain() ),
$this->plugin_name, $nice_name, $nice_name );
}
}
return count( $this->notices ) === 0;
}
/**
* Is plugin upgrading right now?
*
* @param string $name
*
* @return bool
*/
private function is_currently_updated( $name ) {
return isset( $_GET['action'] ) && $_GET['action'] === 'upgrade-plugin' && $_GET['plugin'] === $name;
}
}
}
\ No newline at end of file
<?php
class Test_Basic_Requirement_Checker_With_Update_Disable extends PHPUnit\Framework\TestCase {
const RANDOM_PLUGIN_FILE = 'file';
const RANDOM_PLUGIN_NAME = 'name';
const ALWAYS_VALID_PHP_VERSION = '5.2';
const ALWAYS_VALID_WP_VERSION = '4.0';
const RANDOM_PLUGIN_TEXTDOMAIN = 'text';
public function setUp() {
WP_Mock::setUp();
WP_Mock::wpFunction( 'get_bloginfo' )
->andReturn( self::ALWAYS_VALID_WP_VERSION );
}
public function tearDown() {
WP_Mock::tearDown();
}
public function test_requirements_are_not_met_when_plugin_update() {
$checker = new WPDesk_Basic_Requirement_Checker_With_Update_Disable( self::RANDOM_PLUGIN_FILE,
self::RANDOM_PLUGIN_NAME,
self::RANDOM_PLUGIN_TEXTDOMAIN, self::ALWAYS_VALID_PHP_VERSION, self::ALWAYS_VALID_WP_VERSION );
$this->assertTrue( $checker->are_requirements_met(), 'Initial php and wp version should be met' );
$valid_plugin_name = 'woocommerce/woocommerce.php';
WP_Mock::wpFunction( 'get_option' )
->withArgs( array( 'active_plugins', array() ) )
->andReturn( array( $valid_plugin_name ) );
$checker->add_plugin_require( $valid_plugin_name );
$this->assertTrue( $checker->are_requirements_met(), 'Plugin is activated so initial requirements should be met' );
$real_woocommerce_upgrade_url = '/wp-admin/update.php?action=upgrade-plugin&plugin=woocommerce%2Fwoocommerce.php&_wpnonce=263d805825';
$url = parse_url( $real_woocommerce_upgrade_url );
parse_str( $url['query'], $_GET );
$this->assertFalse( $checker->are_requirements_met(), 'Info about upgrade should switch result' );
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment