<?php /** * The Compatibility Checker tool. * * @package Automattic/WooCommerce/Grow/Tools */ namespace Automattic\WooCommerce\Grow\Tools\CompatChecker\v0_0_1; use Automattic\WooCommerce\Grow\Tools\CompatChecker\v0_0_1\Checks\WPCompatibility; use Automattic\WooCommerce\Grow\Tools\CompatChecker\v0_0_1\Checks\WCCompatibility; defined( 'ABSPATH' ) || exit; /** * The CompatChecker main class. */ class Checker { /** * The Checker instance. * * @var Checker */ private static $instance; /** * The Plugin instance. * * @return Checker */ public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Parses the plugin contents to retrieve plugin's metadata. * * @param string $plugin_file The Absolute path to the main plugin file. * @param string $file_version The plugin file version. Can be the same as the plugin version. */ public function get_plugin_data( $plugin_file, $file_version ) { $default_headers = [ 'Name' => 'Plugin Name', 'Version' => 'Version', 'RequiresWP' => 'Requires at least', 'RequiresPHP' => 'Requires PHP', 'RequiresWC' => 'WC requires at least', 'TestedWP' => 'Tested up to', 'TestedWC' => 'WC tested up to', ]; $transient_key = 'wc_grow_compat_checker_' . plugin_basename( $plugin_file ) . $file_version; $plugin_data = get_transient( $transient_key ); if ( false === $plugin_data ) { $plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' ); $plugin_data['File'] = $plugin_file; set_transient( $transient_key, $plugin_data, MONTH_IN_SECONDS ); } return $plugin_data; } /** * Runs all compatibility checks. * * @param string $plugin_file_path The Absolute path to the main plugin file. * @param string $file_version The plugin file version. Can be the same as the plugin version. * * @return bool */ public function is_compatible( $plugin_file_path, $file_version ) { $checks = [ WPCompatibility::class, WCCompatibility::class, ]; $plugin_data = $this->get_plugin_data( $plugin_file_path, $file_version ); $plugin_basename = plugin_basename( $plugin_file_path ); // Remove dismissable notices on plugin deactivation. register_deactivation_hook( $plugin_file_path, [ WCCompatibility::instance( $plugin_basename ), 'remove_dismissable_notices', ] ); // Run all compatibility checks. foreach ( $checks as $compatibility ) { if ( ! $compatibility::instance( $plugin_basename )->is_compatible( $plugin_data ) ) { return false; } } return true; } }