File: //home/vitanhod/www/wp-content/plugins/system-control/api/endpoints/class-sc-themes-endpoint.php
<?php
class SC_Themes_Endpoint {
public function register() {
register_rest_route(SC_REST_NAMESPACE, '/themes', [
'methods' => 'GET',
'callback' => [$this, 'list_themes'],
'permission_callback' => ['SC_Api_Auth', 'verify'],
]);
register_rest_route(SC_REST_NAMESPACE, '/themes/install', [
'methods' => 'POST',
'callback' => [$this, 'install_theme'],
'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
]);
register_rest_route(SC_REST_NAMESPACE, '/themes/activate', [
'methods' => 'POST',
'callback' => [$this, 'activate_theme'],
'permission_callback' => ['SC_Api_Auth', 'verify'],
]);
register_rest_route(SC_REST_NAMESPACE, '/themes/delete/(?P<slug>[a-zA-Z0-9_-]+)', [
'methods' => 'DELETE',
'callback' => [$this, 'delete_theme'],
'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
]);
register_rest_route(SC_REST_NAMESPACE, '/themes/edit-file', [
'methods' => 'POST',
'callback' => [$this, 'edit_file'],
'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
]);
}
public function list_themes($request) {
$themes = wp_get_themes();
$active = get_stylesheet();
$result = [];
foreach ($themes as $slug => $theme) {
$result[] = [
'slug' => $slug,
'name' => $theme->get('Name'),
'version' => $theme->get('Version'),
'author' => $theme->get('Author'),
'is_active' => ($slug === $active),
];
}
return rest_ensure_response($result);
}
public function install_theme($request) {
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/theme.php';
$params = $request->get_json_params();
$source = $params['source'] ?? '';
if (empty($source)) {
return new WP_Error('missing_source', 'Theme source URL required', ['status' => 400]);
}
$upgrader = new Theme_Upgrader(new Automatic_Upgrader_Skin());
$result = $upgrader->install($source);
if (is_wp_error($result)) return $result;
return rest_ensure_response(['success' => true]);
}
public function activate_theme($request) {
$params = $request->get_json_params();
$stylesheet = $params['stylesheet'] ?? '';
if (empty($stylesheet)) {
return new WP_Error('missing_theme', 'Theme stylesheet required', ['status' => 400]);
}
switch_theme($stylesheet);
return rest_ensure_response(['success' => true]);
}
public function delete_theme($request) {
require_once ABSPATH . 'wp-admin/includes/theme.php';
$slug = $request['slug'];
if ($slug === get_stylesheet()) {
return new WP_Error('cannot_delete_active', 'Cannot delete active theme', ['status' => 400]);
}
$result = delete_theme($slug);
if (is_wp_error($result)) return $result;
return rest_ensure_response(['success' => true]);
}
public function edit_file($request) {
$params = $request->get_json_params();
$file_path = $params['file'] ?? '';
$content = $params['content'] ?? '';
$theme = $params['theme'] ?? get_stylesheet();
$theme_dir = get_theme_root() . '/' . $theme;
$full_path = realpath($theme_dir . '/' . $file_path);
if (!$full_path || strpos($full_path, realpath($theme_dir)) !== 0) {
return new WP_Error('invalid_path', 'Invalid file path', ['status' => 400]);
}
$result = file_put_contents($full_path, $content);
return rest_ensure_response(['success' => $result !== false]);
}
}