• File: Plugin.php
  • Full Path: /home/matthif/www/wp-content/plugins/optinmonster/OMAPI/Plugins/Plugin.php
  • Date Modified: 01/24/2025 1:58 PM
  • File size: 5.99 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
/**
 * AM Plugins Plugin class.
 *
 * @since 2.10.0
 *
 * @package OMAPI
 * @author  Justin Sternberg
 */

// Exit if accessed directly.
if ( ! defined'ABSPATH' ) ) {
    exit;
}

/**
 * AM Plugins class.
 *
 * @since 2.10.0
 */
class OMAPI_Plugins_Plugin implements JsonSerializableArrayAccess {

    
/**
     * Plugin registry.
     *
     * @since 2.10.0
     *
     * @var OMAPI_Plugins_Plugin[]
     */
    
protected static $plugins = array();

    
/**
     * The plugin id.
     *
     * @since 2.10.0
     *
     * @var string
     */
    
protected $id '';

    
/**
     * Array of plugin data.
     *
     * @since 2.10.0
     *
     * @var array
     */
    
protected $plugin_data = array();

    
/**
     * Constructor
     *
     * @since 2.10.0
     *
     * @param string        $plugin_id The plugin id.
     * @param OMAPI_Plugins $plugins   The Plugins object instance.
     *
     * @return void
     * @throws Exception When ID is not found in plugins data.
     */
    
protected function __construct$plugin_idOMAPI_Plugins $plugins ) {
        
$this->id $plugin_id;
        
$data     $plugins->get_list();
        if ( empty( 
$data$this->id ] ) ) {
            throw new 
Exception'Plugin info not found.' );
        }

        
$this->plugin_data $data$this->id ];
        
$this->get_data();

        
self::$plugins$this->id ] = $this;
    }

    
/**
     * Get instance of the Plugin and store it.
     *
     * @since 2.10.0
     *
     * @param string $id The plugin ID.
     *
     * @return OMAPI_Plugins_Plugin
     */
    
public static function get$id ) {
        static 
$plugins null;
        if ( 
null === $plugins ) {
            
$plugins = new OMAPI_Plugins();
        }

        if ( ! isset( 
self::$plugins$id ] ) ) {
            new 
self$id$plugins );
        }

        return 
self::$plugins$id ];
    }

    
/**
     * Gets the info for this AM plugin.
     *
     * @since 2.10.0
     *
     * @return array plugin data.
     */
    
public function get_data() {
        if ( ! isset( 
$this->plugin_data['status'] ) ) {
            
$this->add_status_data();
        }

        return 
$this->plugin_data;
    }

    
/**
     * Check if plugin is active/installed.
     *
     * @since 2.10.0
     *
     * @return self
     */
    
public function add_status_data() {
        list( 
$installed$active$which ) = $this->exists_checks();

        
$this->plugin_data['status'] = ! $installed
            
__'Not Installed''optin-monster-api' )
            : (
                
$active
                    
__'Active''optin-monster-api' )
                    : 
__'Inactive''optin-monster-api' )
            );

        
$this->plugin_data['installed'] = $installed;
        
$this->plugin_data['active']    = $installed && $active;
        
$this->plugin_data['which']     = $which;

        return 
$this;
    }

    
/**
     * Check if plugin is active/installed.
     *
     * @since 2.10.0
     *
     * @return array
     */
    
protected function exists_checks() {

        
// Check if plugin is active by checking if class/function/constant exists.
        // This gets around limitations with the normal `is_plugin_active` checks.
        // Those limitations include:
        // - The install path could be modified (e.g. using -beta version, or version downloaded from github)
        // - The plugin is considered "active", but the actual plugin has been deleted from the server.
        
$active $this->plugin_code_exists_checks();

        
// Otherwise, check if it exists in the list of plugins.
        
$which     $this->is_installed();
        
$installed = ! empty( $which );

        return array( 
$installed$active$which );
    }

    
/**
     * Check if plugin is active via code checks.
     *
     * @since 2.10.0
     *
     * @return bool
     */
    
protected function plugin_code_exists_checks() {

        
// Loop through all checks.
        
foreach ( $this->plugin_data['check'] as $check_type => $to_check ) {

            
// Now loop through all the things to checks.
            
foreach ( (array) $to_check as $thing_to_check ) {
                switch ( 
$check_type ) {
                    case 
'function':
                        if ( 
function_exists$thing_to_check ) ) {
                            return 
true;
                        }
                        break;
                    case 
'class':
                        if ( 
class_exists$thing_to_check ) ) {
                            return 
true;
                        }
                        break;
                    case 
'constant':
                        if ( 
defined$thing_to_check ) ) {
                            return 
true;
                        }
                        break;
                }
            }
        }

        return 
false;
    }

    
/**
     * Check if plugin is installed (exists in array of plugin data).
     *
     * @since 2.10.0
     *
     * @return bool|string
     */
    
protected function is_installed() {
        static 
$all_plugins null;

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

            
$all_plugins get_plugins();
        }

        if ( ! empty( 
$this->plugin_data['pro']['plugin'] ) ) {
            if ( 
false !== strpos$this->plugin_data['pro']['plugin'], '~' ) ) {
                foreach ( 
$all_plugins as $key => $data ) {
                    if ( 
preg_match$this->plugin_data['pro']['plugin'], $key ) ) {
                        return 
$key;
                    }
                }
            } elseif ( 
array_key_exists$this->plugin_data['pro']['plugin'], $all_plugins ) ) {
                return 
$this->plugin_data['pro']['plugin'];
            }
        }

        if ( 
array_key_exists$this->plugin_data['id'], $all_plugins ) ) {
            return 
'default';
        }

        return 
false;
    }


    
/**
     * Whether an offset exists.
     *
     * @since 2.10.0
     *
     * @param  mixed $offset An offset to check for.
     *
     * @return bool
     */
    
#[\ReturnTypeWillChange]
    public function 
offsetExists$offset ) {
        return isset( 
$this->plugin_data$offset ] );
    }

    
/**
     * Offset to retrieve.
     *
     * @since 2.10.0
     *
     * @param  mixed $offset The offset to retrieve.
     *
     * @return mixed
     */
    
#[\ReturnTypeWillChange]
    public function 
offsetGet$offset ) {
        return isset( 
$this->plugin_data$offset ] ) ? $this->plugin_data$offset ] : null;
    }

    
/**
     * Assign a value to the specified offset (N/A).
     *
     * @since 2.10.0
     *
     * @param  mixed $offset The offset to assign the value to (N/A).
     * @param  mixed $value  The value to set (N/A).
     *
     * @return void
     */
    
#[\ReturnTypeWillChange]
    public function 
offsetSet$offset$value ) {}

    
/**
     * Unset an offset
     *
     * @since 2.10.0
     *
     * @param  mixed $offset The offset to unset (N/A).
     *
     * @return void
     */
    
#[\ReturnTypeWillChange]
    public function 
offsetUnset$offset ) {}

    
/**
     * Specify data which should be serialized to JSON
     *
     * @since 2.10.0
     *
     * @return mixed
     */
    
#[\ReturnTypeWillChange]
    public function 
jsonSerialize() {
        return 
$this->plugin_data;
    }
}