* @author ThemePunch <info@themepunch.com>
* @link https://www.themepunch.com/
* @copyright 2024 ThemePunch
if(!defined('ABSPATH')) exit();
class RevSliderApi extends RevSliderFunctions {
private $global_settings = array();
public $demo_allowed = array('get_template_information_short', 'import_template_slider', 'install_template_slide', 'get_list_of', 'get_global_settings', 'get_full_slider_object', 'subscribe_to_newsletter', 'check_system', 'load_module', 'get_addon_list', 'get_layers_by_slide', 'silent_slider_update', 'get_help_directory', 'set_tooltip_preference', 'load_builder', 'load_library_object', 'get_tooltips');
public $user_allowed = array('activate_plugin', 'deactivate_plugin', 'import_template_slider', 'install_template_slide', 'import_slider', 'delete_slider', 'create_navigation_preset', 'delete_navigation_preset', 'save_navigation', 'delete_animation', 'save_animation', 'check_system', 'fix_database_issues', 'trigger_font_deletion');
public $no_cache = array('get_template_information_short', 'export_slider', 'export_slider_html', 'getSliderImage', 'getSliderSizeLayout', 'get_list_of', 'load_wordpress_object', 'get_global_settings', 'get_slides_by_slider_id', 'get_full_slider_object', 'load_builder', 'subscribe_to_newsletter', 'check_system', 'get_layers_by_slide', 'export_layer_group', 'load_wordpress_image', 'load_library_image', 'get_help_directory', 'get_tooltips', 'get_addons_sizes', 'get_v5_slider_list');
public function __construct(){
$this->global_settings = $this->get_global_settings();
* Add all actions that the backend needs here
public function add_actions(){
add_action('wp_ajax_revslider_ajax_action', array($this, 'do_ajax_action')); //ajax response to save slider options.
add_action('wp_ajax_rs_ajax_action', array($this, 'do_ajax_action')); //ajax response to save slider options.
add_action('wp_ajax_revslider_ajax_call_front', array($this, 'do_front_ajax_action'));
add_action('wp_ajax_nopriv_revslider_ajax_call_front', array($this, 'do_front_ajax_action')); //for not logged in users
add_action('rest_api_init', array($this, 'init_rest_api'));
public function init_rest_api(){
WP_REST_SERVER::READABLE = 'GET'
WP_REST_SERVER::CREATABLE = 'POST'
WP_REST_SERVER::EDITABLE = 'POST, PUT, PATCH'
WP_REST_SERVER::DELETABLE = 'DELETE'
WP_REST_SERVER::ALLMETHODS = 'GET, POST, PUT, PATCH, DELETE'
return $_SERVER['REQUEST_METHOD']
//{"code":"rest_no_route","message":"Es wurde keine Route gefunden, die mit der URL und der Request-Methode identisch ist.","data":{"status":404}}
register_rest_route('sliderrevolution', '/sliders', array(
'methods' => WP_REST_SERVER::READABLE,
'callback' => array($this, 'get_full_slider_object'),
'permission_callback' => array($this, 'setup_exception_handler')
register_rest_route('sliderrevolution', '/sliders/(?P<slider>[\w\-]+)', array(
'methods' => WP_REST_SERVER::READABLE,
'callback' => array($this, 'get_full_slider_object'),
'permission_callback' => array($this, 'setup_exception_handler')
register_rest_route('sliderrevolution', '/sliders/slides/(?P<id>\d+)', array(
'methods' => WP_REST_SERVER::READABLE,
'callback' => array($this, 'get_full_slider_object'),
'permission_callback' => array($this, 'setup_exception_handler')
//register_rest_route('sliderrevolution', '/sliders/stream/(?P<id>\d+)', array(
register_rest_route('sliderrevolution', '/sliders/stream/(?P<id>[0-9,]+)', array(
'methods' => WP_REST_SERVER::READABLE,
'callback' => array($this, 'get_stream_data'),
'permission_callback' => array($this, 'setup_exception_handler')
register_rest_route('sliderrevolution', '/sliders/modal/(?P<slider>[\w\-]+)', array(
'methods' => WP_REST_SERVER::READABLE,
'callback' => array($this, 'get_slider_modal_data'),
'permission_callback' => array($this, 'setup_exception_handler')
public function set_rest_call(){
public function is_rest_call(){
public function check_nonce(){
$this->setup_exception_handler();
$nonce = $this->get_request_var('nonce');
$nonce = (empty($nonce)) ? $this->get_request_var('rs-nonce') : $nonce;
if(wp_verify_nonce($nonce, 'revslider_actions') == false){
//check if it is wp nonce and if the action is refresh nonce
$this->ajax_response_error(__('Bad Request', 'revslider'));
$sr_admin = RevSliderGlobals::instance()->get('RevSliderAdmin');
if(!current_user_can($sr_admin->get_user_role()) && apply_filters('revslider_restrict_role', true)){
$this->ajax_response_error(__('Bad Request', 'revslider'));
public function setup_exception_handler(){
set_exception_handler(array($this, 'handle_rest_exceptions'));
public function handle_rest_exceptions(Throwable $exception){
//http_response_code(500);
//if(!$this->is_rest_call()) return;
'message' => $exception->getMessage()
* The Ajax Action part for backend actions only
public function do_ajax_action(){
$slider = new RevSliderSlider();
$slide = new RevSliderSlide();
$action = $this->get_request_var('client_action');
$nonce = $this->get_request_var('nonce');
$nonce = (empty($nonce)) ? $this->get_request_var('rs-nonce') : $nonce;
//for now, set also the data for ajax calls here, later to be removed!
$data = $this->get_request_var('data', '', false);
$data = ($data == '') ? array() : $data;
if(RS_DEMO && !in_array($action, $this->demo_allowed)){
$this->ajax_response_error(__('Function Not Available in Demo Mode', 'revslider'));
$sr_admin = RevSliderGlobals::instance()->get('RevSliderAdmin');
if(!current_user_can($sr_admin->get_user_role()) && apply_filters('revslider_restrict_role', true)){
if(in_array($action, $this->user_allowed)){
$this->ajax_response_error(__('Function only available for administrators', 'revslider'));
$return = apply_filters('revslider_admin_onAjaxAction_user_restriction', true, $action, $data, $slider, $slide);
$this->ajax_response_error(__('Function only available for administrators', 'revslider'));
if(wp_verify_nonce($nonce, 'revslider_actions') == false){
//check if it is wp nonce and if the action is refresh nonce
$this->ajax_response_error(__('Bad Request', 'revslider'));
if(!in_array($action, $this->no_cache)) $this->flush_wp_cache();
$this->truncate_v7_tables();
case 'set_v7_migration_failed':
$this->set_v7_migration_failed();
case 'get_full_slider_object_v7':
$this->get_full_slider_object(false, false);
* The old ajax calls, all of these are not in the REST API yet
$google_font = $this->get_val($data, 'font', '');
$this->download_collected_fonts($google_font);
$this->ajax_response_success('', '');
case 'collect_google_fonts':
$page = $this->get_val($data, 'page', 1);
$return = $this->collect_used_fonts(true, true, $page);
$this->ajax_response_data($return);
case 'delete_full_fonts_cache':
$this->delete_google_fonts();
$this->ajax_response_success(__('Successfully deleted all fonts cache', 'revslider'));
$code = trim($this->get_val($data, 'code'));
$rs_license = new RevSliderLicense();
$result = $rs_license->activate_plugin($code);
$this->ajax_response_error(__('The License Key needs to be set!', 'revslider'));
$this->ajax_response_success(__('Plugin successfully activated', 'revslider'));
}elseif($result === false){
$this->ajax_response_error(__('License Key is invalid', 'revslider'));
$this->ajax_response_error(__('License Key already registered!', 'revslider'));
}elseif($result == 'banned'){
$this->ajax_response_error(__('License Key was locked, please contact the ThemePunch support!', 'revslider'));
$this->ajax_response_error(__('License Key could not be validated', 'revslider'));
case 'deactivate_plugin':
$rs_license = new RevSliderLicense();
$result = $rs_license->deactivate_plugin();
$this->ajax_response_success(__('Plugin deregistered', 'revslider'));
$this->ajax_response_error(__('Deregistration failed!', 'revslider'));
case 'close_deregister_popup':
update_option('revslider-deregister-popup', 'false');
$this->ajax_response_success(__('Saved', 'revslider'));
case 'deactivate_trustpilot':
update_option('revslider-trustpilot', 'false');
$this->ajax_response_success(__('Saved', 'revslider'));
case 'dismiss_dynamic_notice':
$ids = $this->get_val($data, 'id', array());
$notices_discarded = get_option('revslider-notices-dc', array());
$notices_discarded[] = esc_attr(trim($_id));
update_option('revslider-notices-dc', $notices_discarded);
$this->ajax_response_success(__('Saved', 'revslider'));
case 'check_for_updates':
$update = new RevSliderUpdate(RS_REVISION);
$update->_retrieve_version_info();
$version = get_option('revslider-latest-version', RS_REVISION);
$this->ajax_response_data(array('version' => $version));
$this->ajax_response_error(__('Connection to Update Server Failed', 'revslider'));
case 'get_template_information_short':
$templates = new RevSliderTemplate();
$sliders = $templates->get_tp_template_sliders();
$this->ajax_response_data(array('templates' => $sliders));
case 'import_template_slider': //before: import_slider_template_slidersview
$uid = $this->get_val($data, 'uid');
$sliderID = intval($this->get_val($data, 'sliderid', 0));
$templates = new RevSliderTemplate();
$filepath = $templates->_download_template($uid);
$templates->remove_old_template($uid);
$slider = new RevSliderSliderImport();
$return = $slider->import_slider(false, $filepath, $uid, false, true);
if($this->get_val($return, 'success') == true){
$new_id = $this->get_val($return, 'sliderID');
$map = $this->get_val($return, 'map', array());
$folder_id = $this->get_val($data, 'folderid', -1);
if(intval($folder_id) > 0){
$folder = new RevSliderFolder();
$folder->add_slider_to_folder($new_id, $folder_id, false);
$new_slider = new RevSliderSlider();
$new_slider->init_by_id($new_id);
$data = $new_slider->get_overview_data();
$hiddensliderid = $templates->get_slider_id_by_uid($uid);
$templates->_delete_template($uid); //delete template file
$this->ajax_response_data(array('slider' => $data, 'hiddensliderid' => $hiddensliderid, 'map' => $map, 'uid' => $uid));
$templates->_delete_template($uid); //delete template file
$error = ($this->get_val($return, 'error') !== '') ? $this->get_val($return, 'error') : __('Slider Import Failed', 'revslider');
$this->ajax_response_error($error);
$this->ajax_response_error(__('Template Slider Import Failed', 'revslider'));
case 'install_template_slide':
$template = new RevSliderTemplate();
$slider_id = intval($this->get_val($data, 'slider_id'));
$slide_id = intval($this->get_val($data, 'slide_id'));
if($slider_id == 0 || $slide_id == 0){
$new_slide_id = $slide->duplicate_slide_by_id($slide_id, $slider_id);
if($new_slide_id !== false){
$slide->init_by_id($new_slide_id);
'order' => $slide->get_order(),
'params' => $slide->get_params(),
'layers' => $slide->get_layers(),
'id' => $slide->get_id(),
$this->ajax_response_data(array('slides' => $_slides));
$this->ajax_response_error(__('Slide duplication failed', 'revslider'));
$import = new RevSliderSliderImport();
$return = $import->import_slider();
if($this->get_val($return, 'success') == true){
$new_id = $this->get_val($return, 'sliderID');
$folder = new RevSliderFolder();
$folder_id = $this->get_val($data, 'folderid', -1);
if(intval($folder_id) > 0){
$folder->add_slider_to_folder($new_id, $folder_id, false);
$new_slider = new RevSliderSlider();
$new_slider->init_by_id($new_id);
$data = $new_slider->get_overview_data();
$this->ajax_response_data(array('slider' => $data, 'hiddensliderid' => $new_id));
$error = ($this->get_val($return, 'error') !== '') ? $this->get_val($return, 'error') : __('Slider Import Failed', 'revslider');
$this->ajax_response_error($error);
case 'add_to_media_library':
$sr_admin = RevSliderGlobals::instance()->get('RevSliderAdmin');
$return = $sr_admin->import_upload_media();
if($this->get_val($return, 'error', false) !== false){
$this->ajax_response_error($this->get_val($return, 'error', false));
$this->ajax_response_data($return);
$map = $this->get_val($data, 'map', array());
$slider_ids = $this->get_val($map, 'slider_map', array());
$slides_ids = $this->get_val($map, 'slides_map', array());
$ztt = $this->get_val($slider_ids, 'zip_to_template', array());
foreach($slides_ids as $k => $v){
foreach($v as $vk => $vv){
foreach($ztt as $old => $new){
$slider = new RevSliderSliderImport();
$slider->init_by_id($new);
$slider->update_modal_ids($ztt, $slides_ids);
$this->ajax_response_data(array());
$this->ajax_response_error(__('Slider Map Empty', 'revslider'));
case 'adjust_js_css_ids':
$map = $this->get_val($data, 'map', array());
$slider_ids = $this->get_val($m, 'slider_map', array());
foreach($slider_ids as $old => $new){
$slider = new RevSliderSliderImport();
$slider->init_by_id($new);
foreach($slider_map as $slider){
$slider_ids = $this->get_val($m, 'slider_map', array());
$slide_ids = $this->get_val($m, 'slide_map', array());
foreach($slider_ids as $old => $new){
$slider->update_css_and_javascript_ids($old, $new, $slide_ids);
$export = new RevSliderSliderExport();
$id = intval($this->get_request_var('id'));
$export->export_slider($id);
//will never be called if all is good
$this->ajax_response_error(__('Slider Export Error!!!', 'revslider'));
case 'export_slider_html':
$export = new RevSliderSliderExportHtml();
$id = intval($this->get_request_var('id'));
$export->export_slider_html($id);
//will never be called if all is good
$this->ajax_response_error(__('Slider HTML Export Error!!!', 'revslider'));
$id = $this->get_val($data, 'id');
$slider->init_by_id($id);
$slider->delete_slider();
$this->ajax_response_success(__('Slider Deleted', 'revslider'));
$id = $this->get_val($data, 'id');
$new_id = $slider->duplicate_slider_by_id($id);
$new_slider = new RevSliderSlider();
$new_slider->init_by_id($new_id);
$data = $new_slider->get_overview_data();
$this->ajax_response_data(array('slider' => $data));
$this->ajax_response_error(__('Duplication Failed', 'revslider'));
$slide_id = $this->get_val($data, 'slide_id');
$slider_id = $this->get_val($data, 'slider_id');
$return = $slide->save_slide($slide_id, $data, $slider_id);
$cache = RevSliderGlobals::instance()->get('RevSliderCache');
$cache->clear_transients_by_slider($slider_id);
$v7_slider_map = $this->get_v7_slider_map($slider_id);
$this->ajax_response_data(array('v7' => $v7_slider_map));
$this->ajax_response_error(__('Slide not found', 'revslider'));
case 'save_slide_advanced':
$slide_id = $this->get_val($data, 'slide_id');
$slider_id = $this->get_val($data, 'slider_id');
$return = $slide->save_slide_advanced($slide_id, $data, $slider_id);
$cache = RevSliderGlobals::instance()->get('RevSliderCache');
$cache->clear_transients_by_slider($slider_id);
$this->ajax_response_success(__('Slide Saved', 'revslider'));