<?php
/**
* JetPopup post type template
*/
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
if ( ! class_exists( 'Jet_Export_Import' ) ) {
/**
* Define Jet_Export_Import class
*/
class Jet_Export_Import {
/**
* A reference to an instance of this class.
*
* @since 1.0.0
* @var object
*/
private static $instance = null;
/**
* Constructor for the class
*/
public function __construct() {
add_filter( 'post_row_actions', [ $this, 'add_export_import_in_dashboard' ], 10, 2 );
add_action( 'admin_action_jet_popup_import_preset', array( $this, 'import_popup_preset' ) );
add_action( 'admin_action_jet_popup_create_from_preset', array( $this, 'create_predesigned_popup' ) );
add_action( 'admin_action_jet_popup_create_from_library_preset', array( $this, 'create_from_library_preset' ) );
add_action( 'admin_init', [ $this, 'popup_export_preset' ] );
add_action( 'admin_footer', [ $this, 'admin_popup_forms' ] );
}
/**
* [add_export_import_in_dashboard description]
* @param [type] $actions [description]
* @param \WP_Post $post [description]
*/
public function add_export_import_in_dashboard( $actions, \WP_Post $post ) {
if (
Elementor\User::is_current_user_can_edit( $post->ID ) &&
Elementor\Plugin::$instance->db->is_built_with_elementor( $post->ID ) &&
'jet-popup' === get_post_type( $post->ID )
) {
$actions['jet_popup_export'] = sprintf(
'<a id="jet-popup-export-link" href="%1$s">%2$s</a>',
$this->get_export_link( $post->ID ),
__( 'Export Popup', 'jet-popup' )
);
}
return $actions;
}
/**
* [popup_export_preset description]
* @return [type] [description]
*/
public function popup_export_preset() {
if ( ! isset( $_GET['action'] ) ) {
return;
}
if ( 'jet_popup_export_preset' !== $_GET['action'] && ! isset( $_GET['popup_id'] ) ) {
return;
}
$popup_id = $_GET['popup_id'];
$this->export_template( $popup_id );
}
/**
* [get_export_link description]
* @param [type] $popup_id [description]
* @return [type] [description]
*/
public function get_export_link( $popup_id ) {
return add_query_arg(
[
'action' => 'jet_popup_export_preset',
'popup_id' => $popup_id,
],
admin_url( 'admin-ajax.php' )
);
}
/**
* [export_template description]
* @param [type] $popup_id [description]
* @return [type] [description]
*/
public function export_template( $popup_id ) {
$file_data = $this->prepare_popup_export( $popup_id );
header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: public' );
header( 'Content-Description: File Transfer' );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename="'. $file_data['name'] . '"' );
header( 'Content-Transfer-Encoding: binary' );
session_write_close();
// Output file contents.
echo $file_data['content'];
die();
}
/**
* [prepare_popup_export description]
* @param [type] $popup_id [description]
* @return [type] [description]
*/
public function prepare_popup_export( $popup_id ) {
$db = Elementor\Plugin::$instance->db;
$content = $db->get_builder( $popup_id );
$popup_data = [];
$popup_data['content'] = $content;
if ( get_post_meta( $popup_id, '_elementor_page_settings', true ) ) {
$page_settings = get_post_meta( $popup_id, '_elementor_page_settings', true );
if ( ! empty( $page_settings ) ) {
$popup_data['page_settings'] = $page_settings;
}
}
$export_data = [
'version' => Elementor\DB::DB_VERSION,
'title' => get_the_title( $popup_id ),
];
$export_data += $popup_data;
return [
'name' => 'jet-popup-' . $popup_id . '-' . date( 'Y-m-d' ) . '.json',
'content' => wp_json_encode( $export_data ),
];
}
/**
* [import_popup_preset description]
* @return [type] [description]
*/
public function import_popup_preset() {
if ( ! current_user_can( 'import' ) ) {
wp_die( __( 'You don\'t have permissions to do this', 'jet-popup' ) );
}
if ( empty( $_FILES ) ) {
wp_die( __( 'File not passed', 'jet-popup' ) );
}
$file = $_FILES['file'];
if ( 'application/json' !== $file['type'] ) {
wp_die( __( 'Format not allowed', 'jet-popup' ) );
}
$content = file_get_contents( $file['tmp_name'] );
$content = json_decode( $content, true );
if ( ! $content ) {
wp_die( __( 'No data found in file', 'jet-popup' ) );
}
$documents = Elementor\Plugin::instance()->documents;
$doc_type = $documents->get_document_type( jet_popup()->post_type->slug() );
$popup_content = $content['content'];
$popup_content = $this->process_export_import_content( $popup_content, 'on_import' );
$popup_settings = $content['page_settings'];
$popup_settings = $this->reset_popup_conditions( $popup_settings );
$post_data = array(
'post_type' => jet_popup()->post_type->slug(),
'meta_input' => array(
'_elementor_edit_mode' => 'builder',
$doc_type::TYPE_META_KEY => jet_popup()->post_type->slug(),
'_elementor_data' => wp_slash( json_encode( $popup_content ) ),
'_elementor_page_settings' => $popup_settings,
),
);
$post_data['post_title'] = ! empty( $content['title'] ) ? $content['title'] : __( 'New Popup', 'jet-popup' );
$popup_id = wp_insert_post( $post_data );
jet_popup()->conditions->update_site_conditions( $popup_id );
if ( ! $popup_id ) {
wp_die(
esc_html__( 'Can\'t create popup. Please try again', 'jet-popup' ),
esc_html__( 'Error', 'jet-popup' )
);
}
wp_redirect( jet_popup()->elementor()->documents->get( $popup_id )->get_edit_url() );
die();
}
/**
* Create new template
*
* @return [type] [description]
*/
public function create_predesigned_popup() {
if ( ! current_user_can( 'edit_posts' ) ) {
wp_die(
esc_html__( 'You don\'t have permissions to do this', 'jet-popup' ),
esc_html__( 'Error', 'jet-popup' )
);
}
$popup = isset( $_REQUEST['popup'] ) ? esc_attr( $_REQUEST['popup'] ) : false;
$documents = Elementor\Plugin::instance()->documents;
$doc_type = $documents->get_document_type( jet_popup()->post_type->slug() );
$popups = $this->predesigned_popups();
if ( ! isset( $popups[ $popup ] ) ) {
wp_die(
esc_html__( 'This template not rigestered', 'jet-popup' ),
esc_html__( 'Error', 'jet-popup' )
);
}
$data = $popups[ $popup ];
$content = $data['content'];
ob_start();
include $content;
$preset_data = ob_get_clean();
$preset_data = json_decode( $preset_data, true );
$this->create_new_popup_data( $preset_data );
}
/**
* [create_from_library_preset description]
* @return [type] [description]
*/
public function create_from_library_preset() {
if ( ! current_user_can( 'edit_posts' ) ) {
wp_die(
esc_html__( 'You don\'t have permissions to do this', 'jet-popup' ),
esc_html__( 'Error', 'jet-popup' )
);
}
$preset = isset( $_REQUEST['preset'] ) ? esc_attr( $_REQUEST['preset'] ) : false;
if ( ! $preset ) {
wp_die(
esc_html__( 'Stop Cheating!', 'jet-popup' ),
esc_html__( 'Error', 'jet-popup' )
);
}
$response_data = $this->get_preset_remote_request( $preset );
if ( ! $response_data['success']) {
wp_die(
esc_html__( 'Api Server Error', 'jet-popup' ),
esc_html__( 'Error', 'jet-popup' )
);
}
$preset_data = json_decode( $response_data['data'], true );
$this->create_new_popup_data( $preset_data );
}
/**
* [create_new_popup_data description]
* @param [type] $preset_data [description]
* @return [type] [description]
*/
public function create_new_popup_data( $preset_data ) {
$documents = Elementor\Plugin::instance()->documents;
$doc_type = $documents->get_document_type( jet_popup()->post_type->slug() );
$popup_content = $preset_data['content'];
$popup_settings = $preset_data['page_settings'];
$popup_content = $this->process_export_import_content( $popup_content, 'on_import' );
$popup_settings = $this->reset_popup_conditions( $popup_settings );
$post_data = [
'post_title' => ! empty( $preset_data['title'] ) ? $preset_data['title'] : __( 'New Popup', 'jet-popup' ),
'post_type' => jet_popup()->post_type->slug(),
'meta_input' => [
'_elementor_edit_mode' => 'builder',
$doc_type::TYPE_META_KEY => jet_popup()->post_type->slug(),
'_elementor_data' => wp_slash( json_encode( $popup_content ) ),
'_elementor_page_settings' => $popup_settings,
],
];
$popup_id = wp_insert_post( $post_data );
jet_popup()->conditions->update_site_conditions( $popup_id );
if ( ! $popup_id ) {
wp_die(
esc_html__( 'Can\'t create preset. Please try again', 'jet-popup' ),
esc_html__( 'Error', 'jet-popup' )
);
}
wp_redirect( jet_popup()->elementor()->documents->get( $popup_id )->get_edit_url() );
exit();
}
/**
* Process content for export/import.
*
* Process the content and all the inner elements, and prepare all the
* elements data for export/import.
*
* @since 1.5.0
* @access protected
*
* @param array $content A set of elements.
* @param string $method Accepts either `on_export` to export data or
* `on_import` to import data.
*
* @return mixed Processed content data.
*/
protected function process_export_import_content( $content, $method ) {
return ELementor\Plugin::$instance->db->iterate_data(
$content, function( $element_data ) use ( $method ) {
$element = ELementor\Plugin::$instance->elements_manager->create_element_instance( $element_data );
// If the widget/element isn't exist, like a plugin that creates a widget but deactivated
if ( ! $element ) {
return null;
}
return $this->process_element_export_import_content( $element, $method );
}
);
}
/**
* Process single element content for export/import.
*
* Process any given element and prepare the element data for export/import.
*
* @since 1.5.0
* @access protected
*
* @param Controls_Stack $element
* @param string $method
*
* @return array Processed element data.
*/
protected function process_element_export_import_content( $element, $method ) {
$element_data = $element->get_data();
if ( method_exists( $element, $method ) ) {
// TODO: Use the internal element data without parameters.
$element_data = $element->{$method}( $element_data );
}
foreach ( $element->get_controls() as $control ) {
$control_class = ELementor\Plugin::$instance->controls_manager->get_control( $control['type'] );
// If the control isn't exist, like a plugin that creates the control but deactivated.
if ( ! $control_class ) {
return $element_data;
}
if ( method_exists( $control_class, $method ) ) {
$element_data['settings'][ $control['name'] ] = $control_class->{$method}( $element->get_settings( $control['name'] ), $control );
}
}
return $element_data;
}
/**
* [reset_popup_conditions description]
* @param [type] $popup_settings [description]
* @return [type] [description]
*/
public function reset_popup_conditions( $popup_settings ) {
foreach ( $popup_settings as $condition => $value ) {
if ( false !== strpos( $condition, 'conditions_' ) ) {
unset( $popup_settings[ $condition ] );
}
}
return $popup_settings;
}
/**
* Retrieve the raw response from the HTTP request using the GET method.
*
* @since 1.0.0
* @return array|WP_Error
*/
public function get_preset_remote_request( $preset_id ) {
$preset_end_point = apply_filters( 'jet-popup/preset-endpoint', 'https://crocoblock.com/interactive-popups/wp-json/croco/v1/preset/' );
$url = $preset_end_point . $preset_id;
$response = wp_remote_get( $url, array(
'timeout' => 60,
'sslverify' => false
) );
$response_code = wp_remote_retrieve_response_code( $response );
if ( '' === $response_code ) {
return new \WP_Error;
}
$result = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! is_array( $result ) ) {
return new \WP_Error;
}
return $result;
}
/**
* [predesigned_popups description]
* @return [type] [description]
*/
public function predesigned_popups() {
$base_url = jet_popup()->plugin_url( 'templates/dummy-popups/' );
$base_dir = jet_popup()->plugin_path( 'templates/dummy-popups/' );
return apply_filters( 'jet-popup/predesigned-popups', [
'popup-1' => [
'title' => __( 'Classic', 'jet-popup' ),
'content' => $base_dir . 'popup-1/preset.json',
'thumb' => $base_url . 'popup-1/thumbnail.png',
],
'popup-2' => [
'title' => __( 'Slide In', 'jet-popup' ),
'content' => $base_dir . 'popup-2/preset.json',
'thumb' => $base_url . 'popup-2/thumbnail.png',
],
'popup-3' => [
'title' => __( 'Bar', 'jet-popup' ),
'content' => $base_dir . 'popup-3/preset.json',
'thumb' => $base_url . 'popup-3/thumbnail.png',
],
'popup-4' => [
'title' => __( 'Bordering', 'jet-popup' ),
'content' => $base_dir . 'popup-4/preset.json',
'thumb' => $base_url . 'popup-4/thumbnail.png',
],
'popup-5' => [
'title' => __( 'Full View', 'jet-popup' ),
'content' => $base_dir . 'popup-5/preset.json',
'thumb' => $base_url . 'popup-5/thumbnail.png',
],
'popup-6' => [
'title' => __( 'Full Width', 'jet-popup' ),
'content' => $base_dir . 'popup-6/preset.json',
'thumb' => $base_url . 'popup-6/thumbnail.png',
],
] );
}
/**
* [admin_popup_forms description]
* @return [type] [description]
*/
public function admin_popup_forms() {
global $current_screen;
if ( 'edit-jet-popup' !== $current_screen->id ) {
return false;
}
$import_action = add_query_arg(
array(
'action' => 'jet_popup_import_preset',
),
esc_url( admin_url( 'admin.php' ) )
);
$crate_action = add_query_arg(
array(
'action' => 'jet_popup_create_from_preset',
),
esc_url( admin_url( 'admin.php' ) )
);
$checked = ' checked';
?>
<div id="jet-popup-hidden-area">
<a id="jet-popup-import-trigger" href="#" class="page-title-action"><?php echo __( 'Import Popup', 'jet-popup' ); ?></a>
<form id="jet-popup-import-form" method="post" action="<?php echo $import_action ?>" enctype="multipart/form-data">
<fieldset id="jet-popup-import-form-inputs">
<input type="file" class="file-button" name="file" accept=".json,application/json,.zip,application/octet-stream,application/zip,application/x-zip,application/x-zip-compressed" required>
<input type="submit" class="button" value="<?php echo esc_attr__( 'Import Now', 'jet-popup' ); ?>">
</fieldset>
</form>
<form id="jet-popup-create-form" class="jet-popup-create-form" method="POST" action="<?php echo $crate_action; ?>" >
<h3 class="jet-popup-create-form__title"><?php
esc_html_e( 'Select Layout Preset', 'jet-popup' );
?></h3>
<div class="jet-popup-create-form__item-list"><?php
foreach ( $this->predesigned_popups() as $id => $data ) {
?>
<div class="jet-popup-create-form__item">
<div class="jet-popup-create-form__item-inner">
<label class="jet-popup-create-form__label">
<input type="radio" name="popup" value="<?php echo $id; ?>"<?php echo $checked; ?>>
<span class="jet-popup-create-form__check dashicons dashicons-yes"></span>
<img src="<?php echo $data['thumb']; ?>" alt="">
</label>
<h4 class="jet-popup-create-form__item-title"><?php
echo $data['title'];
?></h4>
</div>
</div>
<?php
$checked = '';
}
?></div>
<div class="jet-popup-create-form__actions">
<button type="submit" id="jet_popup_type_submit" class="button"><?php
esc_html_e( 'Create Popup', 'jet-popup' );
?></button>
</div>
</form>
</div><?php
}
/**
* Returns the instance.
*
* @since 1.0.0
* @return object
*/
public static function get_instance() {
// If the single instance hasn't been set, set it now.
if ( null == self::$instance ) {
self::$instance = new self;
}
return self::$instance;
}
}
}