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;
abstract class Core extends Base {
protected $in_display = false;
protected static $default_addon_cats = array();
protected static $required_plugins_status = array();
protected $addon_cats = array();
protected $addon_counts = array();
protected $addons = array();
protected $default_headers = array(
'file' => false,
'name' => '',
'url' => '',
'version' => '',
'description' => '',
'author' => '',
'author_url' => '',
'last_updated' => '',
'category' => '',
'required_plugins' => array(),
'screenshots' => array(),
);
protected $active_addons = false;
protected $headers = 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;
}
protected function search_addon( $addon ) {
$this->search_addons();
return ( isset( $this->addons[ $addon ] ) ) ? $this->addons[ $addon ] : false;
}
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,
'addon_url' => $url,
'addon_path' => $dir,
'is_internal' => $is_internal,
);
}
return $return;
}
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;
}
}
}
}
}
}
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;
}
protected function handle_last_updated( $last_updated ) {
return ( ! empty( $last_updated ) ) ? date( vsp_date_format(), strtotime( $last_updated ) ) : $last_updated;
}
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();
}
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;
}
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 );
}
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;
}
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();
}
}