vindi/vindi-woocommerce

View on GitHub
src/validators/Dependencies.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace VindiPaymentGateways;

if (!function_exists('get_plugins')) {
    require_once(ABSPATH . 'wp-admin/includes/plugin.php');
}

class VindiDependencies
{
    /**
    * @var array
    */
    private static $active_plugins;

    /**
    * Init VindiDependencies.
    */
    public static function init()
    {
        self::$active_plugins = self::get_active_plugins();
    }

    private static function get_active_plugins()
    {
        if (!function_exists('get_plugin_data')) {
            return array();
        }

        $active_plugins = (array) get_option('active_plugins', array());
        if (is_multisite()) {
            $network_activated_plugins = array_keys(
                get_site_option('active_sitewide_plugins', array())
            );

            $active_plugins = array_merge($active_plugins, $network_activated_plugins);
        }

        $active_plugins_data = array();

        foreach ($active_plugins as $plugin) {
            $data                  = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin);
            $active_plugins_data[] = self::format_plugin_data($plugin, $data);
        }

        return $active_plugins_data;
    }

    private static function format_plugin_data($plugin, $data)
    {
        return array(
            'plugin'            => $plugin,
            'name'              => $data['Name'],
            'version'           => $data['Version'],
            'url'               => $data['PluginURI'],
            'author_name'       => $data['AuthorName'],
            'author_url'        => esc_url_raw($data['AuthorURI']),
            'network_activated' => $data['Network'],
        );
    }

    public static function is_wc_memberships_active()
    {
        $wc_memberships = 'woocommerce-memberships/woocommerce-memberships.php';
        if (is_plugin_active($wc_memberships)) {
            return true;
        }
        return false;
    }

    /**
    * Check required critical dependencies
    *
    * @return  boolean
    */
    public static function check_critical_dependencies()
    {
        $critical_dependencies = [
            [
                'name'    => 'PHP',
                'version' => [
                    'validation' => '>=',
                    'number'     => VINDI_MININUM_PHP_VERSION
                ]
            ],
            [
                'name'    => 'WordPress',
                'version' => [
                    'validation' => '>=',
                    'number'     => VINDI_MININUM_WP_VERSION
                ]
            ]
        ];

        $errors = [];

        foreach ($critical_dependencies as $dependency) {
            $version = $dependency['version'];

            if (!version_compare(PHP_VERSION, $version['number'], $version['validation'])) {
                $name   = $dependency['name'];
                $number = $version['number'];
                $notice = function () use ($name, $number) {
                    self::critical_dependency_missing_notice($name, $number);
                };

                add_action('admin_notices', $notice);
                array_push($errors, $plugin);
            }
        }

        if(!empty($errors)) {
            return false;
        }

        return true;
    }

    /**
    * Check required plugins
    *
    * @return  boolean
    */
    public static function check()
    {
        if(!self::check_critical_dependencies()) {
            return false;
        }

        if (!self::$active_plugins) {
            self::init();
        }

        $woocommerce_url = self::woocommerce_url();
        $ecfb_url = self::ecfb_url();

        $required_plugins = [
            [
                'path'    => 'woocommerce/woocommerce.php',
                'class'   => 'WooCommerce',
                'name'    => 'WooCommerce',
                'url'     =>  $woocommerce_url,
                'version' => [
                     'validation' => '>=',
                     'number' => '3.0'
                ]
            ],
            [
                'path'    =>
                    'woocommerce-extra-checkout-fields-for-brazil/woocommerce-extra-checkout-fields-for-brazil.php',
                'class'   => 'Extra_Checkout_Fields_For_Brazil',
                'name'    => 'Brazilian Market on WooCommerce',
                'url'     => $ecfb_url,
                'version' => [
                    'validation' => '>=',
                    'number' => '3.5'
                ]
            ],
            [
                'path'    => 'woocommerce-subscriptions/woocommerce-subscriptions.php',
                'class'   => 'WC_Subscriptions',
                'name'    => 'WooCommerce Subscription',
                'url'     => 'http://www.woothemes.com/products/woocommerce-subscriptions/',
                'version' => [
                    'validation' => '>=',
                    'number' => '2.6.1'
                ]
            ]
        ];

        return self::check_plugin_dependencies($required_plugins);
    }

    /**
    * Generate notice content
    *
    * @param string $name Plugin name
    * @param string $version Plugin version
    * @param string $link Plugin url
    *
    * @return  string
    */
    public static function missing_notice($name, $version, $link)
    {
        if (!is_admin() || !is_user_logged_in()) {
            return;
        }

        include plugin_dir_path(VINDI_SRC) . 'src/views/missing-dependency.php';
    }


    /**
    * Generate critical dependency notice content
    *
    * @param string $name Dependency name
    * @param string $version Dependency version
    *
    * @return  string
    */
    public static function critical_dependency_missing_notice($name, $version)
    {
        include plugin_dir_path(VINDI_SRC) . 'src/views/missing-critical-dependency.php';
    }

    private static function check_plugin_dependencies($required_plugins)
    {
        $checked = true;

        foreach ($required_plugins as $plugin) {
            $search = self::search_plugin($plugin, self::$active_plugins);

            if ($search &&
                version_compare(
                    $search['version'],
                    $plugin['version']['number'],
                    $plugin['version']['validation']
                )) {
                continue;
            }

            self::missing_notice(
                $plugin['name'],
                $plugin['version']['number'],
                $plugin['url']
            );

            $checked = false;
        }

        return $checked;
    }

    private static function search_plugin($required, $array)
    {
        foreach ($array as $val) {
            if ($val['plugin'] === $required['path'] && class_exists($required['class'])) {
                return $val;
            }
        }
        return null;
    }

    private static function woocommerce_url()
    {
        if (current_user_can('install_plugins')) {
            return wp_nonce_url(
                self_admin_url('update.php?action=install-plugin&plugin=woocommerce'),
                'install-plugin_woocommerce'
            );
        }

        return 'https://wordpress.org/extend/plugins/woocommerce/';
    }

    private static function ecfb_url()
    {
        if (current_user_can('install_plugins')) {
            return wp_nonce_url(
                self_admin_url(
                    'update.php?action=install-plugin&plugin=' .
                    'woocommerce-extra-checkout-fields-for-brazil'
                ),
                'install-plugin_woocommerce-extra-checkout-fields-for-brazil'
            );
        }

        return 'https://wordpress.org/extend/plugins/woocommerce-extra-checkout-fields-for-brazil/';
    }
}