Skip to content
Snippets Groups Projects
class-plugin.php 4.14 KiB
Newer Older
Lucas García's avatar
Lucas García committed
<?php

namespace WPCT_ABSTRACT;
Lucas García's avatar
Lucas García committed

use Exception;
Lucas García's avatar
Lucas García committed
use ReflectionClass;
Lucas García's avatar
Lucas García committed

if (!class_exists('\WPCT_ABSTRACT\Plugin')) :
Lucas García's avatar
Lucas García committed

    abstract class Plugin extends Singleton
    {
Lucas García's avatar
Lucas García committed
        protected static $menu_class;

        public static $textdomain;
        public static $name;

Lucas García's avatar
Lucas García committed
        private $menu;
Lucas García's avatar
Lucas García committed

        abstract public function init();
Lucas García's avatar
Lucas García committed

        abstract public static function activate();
Lucas García's avatar
Lucas García committed

        abstract public static function deactivate();
Lucas García's avatar
Lucas García committed

        public function __construct()
        {
Lucas García's avatar
Lucas García committed
            if (empty(static::$name) || empty(static::$textdomain)) {
                throw new Exception('Bad plugin initialization');
            }
Lucas García's avatar
Lucas García committed

Lucas García's avatar
Lucas García committed
            if (static::$menu_class && $this->is_active()) {
Lucas García's avatar
Lucas García committed
                $this->menu = static::$menu_class::get_instance(static::$name, static::$textdomain);
            }
Lucas García's avatar
Lucas García committed

            add_action('init', [$this, 'init'], 10);
            add_action('init', function () {
                $this->load_textdomain();
            }, 5);
Lucas García's avatar
Lucas García committed

            add_filter('load_textdomain_mofile', function ($mofile, $domain) {
                return $this->load_mofile($mofile, $domain);
            }, 10, 2);
        }
Lucas García's avatar
Lucas García committed

        public function get_menu()
        {
            return $this->menu;
        public function get_name()
        {
Lucas García's avatar
Lucas García committed
            return static::$name;
Lucas García's avatar
Lucas García committed

        public function get_index()
        {
Lucas García's avatar
Lucas García committed
            $reflector = new ReflectionClass(get_class($this));
            $fn = $reflector->getFileName();
            return plugin_basename($fn);
        }

        public function get_textdomain()
        {
Lucas García's avatar
Lucas García committed
            return static::$textdomain;
        }

        public function get_data()
        {
            include_once(ABSPATH . 'wp-admin/includes/plugin.php');
            $plugins = get_plugins();
            $plugin_name = $this->get_index();
            foreach ($plugins as $plugin => $data) {
                if ($plugin === $plugin_name) {
                    return $data;
                }
Lucas García's avatar
Lucas García committed

Lucas García's avatar
Lucas García committed
        public function is_active()
        {
            return apply_filters('wpct_is_plugin_active', false, $this->get_index());
        }

        private function load_textdomain()
        {
            $data = $this->get_data();
            $domain_path = isset($data['DomainPath']) && !empty($data['DomainPath']) ? $data['DomainPath'] : '/languages';
Lucas García's avatar
Lucas García committed

            load_plugin_textdomain(
Lucas García's avatar
Lucas García committed
                static::$textdomain,
Lucas García's avatar
Lucas García committed
                dirname($this->get_index()) . $domain_path,
Lucas García's avatar
Lucas García committed

        private function load_mofile($mofile, $domain)
        {
Lucas García's avatar
Lucas García committed
            if ($domain === static::$textdomain && strpos($mofile, WP_LANG_DIR . '/plugins/') === false) {
Lucas García's avatar
Lucas García committed
                $data = $this->get_data();
                $domain_path = isset($data['DomainPath']) && !empty($data['DomainPath']) ? $data['DomainPath'] : '/languages';

                $locale = apply_filters('plugin_locale', determine_locale(), $domain);
Lucas García's avatar
Lucas García committed
                $mofile = WP_PLUGIN_DIR . '/' . dirname($this->get_index()) . $domain_path . '/' . $domain . '-' . $locale . '.mo';
Lucas García's avatar
Lucas García committed
        }
Lucas García's avatar
Lucas García committed
endif;
Lucas García's avatar
Lucas García committed
if (!function_exists('\WPCT_ABSTRACT\is_plugin_active')) :
    add_filter('wpct_is_plugin_active', '\WPCT_ABSTRACT\is_plugin_active', 10, 2);
    function is_plugin_active($_, $plugin_name)
Lucas García's avatar
Lucas García committed
    {
        include_once(ABSPATH . 'wp-admin/includes/plugin.php');
        $plugins = get_plugins();

        if (is_multisite()) {
            $actives = apply_filters('active_plugins', array_map(function ($plugin_path) {
                return plugin_basename($plugin_path);
            }, wp_get_active_network_plugins()));
        } else {
            $actives = apply_filters('active_plugins', get_option('active_plugins'));
Lucas García's avatar
Lucas García committed

        $actives = array_reduce(array_keys($plugins), function ($carry, $plugin_path) use ($plugins, $actives) {
            if (in_array($plugin_path, $actives)) {
                $carry[$plugin_path] = $plugins[$plugin_path];
            }

            return $carry;
        }, []);

        $plugin_name = plugin_basename($plugin_name);
        return in_array($plugin_name, array_keys($actives));
Lucas García's avatar
Lucas García committed
    }