HEX
Server: Apache
System: Linux vps.rockyroadprinting.net 4.18.0 #1 SMP Mon Sep 30 15:36:27 MSK 2024 x86_64
User: rockyroadprintin (1011)
PHP: 8.2.29
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/rockyroadprintin/public_html/wp-content/themes/consulting/admin/classes/stm-theme-plugins.php
<?php

class STM_Theme_Plugins {

	public static function init() {
		add_action( 'wp_ajax_stm_install_plugin', [ self::class, 'install_plugin' ] );
	}

	public static function install_plugin() {
		check_ajax_referer('stm_install_plugin', 'security');

		$result         = [];
		$layout_plugins = [];
		$layout         = sanitize_text_field( $_GET['layout'] );
		$builder        = sanitize_text_field( $_GET['builder'] );
		$plugin_slug    = sanitize_text_field( $_GET['plugin'] );
		$plugins        = apply_filters( 'stm_theme_plugins', [] );
		$layout_config  = apply_filters( 'stm_theme_layout_plugins', $layout );
		$layout_config  = self::get_builder( $layout_config, $builder );

		foreach ( $plugins as $plugin_name => $plugin_info ) {
			if ( in_array( $plugin_name, $layout_config ) ) {
				$layout_plugins[$plugin_name] = $plugin_info;
			}
		}

		$plugins = $layout_plugins;

		if ( ! current_user_can('install_plugins') ) {
			return;
		}

		/** if install demo */
		if ( $plugin_slug === 'import_demo' ) {
			$result['import_demo'] = true;
			wp_send_json($result);
		}

		/** No plugin */
		if ( empty( $plugin_slug ) and ! empty( $plugins[ $plugin_slug ] ) ) {
			wp_send_json([ 'error' => 'Error occured' ]);
			exit;
		}

		self::load_wp();

		$plugin_upgrader    = new Plugin_Upgrader( new STM_Plugin_Upgrader_Skin([ 'plugin' => $plugin_slug ]) );
		$plugin_info        = $plugins[ $plugin_slug ];
		$source             = self::get_plugin_source($plugin_info);
		$next               = self::get_next_plugin($plugins, $plugin_slug);

		if ( ! empty( $source ) ) {
			$installed          = ( self::plugin_is_active($plugin_slug) ) ? true : $plugin_upgrader->install($source);
			$result['source']   = $source;

			if ( is_wp_error( $installed ) ) {
				$result['error'] = $installed->get_error_message();
			} else {
				if ( ! empty( $next ) ) {
					$result['next'] = $next['slug'];
				}

				self::activate_plugin($plugin_slug);

				$result['installed'] = true;
				$result['activated'] = true;
				$result['plugin_slug'] = $plugin_slug;
			}
		}

		if ( end($plugins) === $plugin_info ) {
			$result['import_demo'] = true;
		}

		wp_send_json($result);
		exit;
	}

	public static function load_wp() {
		require_once ABSPATH . 'wp-load.php';
		require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
		require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
		require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
		require_once ABSPATH . 'wp-admin/includes/plugin.php';
		require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';
		require_once get_template_directory() . '/admin/classes/stm-plugin-upgrader-skin.php';
	}

	public static function get_builder( $plugins, $builder ) {
		if ( ! empty( $builder ) ) {
			$plugins[]      = $builder;
			$builder_addon  = apply_filters('stm_theme_elementor_addon', '');

			if ( $builder === 'elementor' && ! empty( $builder_addon ) ) {
				$plugins[] = $builder_addon;
			}
		}

		return $plugins;
	}

	public static function get_plugin_source( $plugin_info ) {
		$source = '';

		if ( ! empty( $plugin_info['source'] ) ) {
			$source = $plugin_info['source'];
		} else {
			$response = plugins_api('plugin_information', [ 'slug' => $plugin_info['slug'] ]);
			if ( ! is_wp_error( $response ) and ! empty( $response->download_link ) ) {
				$source = $response->download_link;
			}
		}

		return $source;
	}

	public static function get_next_plugin( $array, $key ) {
		$currentKey = key($array);
		while ( $currentKey !== null && $currentKey != $key ) {
			next($array);
			$currentKey = key($array);
		}
		return next($array);
	}

	public static function activate_plugin( $slug ) {
		activate_plugin( self::get_plugin_main_path($slug) );
	}

	public static function plugin_is_active( $slug ) {
		if ( strpos( $slug, '.php' ) === false ) {
			$slug = self::get_plugin_main_path($slug);
		}
		return in_array( $slug, (array) get_option('active_plugins', []) ) || is_plugin_active_for_network($slug);
	}

	public static function get_plugin_main_path( $slug ) {
		$plugin_data = get_plugins('/' . $slug);
		if ( ! empty( $plugin_data ) ) {
			$plugin_file = array_keys($plugin_data);
			$plugin_path = $slug . '/' . $plugin_file[0];
		} else {
			$plugin_path = false;
		}

		return $plugin_path;
	}

	public static function secondary_required_plugins() {
		return apply_filters('stm_theme_secondary_required_plugins', []);
	}

}