![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/cartinsight.co/wp-content/plugins/colibri-page-builder/src/OCDI/ |
<?php /** * Main One Click Demo Import plugin class/file. * * @package ocdi */ namespace ColibriWP\PageBuilder\OCDI; use ColibriWP\PageBuilder\PageBuilder; /** * One Click Demo Import class, so we don't have to worry about namespaces. */ class OneClickDemoImport { /** * The instance *Singleton* of this class * * @var object */ private static $instance; /** * The instance of the OCDI\Importer class. * * @var object */ public $importer; /** * Holds the verified import files. * * @var array */ public $import_files; /** * The path of the log file. * * @var string */ public $log_file_path; /** * Holds any error messages, that should be printed out at the end of the import. * * @var string */ public $frontend_error_messages = array(); /** * The resulting page's hook_suffix, or false if the user does not have the capability required. * * @var boolean or string */ private $plugin_page; /** * The index of the `import_files` array (which import files was selected). * * @var int */ private $selected_index; /** * The paths of the actual import files to be used in the import. * * @var array */ private $selected_import_files; /** * Was the before content import already triggered? * * @var boolean */ private $before_import_executed = false; /** * Make plugin page options available to other methods. * * @var array */ private $plugin_page_setup = array(); /** * Class construct function, to initiate the plugin. * Protected constructor to prevent creating a new instance of the * *Singleton* via the `new` operator from outside of this class. */ protected function __construct() { // Actions. add_action( 'admin_menu', array( $this, 'create_plugin_page' ) ); // add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); add_action( 'wp_ajax_extendthemes_ocdi_import_demo_data', array( $this, 'import_demo_data_ajax_callback' ) ); add_action( 'wp_ajax_extendthemes_ocdi_import_customizer_data', array( $this, 'import_customizer_data_ajax_callback' ) ); add_action( 'wp_ajax_extendthemes_ocdi_after_import_data', array( $this, 'after_all_import_data_ajax_callback' ) ); add_action( 'after_setup_theme', array( $this, 'setup_plugin_with_filter_data' ) ); add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) ); } /** * Returns the *Singleton* instance of this class. * * @return OneClickDemoImport the *Singleton* instance. */ public static function get_instance() { if ( null === static::$instance ) { static::$instance = new static(); } return static::$instance; } /** * Creates the plugin page and a submenu item in WP Appearance menu. */ public function create_plugin_page() { $this->plugin_page_setup = apply_filters( 'extendthemes-ocdi/plugin_page_setup', array( 'parent_slug' => 'themes.php', 'page_title' => esc_html__( 'One Click Demo Import', 'colibri-page-builder' ), 'menu_title' => esc_html__( 'Import Demo Data', 'colibri-page-builder' ), 'capability' => 'import', 'menu_slug' => 'pt-one-click-demo-import', ) ); if ( empty( $this->plugin_page_setup ) ) { return; } $this->plugin_page = add_submenu_page( $this->plugin_page_setup['parent_slug'], $this->plugin_page_setup['page_title'], $this->plugin_page_setup['menu_title'], $this->plugin_page_setup['capability'], $this->plugin_page_setup['menu_slug'], apply_filters( 'extendthemes-ocdi/plugin_page_display_callback_function', array( $this, 'display_plugin_page' ) ) ); register_importer( $this->plugin_page_setup['menu_slug'], $this->plugin_page_setup['page_title'], $this->plugin_page_setup['menu_title'], apply_filters( 'extendthemes-ocdi/plugin_page_display_callback_function', array( $this, 'display_plugin_page' ) ) ); } /** * Plugin page display. * Output (HTML) is in another file. */ public function display_plugin_page() { require_once PageBuilder::instance()->rootPath() . '/demo-importer/ocdi-page.php'; } /** * Enqueue admin scripts (JS and CSS) * * @param string $hook holds info on which admin page you are currently loading. */ public function admin_enqueue_scripts( $hook ) { // Enqueue the scripts only on the plugin page. if ( $this->plugin_page === $hook || ( 'admin.php' === $hook && $this->plugin_page_setup['menu_slug'] === sanitize_text_field( $_GET['import'] ) ) ) { wp_enqueue_script( 'jquery-ui-dialog' ); wp_enqueue_style( 'wp-jquery-ui-dialog' ); wp_enqueue_script( 'extendthemes-ocdi-main-js', EXTENDTHEMES_OCDI_URL . 'assets/js/main.js', array( 'jquery', 'jquery-ui-dialog' ), COLIBRI_PAGE_BUILDER_VERSION ); // Get theme data. $theme = wp_get_theme(); wp_localize_script( 'extendthemes-ocdi-main-js', 'ocdi', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'ajax_nonce' => wp_create_nonce( 'extendthemes-ocdi-ajax-verification' ), 'import_files' => $this->import_files, 'wp_customize_on' => apply_filters( 'extendthemes-ocdi/enable_wp_customize_save_hooks', false ), 'import_popup' => apply_filters( 'extendthemes-ocdi/enable_grid_layout_import_popup_confirmation', true ), 'theme_screenshot' => $theme->get_screenshot(), 'texts' => array( 'missing_preview_image' => esc_html__( 'No preview image defined for this import.', 'colibri-page-builder' ), 'dialog_title' => esc_html__( 'Are you sure?', 'colibri-page-builder' ), 'dialog_no' => esc_html__( 'Cancel', 'colibri-page-builder' ), 'dialog_yes' => esc_html__( 'Yes, import!', 'colibri-page-builder' ), 'selected_import_title' => esc_html__( 'Selected demo import:', 'colibri-page-builder' ), ), 'dialog_options' => apply_filters( 'extendthemes-ocdi/confirmation_dialog_options', array() ) ) ); wp_enqueue_style( 'ocdi-main-css', EXTENDTHEMES_OCDI_URL . 'assets/css/main.css', array(), COLIBRI_PAGE_BUILDER_VERSION ); } } /** * Main AJAX callback function for: * 1). prepare import files (uploaded or predefined via filters) * 2). execute 'before content import' actions (before import WP action) * 3). import content * 4). execute 'after content import' actions (before widget import WP action, widget import, customizer import, after import WP action) */ public function import_demo_data_ajax_callback() { // Try to update PHP memory limit (so that it does not run out of it). ini_set( 'memory_limit', apply_filters( 'extendthemes-ocdi/import_memory_limit', '350M' ) ); add_action( 'http_api_curl', function ( $ch ) { curl_setopt( $ch, CURLOPT_ENCODING, 'gzip' ); } ); // Verify if the AJAX call is valid (checks nonce and current_user_can). Helpers::verify_ajax_call(); // Is this a new AJAX call to continue the previous import? $use_existing_importer_data = $this->use_existing_importer_data(); if ( ! $use_existing_importer_data ) { // Create a date and time string to use for demo and log file names. Helpers::set_demo_import_start_time(); // Define log file path. $this->log_file_path = Helpers::get_log_path(); // Get selected file index or set it to 0. $this->selected_index = empty( $_POST['selected'] ) ? 0 : absint( $_POST['selected'] ); /** * 1). Prepare import files. * Manually uploaded import files or predefined import files via filter: pt-ocdi/import_files */ if ( ! empty( $_FILES ) ) { // Using manual file uploads? // Get paths for the uploaded files. $this->selected_import_files = Helpers::process_uploaded_files( $_FILES, $this->log_file_path ); // Set the name of the import files, because we used the uploaded files. $this->import_files[ $this->selected_index ]['import_file_name'] = esc_html__( 'Manually uploaded files', 'colibri-page-builder' ); } elseif ( ! empty( $this->import_files[ $this->selected_index ] ) ) { // Use predefined import files from wp filter: pt-ocdi/import_files. // Download the import files (content, widgets and customizer files). $this->selected_import_files = Helpers::download_import_files( $this->import_files[ $this->selected_index ] ); // Check Errors. if ( is_wp_error( $this->selected_import_files ) ) { // Write error to log file and send an AJAX response with the error. Helpers::log_error_and_send_ajax_response( $this->selected_import_files->get_error_message(), $this->log_file_path, esc_html__( 'Downloaded files', 'colibri-page-builder' ) ); } // Add this message to log file. $log_added = Helpers::append_to_file( sprintf( __( 'The import files for: %s were successfully downloaded!', 'colibri-page-builder' ), $this->import_files[ $this->selected_index ]['import_file_name'] ) . Helpers::import_file_info( $this->selected_import_files ), $this->log_file_path, esc_html__( 'Downloaded files', 'colibri-page-builder' ) ); } else { // Send JSON Error response to the AJAX call. wp_send_json( esc_html__( 'No import files specified!', 'colibri-page-builder' ) ); } } // Save the initial import data as a transient, so other import parts (in new AJAX calls) can use that data. Helpers::set_ocdi_import_data_transient( $this->get_current_importer_data() ); if ( ! $this->before_import_executed ) { $this->before_import_executed = true; /** * 2). Execute the actions hooked to the 'extendthemes-ocdi/before_content_import_execution' action: * * Default actions: * 1 - Before content import WP action (with priority 10). */ do_action( 'extendthemes-ocdi/before_content_import_execution', $this->selected_import_files, $this->import_files, $this->selected_index ); } /** * 3). Import content (if the content XML file is set for this import). * Returns any errors greater then the "warning" logger level, that will be displayed on front page. */ if ( ! empty( $this->selected_import_files['content'] ) ) { $this->append_to_frontend_error_messages( $this->importer->import_content( $this->selected_import_files['content'] ) ); } /** * 4). Execute the actions hooked to the 'extendthemes-ocdi/after_content_import_execution' action: * * Default actions: * 1 - Before widgets import setup (with priority 10). * 2 - Import widgets (with priority 20). * 3 - Import Redux data (with priority 30). */ do_action( 'extendthemes-ocdi/after_content_import_execution', $this->selected_import_files, $this->import_files, $this->selected_index ); // Save the import data as a transient, so other import parts (in new AJAX calls) can use that data. Helpers::set_ocdi_import_data_transient( $this->get_current_importer_data() ); // Request the customizer import AJAX call. if ( ! empty( $this->selected_import_files['customizer'] ) ) { wp_send_json( array( 'status' => 'customizerAJAX' ) ); } // Request the after all import AJAX call. if ( false !== has_action( 'extendthemes-ocdi/after_all_import_execution' ) ) { wp_send_json( array( 'status' => 'afterAllImportAJAX' ) ); } // Send a JSON response with final report. $this->final_response(); } /** * Get content importer data, so we can continue the import with this new AJAX request. * * @return boolean */ private function use_existing_importer_data() { if ( $data = get_transient( 'ocdi_importer_data' ) ) { $this->frontend_error_messages = empty( $data['frontend_error_messages'] ) ? array() : $data['frontend_error_messages']; $this->log_file_path = empty( $data['log_file_path'] ) ? '' : $data['log_file_path']; $this->selected_index = empty( $data['selected_index'] ) ? 0 : $data['selected_index']; $this->selected_import_files = empty( $data['selected_import_files'] ) ? array() : $data['selected_import_files']; $this->before_import_executed = empty( $data['before_import_executed'] ) ? false : $data['before_import_executed']; $this->importer->set_importer_data( $data ); return true; } return false; } /** * Get the current state of selected data. * * @return array */ public function get_current_importer_data() { return array( 'frontend_error_messages' => $this->frontend_error_messages, 'log_file_path' => $this->log_file_path, 'selected_index' => $this->selected_index, 'selected_import_files' => $this->selected_import_files, 'before_import_executed' => $this->before_import_executed, ); } /** * Setter function to append additional value to the private frontend_error_messages value. * * @param string $additional_value The additional value that will be appended to the existing frontend_error_messages. */ public function append_to_frontend_error_messages( $text ) { $lines = array(); if ( ! empty( $text ) ) { $text = str_replace( '<br>', PHP_EOL, $text ); $lines = explode( PHP_EOL, $text ); } foreach ( $lines as $line ) { if ( ! empty( $line ) && ! in_array( $line, $this->frontend_error_messages ) ) { $this->frontend_error_messages[] = $line; } } } /** * Send a JSON response with final report. */ private function final_response() { // Delete importer data transient for current import. delete_transient( 'ocdi_importer_data' ); // Display final messages (success or error messages). if ( empty( $this->frontend_error_messages ) ) { $response['message'] = ''; if ( ! apply_filters( 'extendthemes-ocdi/disable_pt_branding', false ) ) { $twitter_status = esc_html__( 'Just used One Click Demo Import plugin and it was awesome! Thanks @ProteusThemes! #OCDI https://www.proteusthemes.com/', 'colibri-page-builder' ); $response['message'] .= sprintf( __( '%1$s%6$sWasn\'t this a great One Click Demo Import experience?%7$s Created and maintained by %3$sProteusThemes%4$s. %2$s%5$sClick to Tweet!%4$s%8$s', 'colibri-page-builder' ), '<div class="notice notice-info"><p>', '<br>', '<strong><a href="https://www.proteusthemes.com/" target="_blank">', '</a></strong>', '<strong><a href="' . add_query_arg( 'status', urlencode( $twitter_status ), 'http://twitter.com/home' ) . '" target="_blank">', '<strong>', '</strong>', '</p></div>' ); } $response['message'] .= sprintf( __( '%1$s%3$sThat\'s it, all done!%4$s%2$sThe demo import has finished. Please check your page and make sure that everything has imported correctly. If it did, you can deactivate the %3$sOne Click Demo Import%4$s plugin, because it has done its job.%5$s', 'colibri-page-builder' ), '<div class="notice notice-success"><p>', '<br>', '<strong>', '</strong>', '</p></div>' ); } else { $response['message'] = $this->frontend_error_messages_display() . '<br>'; $response['message'] .= sprintf( __( '%1$sThe demo import has finished, but there were some import errors.%2$sMore details about the errors can be found in this %3$s%5$slog file%6$s%4$s%7$s', 'colibri-page-builder' ), '<div class="notice notice-warning"><p>', '<br>', '<strong>', '</strong>', '<a href="' . Helpers::get_log_url( $this->log_file_path ) . '" target="_blank">', '</a>', '</p></div>' ); } wp_send_json( $response ); } /** * Display the frontend error messages. * * @return string Text with HTML markup. */ public function frontend_error_messages_display() { $output = ''; if ( ! empty( $this->frontend_error_messages ) ) { foreach ( $this->frontend_error_messages as $line ) { $output .= esc_html( $line ); $output .= '<br>'; } } return $output; } /** * AJAX callback for importing the customizer data. * This request has the wp_customize set to 'on', so that the customizer hooks can be called * (they can only be called with the $wp_customize instance). But if the $wp_customize is defined, * then the widgets do not import correctly, that's why the customizer import has its own AJAX call. */ public function import_customizer_data_ajax_callback() { // Verify if the AJAX call is valid (checks nonce and current_user_can). Helpers::verify_ajax_call(); // Get existing import data. if ( $this->use_existing_importer_data() ) { /** * Execute the customizer import actions. * * Default actions: * 1 - Customizer import (with priority 10). */ do_action( 'extendthemes-ocdi/customizer_import_execution', $this->selected_import_files ); } // Request the after all import AJAX call. if ( false !== has_action( 'extendthemes-ocdi/after_all_import_execution' ) ) { wp_send_json( array( 'status' => 'afterAllImportAJAX' ) ); } // Send a JSON response with final report. $this->final_response(); } /** * AJAX callback for the after all import action. */ public function after_all_import_data_ajax_callback() { // Verify if the AJAX call is valid (checks nonce and current_user_can). Helpers::verify_ajax_call(); // Get existing import data. if ( $this->use_existing_importer_data() ) { /** * Execute the after all import actions. * * Default actions: * 1 - after_import action (with priority 10). */ do_action( 'extendthemes-ocdi/after_all_import_execution', $this->selected_import_files, $this->import_files, $this->selected_index ); } // Send a JSON response with final report. $this->final_response(); } /** * Getter function to retrieve the private log_file_path value. * * @return string The log_file_path value. */ public function get_log_file_path() { return $this->log_file_path; } /** * Load the plugin textdomain, so that translations can be made. */ public function load_textdomain() { load_plugin_textdomain( 'pt-ocdi', false, plugin_basename( dirname( dirname( __FILE__ ) ) ) . '/languages' ); } /** * Get data from filters, after the theme has loaded and instantiate the importer. */ public function setup_plugin_with_filter_data() { // Get info of import data files and filter it. $this->import_files = Helpers::validate_import_file_info( apply_filters( 'extendthemes-ocdi/import_files', array() ) ); /** * Register all default actions (before content import, widget, customizer import and other actions) * to the 'before_content_import_execution' and the 'extendthemes-ocdi/after_content_import_execution' action hook. */ $import_actions = new ImportActions(); $import_actions->register_hooks(); // Importer options array. $importer_options = apply_filters( 'extendthemes-ocdi/importer_options', array( 'fetch_attachments' => true, ) ); // Logger options for the logger used in the importer. $logger_options = apply_filters( 'extendthemes-ocdi/logger_options', array( 'logger_min_level' => 'warning', ) ); // Configure logger instance and set it to the importer. $logger = new Logger(); $logger->min_level = $logger_options['logger_min_level']; // Create importer instance with proper parameters. $this->importer = new Importer( $importer_options, $logger ); } /** * Private clone method to prevent cloning of the instance of the *Singleton* instance. * * @return void */ public function __clone() { } /** * Private unserialize method to prevent unserializing of the *Singleton* instance. * * @return void */ public function __wakeup() { } }