* @author ThemePunch <info@themepunch.com>
* @link https://www.themepunch.com/
* @copyright 2024 ThemePunch
if(!defined('ABSPATH')) exit();
class RevSliderSliderExport extends RevSliderSlider {
private $used_animations;
private $used_navigations;
private $slider_settings;
private $navigation_data;
private $animations_data;
public function __construct($title = 'export'){
$this->used_captions = array();
$this->used_animations = array();
$this->used_images = array();
$this->used_svg = array();
$this->used_videos = array();
$this->used_navigations = array();
$this->all_slides = array();
$this->navigation_data = false;
$this->animations_data = '';
$wp_upload_dir = wp_upload_dir();
$this->export_path_zip = $this->get_val($wp_upload_dir, 'basedir').'/'.$title.'.zip';
$this->export_url_zip = $this->get_val($wp_upload_dir, 'baseurl').'/'.$title.'.zip';
* return the used images, for SEO
public function get_used_images(){
return $this->used_images;
* export slider from data, output a file for download
* @before: RevSliderSlider::exportSlider();
public function export_slider($id = 0){
//slider needs to be initialized :)
if($id > 0) $this->init_by_id($id);
//check if an update is needed
if(version_compare($this->get_param(array('settings', 'version')), get_option('revslider_update_version', '6.0.0'), '<')){
$upd = new RevSliderPluginUpdate();
$upd->upgrade_slider_to_latest($this);
$this->remove_image_ids();
$this->remove_background_image();
$this->add_used_images();
$this->add_used_videos();
//$this->add_used_captions();
//$this->add_used_animations();
$this->add_used_navigations();
$this->modify_used_data();
$this->serialize_export_data();
$this->serialize_navigation_data();
$this->prepare_caption_css();
$this->serialize_animation_data();
$this->create_export_zip();
$this->add_images_videos_to_zip();
$this->add_slider_export_to_zip();
$this->add_animations_to_zip();
$this->add_styles_to_zip();
$this->add_navigation_to_zip();
$this->add_static_styles_to_zip();
$this->add_info_to_zip();
$this->close_export_zip();
$this->push_zip_to_client();
$this->delete_export_zip();
* set slides and slider parameters
public function set_parameters(){
$this->slider_id = $this->get_id();
$this->slider_title = $this->get_title();
$this->slider_alias = $this->get_alias();
$this->slider_params = $this->get_params();
$this->slider_settings = $this->get_settings();
$this->export_slides = $this->get_slides_for_export();
$this->static_slide = $this->get_static_slide_for_export();
if(!empty($this->export_slides) && count($this->export_slides) > 0) $this->all_slides = array_merge($this->all_slides, $this->export_slides);
if(!empty($this->static_slide) && count($this->static_slide) > 0) $this->all_slides = array_merge($this->all_slides, $this->static_slide);
* remove the image_id as its not needed in export
public function remove_image_ids(){
if($this->get_val($this->slider_params, array('troubleshooting', 'alternateURLId'), false) !== false){
unset($this->slider_params['troubleshooting']['alternateURLId']);
if(!empty($this->export_slides)){
foreach($this->export_slides as $k => $s){
if($this->get_val($this->export_slides[$k], array('params', 'bg', 'imageId'), false) !== false) unset($this->export_slides[$k]['params']['bg']['imageId']);
if($this->get_val($this->export_slides[$k], array('params', 'thumb', 'customThumbSrcId'), false) !== false) unset($this->export_slides[$k]['params']['thumb']['customThumbSrcId']);
if($this->get_val($this->export_slides[$k], array('params', 'thumb', 'customAdminThumbSrcId'), false) !== false) unset($this->export_slides[$k]['params']['thumb']['customAdminThumbSrcId']);
if($this->get_val($this->export_slides[$k], array('params', 'bg', 'lastLoadedImage'), false) !== false) unset($this->export_slides[$k]['params']['bg']['lastLoadedImage']);
if(!empty($this->static_slide)){
foreach($this->static_slide as $k => $s){
if($this->get_val($this->static_slide[$k], array('params', 'bg', 'imageId'), false) !== false) unset($this->static_slide[$k]['params']['bg']['imageId']);
if($this->get_val($this->static_slide[$k], array('params', 'thumb', 'customThumbSrcId'), false) !== false) unset($this->static_slide[$k]['params']['thumb']['customThumbSrcId']);
if($this->get_val($this->static_slide[$k], array('params', 'thumb', 'customAdminThumbSrcId'), false) !== false) unset($this->static_slide[$k]['params']['thumb']['customAdminThumbSrcId']);
if($this->get_val($this->static_slide[$k], array('params', 'bg', 'lastLoadedImage'), false) !== false) unset($this->static_slide[$k]['params']['bg']['lastLoadedImage']);
* remove the background image on transparent or solid colored slides
public function remove_background_image(){
if(!empty($this->export_slides)){
foreach($this->export_slides as $k => $s){
if(isset($this->export_slides[$k]['params']) && (in_array($this->get_val($this->export_slides[$k]['params'], array('bg', 'type')), array('solid', 'trans', 'transparent'), true))){
if($this->get_val($this->export_slides[$k]['params'], array('bg', 'image'), false) !== false) $this->export_slides[$k]['params']['layout']['bg']['image'] = '';
if(!empty($this->static_slide)){
foreach($this->static_slide as $k => $s){
if(isset($this->static_slide[$k]['params']) && (in_array($this->get_val($this->static_slide[$k]['params'], array('bg', 'type')), array('solid', 'trans', 'transparent'), true))){
if($this->get_val($this->static_slide[$k]['params'], array('bg', 'image'), false) !== false) $this->static_slide[$k]['params']['bg']['image'] = '';
public function add_used_images(){
$image = $this->get_val($this->slider_params, array('layout', 'bg', 'image'));
$a_url = $this->get_val($this->slider_params, array('troubleshooting', 'alternateURL'));
if($image != '') $this->used_images[$image] = true;
if($a_url != '') $this->used_images[$a_url] = true;
if(!empty($this->all_slides) && count($this->all_slides) > 0){
foreach($this->all_slides as $key => $slide){
$params = $this->get_val($slide, 'params', array());
$layers = $this->get_val($slide, 'layers', array());
$image = $this->get_val($params, array('bg', 'image'));
$thumb = $this->get_val($params, array('thumb', 'customThumbSrc'));
$a_thumb = $this->get_val($params, array('thumb', 'customAdminThumbSrc'));
if($image != '') $this->used_images[$image] = true;
if($thumb != '') $this->used_images[$thumb] = true;
if($a_thumb != '') $this->used_images[$a_thumb] = true;
foreach($layers as $layer){
$type = $this->get_val($layer, 'type', 'text');
$image = $this->get_val($layer, array('media', 'imageUrl'));
$bg_image = $this->get_val($layer, array('idle', 'backgroundImage'));
if($image != '') $this->used_images[$image] = true;
if($bg_image != '') $this->used_images[$bg_image] = true;
if(in_array($type, array('video', 'audio'))){
$poster = $this->get_val($layer, array('media', 'posterUrl'), '');
if($poster != '') $this->used_images[$poster] = true;
$very_big = $this->get_val($layer, array('media', 'thumbs', 'veryBig'));
$big = $this->get_val($layer, array('media', 'thumbs', 'big'));
$large = $this->get_val($layer, array('media', 'thumbs', 'large'));
$medium = $this->get_val($layer, array('media', 'thumbs', 'medium'));
$small = $this->get_val($layer, array('media', 'thumbs', 'small'));
$very_big = (is_array($very_big) && isset($very_big['url'])) ? $very_big['url'] : $very_big;
$big = (is_array($big) && isset($big['url'])) ? $big['url'] : $big;
$large = (is_array($large) && isset($large['url'])) ? $large['url'] : $large;
$medium = (is_array($medium) && isset($medium['url'])) ? $medium['url'] : $medium;
$small = (is_array($small) && isset($small['url'])) ? $small['url'] : $small;
if($very_big != '') $this->used_images[$very_big] = true;
if($big != '') $this->used_images[$big] = true;
if($large != '') $this->used_images[$large] = true;
if($medium != '') $this->used_images[$medium] = true;
if($small != '') $this->used_images[$small] = true;
* add all used videos, also removing values if unneeded
public function add_used_videos(){
if(!empty($this->all_slides) && count($this->all_slides) > 0){
foreach($this->all_slides as $k => $slide){
$params = $this->get_val($slide, 'params', array());
$layers = $this->get_val($slide, 'layers', array());
$static = $this->get_val($params, array('static', 'isstatic'), false);
if($this->get_val($params, array('bg', 'type')) == 'html5'){
if($this->get_val($params, array('bg', 'mpeg')) != '') $this->used_videos[$this->get_val($params, array('bg', 'mpeg'))] = true;
if($this->get_val($params, array('bg', 'webm')) != '') $this->used_videos[$this->get_val($params, array('bg', 'webm'))] = true;
if($this->get_val($params, array('bg', 'ogv')) != '') $this->used_videos[$this->get_val($params, array('bg', 'ogv'))] = true;
if($this->get_val($params, array('bg', 'mpeg')) != '') $this->set_val($this->static_slide, array(0, 'params', 'bg', 'mpeg'), '');
if($this->get_val($params, array('bg', 'webm')) != '') $this->set_val($this->static_slide, array(0, 'params', 'bg', 'webm'), '');
if($this->get_val($params, array('bg', 'ogv')) != '') $this->set_val($this->static_slide, array(0, 'params', 'bg', 'ogv'), '');
if($this->get_val($params, array('bg', 'mpeg')) != '') $this->set_val($this->export_slides, array($k, 'params', 'bg', 'mpeg'), '');
if($this->get_val($params, array('bg', 'webm')) != '') $this->set_val($this->export_slides, array($k, 'params', 'bg', 'webm'), '');
if($this->get_val($params, array('bg', 'ogv')) != '') $this->set_val($this->export_slides, array($k, 'params', 'bg', 'ogv'), '');
foreach($layers as $lk => $layer){
if(in_array($this->get_val($layer, 'type'), array('video', 'audio'))){
if($this->get_val($layer, array('media', 'mediaType')) == 'html5'){
if($this->get_val($layer, array('media', 'mp4Url'), '') != '') $this->used_videos[$this->get_val($layer, array('media', 'mp4Url'), '')] = true;
if($this->get_val($layer, array('media', 'webmUrl'), '') != '') $this->used_videos[$this->get_val($layer, array('media', 'webmUrl'), '')] = true;
if($this->get_val($layer, array('media', 'ogvUrl'), '') != '') $this->used_videos[$this->get_val($layer, array('media', 'ogvUrl'), '')] = true;
}else{ //if(!in_array($this->get_val($layer, array('media', 'mediaType')), array('html5', 'audio')))
if($this->get_val($layer, array('media', 'audioUrl')) != '') $this->used_videos[$this->get_val($layer, array('media', 'audioUrl'))] = true;
$this->set_val($layer, array('media', 'mp4Url'), '');
$this->set_val($layer, array('media', 'webmUrl'), '');
$this->set_val($layer, array('media', 'ogvUrl'), '');
$this->static_slide[0]['layers'][$lk] = $layer;
$this->export_slides[$k]['layers'][$lk] = $layer;
public function add_used_captions(){
if(!empty($this->all_slides) && count($this->all_slides) > 0){
foreach($this->all_slides as $key => $slide){
$layers = $this->get_val($slide, 'layers', array());
foreach($layers as $lk => $layer){
if($this->get_val($layer, array('idle', 'style')) != '') $this->used_captions[$this->get_val($layer, array('idle', 'style'))] = true;
* add all used animations
public function add_used_animations(){
if(!empty($this->all_slides) && count($this->all_slides) > 0){
foreach($this->all_slides as $key => $slide){
$layers = $this->get_val($slide, 'layers', array());
foreach($layers as $lk => $layer){
if(strpos($this->get_val($layer, 'animation'), 'customin') !== false) $this->used_animations[str_replace('customin-', '', $this->get_val($layer, 'animation'))] = true;
if(strpos($this->get_val($layer, 'endanimation'), 'customout') !== false) $this->used_animations[str_replace('customout-', '', $this->get_val($layer, 'endanimation'))] = true;
* add navigations if not default animation
public function add_used_navigations(){
$nav = new RevSliderNavigation();
$navigations = $nav->get_all_navigations(false, true);
$arrows = $this->get_val($this->slider_params, array('nav', 'arrows', 'style'), false);
$bullets = $this->get_val($this->slider_params, array('nav', 'bullets', 'style'), false);
$thumbs = $this->get_val($this->slider_params, array('nav', 'thumbs', 'style'), false);
$tabs = $this->get_val($this->slider_params, array('nav', 'tabs', 'style'), false);
$scrubber = $this->get_val($this->slider_params, array('nav', 'scrubber', 'style'), false);
if($arrows !== false) $this->used_navigations[$arrows] = true;
if($bullets !== false) $this->used_navigations[$bullets] = true;
if($thumbs !== false) $this->used_navigations[$thumbs] = true;
if($tabs !== false) $this->used_navigations[$tabs] = true;
if($scrubber !== false) $this->used_navigations[$scrubber] = true;
public function add_used_svg(){
if(!empty($this->all_slides) && count($this->all_slides) > 0){
foreach($this->all_slides as $key => $slide){
$layers = $this->get_val($slide, 'layers');
foreach($layers as $lk => $layer){
if($this->get_val($layer, 'type') == 'svg'){
$svg = $this->get_val($layer, array('svg', 'source'));
if($svg !== '') $this->used_svg[$svg] = true;
* modify the used stuff data
public function modify_used_data(){
$d = array('used_svg' => $this->used_svg, 'used_images' => $this->used_images, 'used_videos' => $this->used_videos);
$d = apply_filters('revslider_exportSlider_usedMedia', $d, $this->all_slides, $this->slider_params); //$this->export_slides, $this->static_slide,
$this->used_svg = $d['used_svg'];
$this->used_images = $d['used_images'];
$this->used_videos = $d['used_videos'];
* serialize the export data
public function serialize_export_data(){
'id' => $this->slider_id,
'title' => $this->slider_title,
'alias' => $this->slider_alias,
'params' => $this->slider_params,
'slides' => $this->export_slides,
'settings' => $this->slider_settings
if(!empty($this->static_slide)) $data['static_slides'] = $this->static_slide;
$data = apply_filters('revslider_exportSlider_export_data', $data, $this);
$this->export_data = json_encode($data);
* serialize the navigation data
public function serialize_navigation_data(){
if(!empty($this->used_navigations)){
$nav = new RevSliderNavigation();
$this->navigation_data = $nav->export_navigation($this->used_navigations);
if($this->navigation_data !== false) $this->navigation_data = json_encode($this->navigation_data);
* prepare the css for export
public function prepare_caption_css(){
if(!empty($this->used_captions)){
foreach($this->used_captions as $class => $val){
$caption = $this->get_captions_content($class);
$this->style_data = json_encode($captions);
* serialize the animation data
public function serialize_animation_data(){
if(!empty($this->used_animations)){
foreach($this->used_animations as $anim => $val){
$animation = $this->get_custom_animation_by_id($anim);
if($animation !== false) $animations[] = $animation;
if(!empty($animations)) $this->animations_data = json_encode($animations);
* get animation params by id
* @before: RevSliderOperations::getFullCustomAnimationByID()
public function get_custom_animation_by_id($id){
$this->fill_animations();
if(empty($SR_GLOBALS['animations'])) return false;
foreach($SR_GLOBALS['animations'] as $animation){
if($animation['id'] == $id){
'id' => $animation['id'],
'handle' => $animation['handle'],
'params' => $animation['params'],
'settings' => $animation['settings']
* create the blank zip file to be used further on
public function create_export_zip(){
if(file_exists($this->export_path_zip)) @unlink($this->export_path_zip); //delete file to start with a fresh one
if(class_exists('ZipArchive')){
$this->zip = new ZipArchive;
$success = $this->zip->open($this->export_path_zip, ZIPARCHIVE::CREATE | ZipArchive::OVERWRITE);
if($success !== true) $this->throw_error(__("Can't create zip file: ", 'revslider').$this->export_path_zip);
require_once(ABSPATH . 'wp-admin/includes/class-pclzip.php');
$this->pclzip = new PclZip($this->export_path_zip);