diff --git a/CHANGELOG.md b/CHANGELOG.md index 851ec08b9a414fc4578c0b00c8e8af7d084c8493..7c435f8fb7ca21c36ac3299be2925b8b4e517956 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/src/Basic_Requirement_Checker.php b/src/Basic_Requirement_Checker.php index db1e6d5e8eeb3015ed0b84bd266100fadcbaa514..f68f7dae761b919f0abde94dffc1a8ba129118fc 100644 --- a/src/Basic_Requirement_Checker.php +++ b/src/Basic_Requirement_Checker.php @@ -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 “%s” plugin activating %s plugin. <a href="%s">Activate %s →</a>', + return sprintf( wp_kses( __( 'The “%s” 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 ); diff --git a/src/Basic_Requirement_Checker_Factory.php b/src/Basic_Requirement_Checker_Factory.php index 8ab7fdd1ea93d1194188d2692015ba1abcbc469c..b3fdd914dd5d1d1e4066499b3e923f6cf83878b4 100644 --- a/src/Basic_Requirement_Checker_Factory.php +++ b/src/Basic_Requirement_Checker_Factory.php @@ -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,32 +30,50 @@ 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'] ); - if ( isset( $requirements['plugins'] ) ) { - foreach ( $requirements['plugins'] as $requirement ) { - $requirements_checker->add_plugin_require( $requirement['name'], $requirement['nice_name'] ); - } - } + if ( isset( $requirements['plugins'] ) ) { + foreach ( $requirements['plugins'] as $requirement ) { + $requirements_checker->add_plugin_require( $requirement['name'], $requirement['nice_name'] ); + } + } + + 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'] ); + } + } - if ( isset( $requirements['modules'] ) ) { - foreach ( $requirements['modules'] as $requirement ) { - $requirements_checker->add_php_module_require( $requirement['name'], $requirement['nice_name'] ); - } - } + return $requirements_checker; + } - 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; + } } diff --git a/src/Basic_Requirement_Checker_With_Update_Disable.php b/src/Basic_Requirement_Checker_With_Update_Disable.php new file mode 100644 index 0000000000000000000000000000000000000000..aeaf871381680523dd8218e7d291bc669bf518c4 --- /dev/null +++ b/src/Basic_Requirement_Checker_With_Update_Disable.php @@ -0,0 +1,47 @@ +<?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 “%s” 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 diff --git a/tests/unit/Test_Basic_Requirement_Checker_With_Update_Disable.php b/tests/unit/Test_Basic_Requirement_Checker_With_Update_Disable.php new file mode 100644 index 0000000000000000000000000000000000000000..ce3d688f1ea514b93196ae8b8800729fa511847a --- /dev/null +++ b/tests/unit/Test_Basic_Requirement_Checker_With_Update_Disable.php @@ -0,0 +1,42 @@ +<?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' ); + } +}