at path:
ROOT
/
wp-content
/
plugins
/
woocommerce
/
src
/
Admin
/
API
/
Themes.php
run:
R
W
Run
AI
DIR
2026-04-15 05:42:45
R
W
Run
Reports
DIR
2026-04-15 05:42:45
R
W
Run
Templates
DIR
2026-04-15 05:42:45
R
W
Run
AnalyticsImports.php
9.09 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Coupons.php
2.15 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
CustomAttributeTraits.php
3.4 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Customers.php
2.11 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Data.php
939 By
2026-04-15 05:42:45
R
W
Run
Delete
Rename
DataCountries.php
1.12 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
DataDownloadIPs.php
4.15 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Experiments.php
1.82 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Features.php
1.7 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Init.php
10.57 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
LaunchYourStore.php
5.15 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Leaderboards.php
18.22 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Marketing.php
4.84 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
MarketingCampaignTypes.php
6.02 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
MarketingCampaigns.php
9.64 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
MarketingChannels.php
5.74 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
MarketingOverview.php
3.36 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
MarketingRecommendations.php
5.94 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
MobileAppMagicLink.php
2.1 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
NoteActions.php
2.39 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Notes.php
25.32 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Notice.php
2.38 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
OnboardingFreeExtensions.php
2.58 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
OnboardingPlugins.php
10.66 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
OnboardingProductTypes.php
1.8 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
OnboardingProducts.php
1.94 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
OnboardingProfile.php
18.38 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
OnboardingTasks.php
32.02 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
OnboardingThemes.php
5.49 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Options.php
10 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Orders.php
10.13 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
PaymentGatewaySuggestions.php
5.86 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Plugins.php
21.22 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ProductAttributeTerms.php
4.36 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ProductAttributes.php
4.46 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ProductCategories.php
458 By
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ProductForm.php
3.06 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ProductReviews.php
1.3 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ProductVariations.php
6.03 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Products.php
9.73 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ProductsLowInStock.php
17.62 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
SettingOptions.php
878 By
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Settings.php
4.2 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
ShippingPartnerSuggestions.php
6.09 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Taxes.php
4.9 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
Themes.php
6.12 KB
2026-04-15 05:42:45
R
W
Run
Delete
Rename
error_log
up
📄
Themes.php
Save
<?php /** * REST API Themes Controller * * Handles requests to /themes */ namespace Automattic\WooCommerce\Admin\API; defined( 'ABSPATH' ) || exit; use Automattic\WooCommerce\Admin\Overrides\ThemeUpgrader; use Automattic\WooCommerce\Admin\Overrides\ThemeUpgraderSkin; /** * Themes controller. * * @internal * @extends WC_REST_Data_Controller */ class Themes extends \WC_REST_Data_Controller { /** * Endpoint namespace. * * @var string */ protected $namespace = 'wc-admin'; /** * Route base. * * @var string */ protected $rest_base = 'themes'; /** * Register routes. */ public function register_routes() { register_rest_route( $this->namespace, '/' . $this->rest_base, array( array( 'methods' => \WP_REST_Server::EDITABLE, 'callback' => array( $this, 'upload_theme' ), 'permission_callback' => array( $this, 'upload_theme_permissions_check' ), 'args' => $this->get_collection_params(), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); } /** * Check whether a given request has permission to edit upload plugins/themes. * * @param WP_REST_Request $request Full details about the request. * @return WP_Error|boolean */ public function upload_theme_permissions_check( $request ) { if ( ! current_user_can( 'upload_themes' ) ) { return new \WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you are not allowed to install themes on this site.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** * Upload and install a theme. * * @param WP_REST_Request $request Request data. * @return WP_Error|WP_REST_Response */ public function upload_theme( $request ) { if ( ! isset( $_FILES['pluginzip'] ) || ! isset( $_FILES['pluginzip']['tmp_name'] ) || ! is_uploaded_file( $_FILES['pluginzip']['tmp_name'] ) || ! is_file( $_FILES['pluginzip']['tmp_name'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized return new \WP_Error( 'woocommerce_rest_invalid_file', __( 'Specified file failed upload test.', 'woocommerce' ) ); } include_once ABSPATH . 'wp-admin/includes/file.php'; include_once ABSPATH . '/wp-admin/includes/admin.php'; include_once ABSPATH . '/wp-admin/includes/theme-install.php'; include_once ABSPATH . '/wp-admin/includes/theme.php'; include_once ABSPATH . '/wp-admin/includes/class-wp-upgrader.php'; include_once ABSPATH . '/wp-admin/includes/class-theme-upgrader.php'; $_GET['package'] = true; $file_upload = new \File_Upload_Upgrader( 'pluginzip', 'package' ); $upgrader = new ThemeUpgrader( new ThemeUpgraderSkin() ); $install = $upgrader->install( $file_upload->package ); if ( $install || is_wp_error( $install ) ) { $file_upload->cleanup(); } if ( ! is_wp_error( $install ) && isset( $install['destination_name'] ) ) { $theme = $install['destination_name']; $result = array( 'status' => 'success', 'message' => $upgrader->strings['process_success'], 'theme' => $theme, ); /** * Fires when a theme is successfully installed. * * @param string $theme The theme name. */ do_action( 'woocommerce_theme_installed', $theme ); } else { if ( is_wp_error( $install ) && $install->get_error_code() ) { $error_message = isset( $upgrader->strings[ $install->get_error_code() ] ) ? $upgrader->strings[ $install->get_error_code() ] : $install->get_error_data(); } else { $error_message = $upgrader->strings['process_failed']; } $result = array( 'status' => 'error', 'message' => $error_message, ); } $response = $this->prepare_item_for_response( $result, $request ); $data = $this->prepare_response_for_collection( $response ); return rest_ensure_response( $data ); } /** * Prepare the data object for response. * * @param object $item Data object. * @param WP_REST_Request $request Request object. * @return WP_REST_Response $response Response data. */ public function prepare_item_for_response( $item, $request ) { $data = $this->add_additional_fields_to_object( $item, $request ); $data = $this->filter_response_by_context( $data, 'view' ); $response = rest_ensure_response( $data ); /** * Filter the list returned from the API. * * @param WP_REST_Response $response The response object. * @param array $item The original item. * @param WP_REST_Request $request Request used to generate the response. */ return apply_filters( 'woocommerce_rest_prepare_themes', $response, $item, $request ); } /** * Get the schema, conforming to JSON Schema. * * @return array */ public function get_item_schema() { $schema = array( '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'upload_theme', 'type' => 'object', 'properties' => array( 'status' => array( 'description' => __( 'Theme installation status.', 'woocommerce' ), 'type' => 'string', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'message' => array( 'description' => __( 'Theme installation message.', 'woocommerce' ), 'type' => 'string', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'theme' => array( 'description' => __( 'Uploaded theme.', 'woocommerce' ), 'type' => 'object', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), ), ); return $this->add_additional_fields_schema( $schema ); } /** * Get the query params for collections. * * @return array */ public function get_collection_params() { $params = array( 'context' => $this->get_context_param( array( 'default' => 'view' ) ) ); $params['pluginzip'] = array( 'description' => __( 'A zip file of the theme to be uploaded.', 'woocommerce' ), 'type' => 'file', 'validate_callback' => 'rest_validate_request_arg', ); return apply_filters( 'woocommerce_rest_themes_collection_params', $params ); } }