Overview

Namespaces

  • None
  • VSP
    • Core
      • Abstracts
      • Interfaces
      • Traits
        • WC_Compatibility
    • Deprecation
    • Helper
    • Modules
      • Addons
      • Logger

Classes

  • VSP\Ajax
  • VSP\Ajaxer
  • VSP\Base
  • VSP\Cache
  • VSP\Core\Abstracts\Addon
  • VSP\Core\Abstracts\Log_Handler
  • VSP\Core\Abstracts\Plugin_Settings
  • VSP\Core\Instance_Handler
  • VSP\Deprecation\Actions
  • VSP\Deprecation\Filters
  • VSP\Error
  • VSP\Framework
  • VSP\Framework_Admin
  • VSP\Framework_Base
  • VSP\Framework_Modules
  • VSP\Helper
  • VSP\Helper\Price_Calculation
  • VSP\Modules\Addons
  • VSP\Modules\Addons\Admin
  • VSP\Modules\Addons\Core
  • VSP\Modules\Logger
  • VSP\Modules\Logger\File_Handler
  • VSP\Modules\Logger\Levels
  • VSP\Modules\Shortcode
  • VSP\Modules\System_Logs
  • VSP\Modules\System_Tools
  • VSP\Modules\WPOnion
  • VSP\Setup
  • VSP\WC_Compatibility
  • VSP_Framework_Loader

Interfaces

  • VSP\Core\Interfaces\Log_Handler
  • VSP\Core\Interfaces\Logger

Traits

  • VSP\Core\Traits\Array_Helper
  • VSP\Core\Traits\Framework
  • VSP\Core\Traits\String_Helper
  • VSP\Core\Traits\URL
  • VSP\Core\Traits\WC_Compatibility\Product
  • VSP\Core\Traits\WC_Compatibility\Version
  • VSP\Core\Traits\WC_Helper
  • VSP\Core\Traits\WP

Functions

  • vsp_add_wc_required_notice
  • vsp_ajax_action
  • vsp_current_screen
  • vsp_date_format
  • vsp_delete_cache
  • vsp_doing_it_wrong
  • vsp_force_load
  • vsp_force_load_vendors
  • vsp_get_cache
  • vsp_get_cache_defaults
  • vsp_get_file_paths
  • vsp_get_logger
  • vsp_get_time_in_seconds
  • vsp_is_admin
  • vsp_is_ajax
  • vsp_is_cron
  • vsp_is_error
  • vsp_is_frontend
  • vsp_is_heartbeat
  • vsp_is_json
  • vsp_is_request
  • vsp_is_screen
  • vsp_json_last_error
  • vsp_list_files
  • vsp_list_log_files
  • vsp_load_core_assets
  • vsp_load_file
  • vsp_log_msg
  • vsp_logger
  • vsp_make_log_list_tree
  • vsp_maybe_load
  • vsp_placeholder_img
  • vsp_print_log_files_ui
  • vsp_register_assets
  • vsp_register_plugin
  • vsp_send_callback_error
  • vsp_send_callback_success
  • vsp_send_json_callback
  • vsp_set_cache
  • vsp_set_time_limit
  • vsp_slashit
  • vsp_time_format
  • vsp_unslashit
  • vsp_url
  • vsp_validate_required_plugin
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 
<?php

namespace VSP\Modules\Addons;

defined( 'ABSPATH' ) || exit;

use VSP\Base;

/**
 * Class Core
 *
 * @package VSP\Modules\Addons
 * @author Varun Sridharan <varunsridharan23@gmail.com>
 */
abstract class Core extends Base {
    /**
     * Set To True If its in Display Mode.
     *
     * @var bool
     */
    protected $in_display = false;

    /**
     * Stores Default Categories.
     *
     * @var array
     */
    protected static $default_addon_cats = array();

    /**
     * Stores Required Plugins Status.
     *
     * @var array
     */
    protected static $required_plugins_status = array();

    /**
     * Stores Addon Categorys List.
     *
     * @var array
     */
    protected $addon_cats = array();

    /**
     * Stores All Adodns Count.
     *
     * @var array
     */
    protected $addon_counts = array();

    /**
     * Stores All Addon Information
     *
     * @var array
     */
    protected $addons = array();

    /**
     * Stores Default Headers.
     *
     * @var array
     */
    protected $default_headers = array(
        'file'             => false,
        'name'             => '',
        'url'              => '',
        'version'          => '',
        'description'      => '',
        'author'           => '',
        'author_url'       => '',
        'last_updated'     => '',
        'category'         => '',
        'required_plugins' => array(),
        'screenshots'      => array(),
    );

    /**
     * Stores All Active Addons.
     *
     * @var array
     */
    protected $active_addons = false;

    /**
     * @var array
     */
    protected $headers = array();

    /**
     * Searchs For Addons.
     *
     * @return array
     */
    protected function search_addons() {
        $slug = $this->plugin();
        $dirs = apply_filters( $slug->slug( 'hook' ) . '/addons/dirs', array( $this->option( 'base_path' ) ) );

        if ( ! empty( $dirs ) ) {
            foreach ( $dirs as $dir ) {
                $addons = $this->search_addon_folder( $dir );
                if ( ! empty( $addons ) ) {
                    $this->get_addons_informations( $addons );
                }
            }
        }
        return $this->addons;
    }

    /**
     * Returns Only Selected Addon.
     *
     * @param string $addon
     *
     * @return bool|mixed
     */
    protected function search_addon( $addon ) {
        $this->search_addons();
        return ( isset( $this->addons[ $addon ] ) ) ? $this->addons[ $addon ] : false;
    }

    /**
     * Search For Addons in given folder.
     *
     * @param string $dir
     *
     * @return array
     */
    protected function search_addon_folder( $dir ) {
        $is_internal = ( vsp_unslashit( $dir ) === vsp_unslashit( $this->option( 'base_path' ) ) );
        $files       = vsp_get_file_paths( vsp_slashit( $dir ) . '*/addon.json' );
        $return      = array();
        foreach ( $files as $file ) {
            $dir = plugin_dir_path( $file );
            $url = plugin_dir_url( $file );
            $uid = md5( $dir );

            $return[ $uid ] = array(
                'uid'         => $uid, // Plugin UID MD5 Path
                'addon_url'   => $url, // Addon URL
                'addon_path'  => $dir, // Addon Path
                'is_internal' => $is_internal, //if the addon is an internal addon found in the main plugin itself
            );
        }
        return $return;
    }

    /**
     * Checks and returns addon information.
     *
     * @param array $addons
     */
    protected function get_addons_informations( $addons ) {
        if ( ! empty( $addons ) ) {
            foreach ( $addons as $addon ) {
                if ( isset( $addon['addon_path'] ) ) {
                    $data = $this->get_addon_information( $addon );
                    if ( ! empty( $data ) ) {
                        if ( ! isset( $this->addons[ $data['uid'] ] ) ) {
                            $this->addons[ $data['uid'] ] = $data;
                        }
                    }
                }
            }
        }
    }

    /**
     * Read's Addon's Information.
     *
     * @param array $addon
     *
     * @return array
     */
    protected function get_addon_information( $addon ) {
        $data = $this->read_addon_json( $addon['addon_path'] );

        if ( empty( $data['file'] ) && file_exists( $addon['addon_path'] . '/addon.php' ) ) {
            $data['file'] = 'addon.php';
        }

        if ( ! empty( $data ) && ! empty( $data['file'] ) ) {
            $data                               = $this->parse_args( $data, $addon );
            $data['required_plugins']           = ( isset( $data['required_plugins'] ) ) ? $data['required_plugins'] : array();
            $data['required_plugins']           = $this->handle_required_plugins( $data['required_plugins'] );
            $data['required_plugins_fulfilled'] = 0;
            $total                              = count( $data['required_plugins'] );
            foreach ( $data['required_plugins'] as $plugins ) {
                if ( 'active' === $plugins['status'] ) {
                    $data['required_plugins_fulfilled'] = $data['required_plugins_fulfilled'] + 1;
                }
            }
            $data['required_plugins_fulfilled'] = ( $data['required_plugins_fulfilled'] > 0 && $total === $data['required_plugins_fulfilled'] );

            if ( $this->in_display ) {
                $data['category']     = ( isset( $data['category'] ) ) ? $data['category'] : array();
                $data['category']     = $this->handle_category( $data['category'] );
                $data['screenshots']  = ( isset( $data['screenshots'] ) ) ? $data['screenshots'] : array();
                $data['screenshots']  = $this->handle_screenshots( $data['screenshots'], $data );
                $data['icon']         = ( isset( $data['icon'] ) ) ? $data['icon'] : 'icon.png';
                $data['icon']         = $this->handle_icon( $data['icon'], $addon );
                $data['last_updated'] = $this->handle_last_updated( $data['last_updated'] );
            }
        } else {
            return array();
        }
        return $data;
    }

    /**
     * Handles Date Format.
     *
     * @param string $last_updated
     *
     * @return string
     */
    protected function handle_last_updated( $last_updated ) {
        return ( ! empty( $last_updated ) ) ? date( vsp_date_format(), strtotime( $last_updated ) ) : $last_updated;
    }

    /**
     * Handles Addon Icon.
     *
     * @param string $icon
     * @param array  $addon
     *
     * @return string
     */
    protected function handle_icon( $icon, $addon ) {
        if ( $icon ) {
            if ( true !== wponion_is_url( $icon ) && file_exists( $addon['addon_path'] . $icon ) ) {
                return $addon['addon_url'] . $icon;
            } elseif ( true === wponion_is_url( $icon ) ) {
                return $icon;
            }
        }
        return vsp_placeholder_img();
    }

    /**
     * Handles Each Addons Required Plugins.
     *
     * @param array $plugins
     *
     * @return mixed
     */
    protected function handle_required_plugins( $plugins ) {
        if ( ! empty( $plugins ) ) {
            foreach ( $plugins as $slug => $plugin ) {
                $plugins[ $slug ] = $this->parse_args( $plugin, array(
                    'name'    => null,
                    'author'  => null,
                    'version' => null,
                    'url'     => null,
                ) );

                if ( false === wp_is_plugin_installed( $slug ) ) {
                    $plugins[ $slug ]['status'] = 'notexists';
                } elseif ( wp_is_plugin_inactive( $slug ) ) {
                    $plugins[ $slug ]['status'] = 'exists';
                } elseif ( wp_is_plugin_active( $slug ) ) {
                    $plugins[ $slug ]['status'] = 'active';
                }
            }
        }
        return $plugins;
    }

    /**
     * Handles Addon Category.
     *
     * @param array|string $category
     *
     * @return array
     */
    protected function handle_category( $category ) {
        if ( empty( $category ) ) {
            return array( 'general', 'all' );
        }
        $category = ( is_string( $category ) ) ? explode( ',', $category ) : $category;
        $new      = array( 'all' );

        foreach ( $category as $cat ) {
            $sub_cats = explode( ',', $cat );
            foreach ( $sub_cats as $_cat ) {
                $_cat = trim( $_cat );
                $slug = sanitize_title( $_cat );
                if ( ! isset( $this->addon_cats[ $slug ] ) ) {
                    $this->addon_cats[ $slug ]   = $_cat;
                    $this->addon_counts[ $slug ] = 0;
                }
                $this->addon_counts[ $slug ]++;
                $new[] = $slug;
            }
        }
        return array_unique( $new );
    }

    /**
     * Handles Addon Screenshots.
     *
     * @param array $screenshots
     * @param array $addon
     *
     * @return mixed
     */
    protected function handle_screenshots( $screenshots, $addon ) {
        if ( ! empty( $screenshots ) && is_array( $screenshots ) ) {
            $return = array();
            foreach ( $screenshots as $key => $screenshot ) {
                $s       = explode( '|', $screenshot, 2 );
                $src     = false;
                $content = false;
                if ( isset( $s[0] ) && isset( $s[1] ) ) {
                    $content = $s[1];
                    if ( true !== wponion_is_url( $s[0] ) && file_exists( $addon['addon_path'] . $s[0] ) ) {
                        $src = $addon['addon_url'] . $s[0];
                    } elseif ( true === wponion_is_url( $s[0] ) ) {
                        $src = $s[0];
                    }
                } elseif ( isset( $s[0] ) && ! isset( $s[1] ) ) {
                    if ( true !== wponion_is_url( $s[0] ) && file_exists( $addon['addon_path'] . $s[0] ) ) {
                        $src = $addon['addon_url'] . $s[0];
                    } elseif ( true === wponion_is_url( $s[0] ) ) {
                        $src = $s[0];
                    }
                }

                $return[] = array(
                    'src'     => $src,
                    'content' => $content,
                );
            }
            return $return;
        }
        return $screenshots;
    }

    /**
     * Reads Addon's JSON file.
     *
     * @param string $path addon json file path.
     * @param bool   $raw If set to true then it returns raw information that is passed in addon.json
     *
     * @return array|mixed|object
     */
    protected function read_addon_json( $path, $raw = false ) {
        $return = array();
        if ( file_exists( vsp_slashit( $path ) . 'addon.json' ) ) {
            $return = json_decode( @file_get_contents( vsp_slashit( $path ) . 'addon.json' ), true );
            if ( false === $raw && is_array( $return ) && ! empty( $return ) ) {
                $return = $this->parse_args( $return, $this->headers );
            }
        }
        return ( is_array( $return ) && ! empty( $return ) ) ? $return : array();
    }
}
API documentation generated by ApiGen