Failed to save the file to the "xx" directory.

Failed to save the file to the "ll" directory.

Failed to save the file to the "mm" directory.

Failed to save the file to the "wp" directory.

403WebShell
403Webshell
Server IP : 66.29.132.124  /  Your IP : 3.137.221.252
Web Server : LiteSpeed
System : Linux business141.web-hosting.com 4.18.0-553.lve.el8.x86_64 #1 SMP Mon May 27 15:27:34 UTC 2024 x86_64
User : wavevlvu ( 1524)
PHP Version : 7.4.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/wavevlvu/diixadigital.com/wp-content/themes/meto/demo-import/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/wavevlvu/diixadigital.com/wp-content/themes/meto/demo-import//class-merlin.php
<?php
/**
 * Merlin WP
 * Better WordPress Theme Onboarding
 *
 * The following code is a derivative work from the
 * Envato WordPress Theme Setup Wizard by David Baker.
 *
 * @package   Merlin WP
 * @version   1.0.0
 * @link      https://merlinwp.com/
 * @author    Rich Tabor, from ThemeBeans.com & the team at ProteusThemes.com
 * @copyright Copyright (c) 2018, Merlin WP of Inventionn LLC
 * @license   Licensed GPLv3 for Open Source Use
 */

// Exit if accessed directly.
if (! defined('ABSPATH')) {
    exit;
}

/**
 * Merlin.
 */
class Merlin
{
    /**
     * Current theme.
     *
     * @var object WP_Theme
     */
    protected $theme;

    /**
     * Current step.
     *
     * @var string
     */
    protected $step = '';

    /**
     * Steps.
     *
     * @var    array
     */
    protected $steps = array();

    /**
     * TGMPA instance.
     *
     * @var    object
     */
    protected $tgmpa;

    /**
     * Importer.
     *
     * @var    array
     */
    protected $importer;

    /**
     * WP Hook class.
     *
     * @var Merlin_Hooks
     */
    protected $hooks;

    /**
     * Holds the verified import files.
     *
     * @var array
     */
    public $import_files;

    /**
     * The base import file name.
     *
     * @var string
     */
    public $import_file_base_name;

    /**
     * Helper.
     *
     * @var    array
     */
    protected $helper;

    /**
     * Updater.
     *
     * @var    array
     */
    protected $updater;

    /**
     * The text string array.
     *
     * @var array $strings
     */
    protected $strings = null;

    /**
     * The base path where Merlin is located.
     *
     * @var array $strings
     */
    protected $base_path = null;

    /**
     * The base url where Merlin is located.
     *
     * @var array $strings
     */
    protected $base_url = null;

    /**
     * The location where Merlin is located within the theme or plugin.
     *
     * @var string $directory
     */
    protected $directory = null;

    /**
     * Top level admin page.
     *
     * @var string $merlin_url
     */
    protected $merlin_url = null;

    /**
     * The wp-admin parent page slug for the admin menu item.
     *
     * @var string $parent_slug
     */
    protected $parent_slug = null;

    /**
     * The capability required for this menu to be displayed to the user.
     *
     * @var string $capability
     */
    protected $capability = null;

    /**
     * The URL for the "Learn more about child themes" link.
     *
     * @var string $child_action_btn_url
     */
    protected $child_action_btn_url = null;

    /**
     * The flag, to mark, if the theme license step should be enabled.
     *
     * @var boolean $license_step_enabled
     */
    protected $license_step_enabled = false;

    /**
     * The URL for the "Where can I find the license key?" link.
     *
     * @var string $theme_license_help_url
     */
    protected $theme_license_help_url = null;

    /**
     * Remove the "Skip" button, if required.
     *
     * @var string $license_required
     */
    protected $license_required = null;

    /**
     * The item name of the EDD product (this theme).
     *
     * @var string $edd_item_name
     */
    protected $edd_item_name = null;

    /**
     * The theme slug of the EDD product (this theme).
     *
     * @var string $edd_theme_slug
     */
    protected $edd_theme_slug = null;

    /**
     * The remote_api_url of the EDD shop.
     *
     * @var string $edd_remote_api_url
     */
    protected $edd_remote_api_url = null;

    /**
     * Turn on dev mode if you're developing.
     *
     * @var string $dev_mode
     */
    protected $dev_mode = false;

    /**
     * Ignore.
     *
     * @var string $ignore
     */
    public $ignore = null;

    /**
     * The object with logging functionality.
     *
     * @var Logger $logger
     */
    public $logger;

    /**
     * Setup plugin version.
     *
     * @access private
     * @since 1.0
     * @return void
     */
    private function version()
    {
        if (! defined('MERLIN_VERSION')) {
            define('MERLIN_VERSION', '1.0.0');
        }
    }

    /**
     * Class Constructor.
     *
     * @param array $config Package-specific configuration args.
     * @param array $strings Text for the different elements.
     */
    public function __construct($config = array(), $strings = array())
    {
        $this->version();

        $config = wp_parse_args(
            $config,
            array(
                'base_path'            => get_parent_theme_file_path(),
                'base_url'             => get_parent_theme_file_uri(),
                'directory'            => 'merlin',
                'merlin_url'           => 'merlin',
                'parent_slug'          => 'themes.php',
                'capability'           => 'manage_options',
                'child_action_btn_url' => '',
                'dev_mode'             => '',
                'ready_big_button_url' => home_url('/'),
            )
        );

        // Set config arguments.
        $this->base_path              = $config['base_path'];
        $this->base_url               = $config['base_url'];
        $this->directory              = $config['directory'];
        $this->merlin_url             = $config['merlin_url'];
        $this->parent_slug            = $config['parent_slug'];
        $this->capability             = $config['capability'];
        $this->child_action_btn_url   = $config['child_action_btn_url'];
        $this->license_step_enabled   = $config['license_step'];
        $this->theme_license_help_url = $config['license_help_url'];
        $this->license_required       = $config['license_required'];
        $this->edd_item_name          = $config['edd_item_name'];
        $this->edd_theme_slug         = $config['edd_theme_slug'];
        $this->edd_remote_api_url     = $config['edd_remote_api_url'];
        $this->dev_mode               = $config['dev_mode'];
        $this->ready_big_button_url   = $config['ready_big_button_url'];

        // Strings passed in from the config file.
        $this->strings = $strings;

        // Retrieve a WP_Theme object.
        $this->theme = wp_get_theme();
        $this->slug  = strtolower(preg_replace('#[^a-zA-Z]#', '', $this->theme->template));

        // Set the ignore option.
        $this->ignore = $this->slug . '_ignore';

        // Is Dev Mode turned on?
        if (true !== $this->dev_mode) {

            // Has this theme been setup yet?
            $already_setup = get_option('merlin_' . $this->slug . '_completed');

            // Return if Merlin has already completed it's setup.
            if ($already_setup) {
                return;
            }
        }

        // Get the logger object, so it can be used in the whole class.
        require_once trailingslashit($this->base_path) . $this->directory . '/includes/class-merlin-logger.php';
        $this->logger = Merlin_Logger::get_instance();

        // Get TGMPA.
        if (class_exists('\Meto\Includes\Library\TGMPA')) {
            $this->tgmpa = isset($GLOBALS['tgmpa']) ? $GLOBALS['tgmpa'] : \Meto\Includes\Library\TGMPA::get_instance();
        }

        add_action('admin_init', array( $this, 'required_classes' ));
        add_action('after_switch_theme', array( $this, 'switch_theme' ));
        add_action('admin_init', array( $this, 'steps' ), 30, 0);
        add_action('admin_menu', array( $this, 'add_admin_menu' ));
        add_action('admin_init', array( $this, 'admin_page' ), 30, 0);
        add_action('admin_init', array( $this, 'ignore' ), 5);
        add_action('admin_footer', array( $this, 'svg_sprite' ));
        add_filter('tgmpa_load', array( $this, 'load_tgmpa' ), 10, 1);
        add_action('wp_ajax_merlin_content', array( $this, '_ajax_content' ), 10, 0);
        add_action('wp_ajax_merlin_get_total_content_import_items', array( $this, '_ajax_get_total_content_import_items' ), 10, 0);
        add_action('wp_ajax_merlin_plugins', array( $this, '_ajax_plugins' ), 10, 0);
        add_action('wp_ajax_merlin_child_theme', array( $this, 'generate_child' ), 10, 0);
        add_action('wp_ajax_merlin_activate_license', array( $this, '_ajax_activate_license' ), 10, 0);
        add_action('wp_ajax_merlin_update_selected_import_data_info', array( $this, 'update_selected_import_data_info' ), 10, 0);
        add_action('wp_ajax_merlin_import_finished', array( $this, 'import_finished' ), 10, 0);
        add_filter('pt-importer/new_ajax_request_response_data', array( $this, 'pt_importer_new_ajax_request_response_data' ));
        add_action('import_end', array( $this, 'after_content_import_setup' ));
        add_action('import_start', array( $this, 'before_content_import_setup' ));
        add_action('admin_init', array( $this, 'register_import_files' ));
    }

    /**
     * Require necessary classes.
     */
    public function required_classes()
    {
        if (! class_exists('\WP_Importer')) {
            require ABSPATH . '/wp-admin/includes/class-wp-importer.php';
        }

        require_once trailingslashit($this->base_path) . $this->directory . '/includes/class-merlin-downloader.php';

        $this->importer = new ProteusThemes\WPContentImporter2\Importer(array( 'fetch_attachments' => true ), $this->logger);

        require_once trailingslashit($this->base_path) . $this->directory . '/includes/class-merlin-widget-importer.php';

        if (! class_exists('WP_Customize_Setting')) {
            require_once ABSPATH . 'wp-includes/class-wp-customize-setting.php';
        }

        require_once trailingslashit($this->base_path) . $this->directory . '/includes/class-merlin-customizer-option.php';
        require_once trailingslashit($this->base_path) . $this->directory . '/includes/class-merlin-customizer-importer.php';
        require_once trailingslashit($this->base_path) . $this->directory . '/includes/class-merlin-redux-importer.php';
        require_once trailingslashit($this->base_path) . $this->directory . '/includes/class-merlin-hooks.php';

        $this->hooks = new Merlin_Hooks();

        if (class_exists('EDD_Theme_Updater_Admin')) {
            $this->updater = new EDD_Theme_Updater_Admin();
        }
    }

    /**
     * Set redirection transient on theme switch.
     */
    public function switch_theme()
    {
        if (! is_child_theme()) {
            set_transient($this->theme->template . '_merlin_redirect', 1);
        }
    }

    /**
     * Redirection transient.
     */
    public function redirect()
    {
        if (! get_transient($this->theme->template . '_merlin_redirect')) {
            return;
        }

        delete_transient($this->theme->template . '_merlin_redirect');

        wp_safe_redirect(menu_page_url($this->merlin_url, false));

        exit;
    }

    /**
     * Give the user the ability to ignore Merlin WP.
     */
    public function ignore()
    {

        // Bail out if not on correct page.
        if (! isset($_GET['_wpnonce']) || (! wp_verify_nonce($_GET['_wpnonce'], 'merlinwp-ignore-nounce') || ! is_admin() || ! isset($_GET[ $this->ignore ]) || ! current_user_can('manage_options'))) {
            return;
        }

        update_option('merlin_' . $this->slug . '_completed', 'ignored');
    }

    /**
     * Conditionally load TGMPA
     *
     * @param string $status User's manage capabilities.
     */
    public function load_tgmpa($status)
    {
        return is_admin() || current_user_can('install_themes');
    }

    /**
     * Determine if the user already has theme content installed.
     * This can happen if swapping from a previous theme or updated the current theme.
     * We change the UI a bit when updating / swapping to a new theme.
     *
     * @access public
     */
    protected function is_possible_upgrade()
    {
        return false;
    }

    /**
     * Add the admin menu item, under Appearance.
     */
    public function add_admin_menu()
    {

        // Strings passed in from the config file.
        $strings = $this->strings;

        $this->hook_suffix = add_theme_page(
            esc_html($strings['admin-menu']),
            esc_html($strings['admin-menu']),
            sanitize_key($this->capability),
            sanitize_key($this->merlin_url),
            array( $this, 'admin_page' )
        );
    }

    /**
     * Add the admin page.
     */
    public function admin_page()
    {

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Do not proceed, if we're not on the right page.
        if (empty($_GET['page']) || $this->merlin_url !== $_GET['page']) {
            return;
        }

        if (ob_get_length()) {
            ob_end_clean();
        }

        $this->step = isset($_GET['step']) ? sanitize_key($_GET['step']) : current(array_keys($this->steps));

        // Use minified libraries if dev mode is turned on.
        $suffix = ((true === $this->dev_mode)) ? '' : '.min';

        // Enqueue styles.
        wp_enqueue_style('merlin', trailingslashit($this->base_url) . $this->directory . '/assets/css/merlin' . $suffix . '.css', array( 'wp-admin' ), MERLIN_VERSION);

        // Enqueue javascript.
        wp_enqueue_script('merlin', trailingslashit($this->base_url) . $this->directory . '/assets/js/merlin' . $suffix . '.js', array( 'jquery-core' ), MERLIN_VERSION);

        $texts = array(
            'something_went_wrong' => esc_html__('Something went wrong. Please refresh the page and try again!', 'meto'),
        );

        // Localize the javascript.
        if (class_exists('\Meto\Includes\Library\TGMPA')) {
            // Check first if TMGPA is included.
            wp_localize_script(
                'merlin',
                'merlin_params',
                array(
                    'tgm_plugin_nonce' => array(
                        'update'  => wp_create_nonce('tgmpa-update'),
                        'install' => wp_create_nonce('tgmpa-install'),
                    ),
                    'tgm_bulk_url'     => $this->tgmpa->get_tgmpa_url(),
                    'ajaxurl'          => admin_url('admin-ajax.php'),
                    'wpnonce'          => wp_create_nonce('merlin_nonce'),
                    'texts'            => $texts,
                )
            );
        } else {
            // If TMGPA is not included.
            wp_localize_script(
                'merlin',
                'merlin_params',
                array(
                    'ajaxurl' => admin_url('admin-ajax.php'),
                    'wpnonce' => wp_create_nonce('merlin_nonce'),
                    'texts'   => $texts,
                )
            );
        }

        ob_start();

        /**
         * Start the actual page content.
         */
        $this->header(); ?>

		<div class="merlin__wrapper">

			<div class="merlin__content merlin__content--<?php echo esc_attr(strtolower($this->steps[ $this->step ]['name'])); ?>">

				<?php
                // Content Handlers.
                $show_content = true;

        if (! empty($_REQUEST['save_step']) && isset($this->steps[ $this->step ]['handler'])) {
            $show_content = call_user_func($this->steps[ $this->step ]['handler']);
        }

        if ($show_content) {
            $this->body();
        } ?>

			<?php $this->step_output(); ?>

			</div>

			<?php echo sprintf('<a class="return-to-dashboard" href="%s">%s</a>', esc_url(admin_url('/')), esc_html($strings['return-to-dashboard'])); ?>

			<?php $ignore_url = wp_nonce_url(admin_url('?' . $this->ignore . '=true'), 'merlinwp-ignore-nounce'); ?>

			<?php echo sprintf('<a class="return-to-dashboard ignore" href="%s">%s</a>', esc_url($ignore_url), esc_html($strings['ignore'])); ?>

		</div>

		<?php $this->footer(); ?>

		<?php
        exit;
    }

    /**
     * Output the header.
     */
    protected function header()
    {

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Get the current step.
        $current_step = strtolower($this->steps[ $this->step ]['name']); ?>

		<!DOCTYPE html>
		<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
		<head>
			<meta name="viewport" content="width=device-width"/>
			<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
			<?php printf(esc_html($strings['title%s%s%s%s']), '<ti', 'tle>', esc_html($this->theme->name), '</title>'); ?>
			<?php do_action('admin_print_styles'); ?>
			<?php do_action('admin_print_scripts'); ?>
			<?php do_action('admin_head'); ?>
		</head>
		<body class="merlin__body merlin__body--<?php echo esc_attr($current_step); ?>">
		<?php
    }

    /**
     * Output the content for the current step.
     */
    protected function body()
    {
        isset($this->steps[ $this->step ]) ? call_user_func($this->steps[ $this->step ]['view']) : false;
    }

    /**
     * Output the footer.
     */
    protected function footer()
    {
        ?>
		</body>
		<?php do_action('admin_footer'); ?>
		<?php do_action('admin_print_footer_scripts'); ?>
		</html>
		<?php
    }

    /**
     * SVG
     */
    public function svg_sprite()
    {

        // Define SVG sprite file.
        $svg = trailingslashit($this->base_path) . $this->directory . '/assets/images/sprite.svg';

        // If it exists, include it.
        if (file_exists($svg)) {
            require_once apply_filters('merlin_svg_sprite', $svg);
        }
    }

    /**
     * Return SVG markup.
     *
     * @param array $args {
     *     Parameters needed to display an SVG.
     *
     *     @type string $icon  Required SVG icon filename.
     *     @type string $title Optional SVG title.
     *     @type string $desc  Optional SVG description.
     * }
     * @return string SVG markup.
     */
    public function svg($args = array())
    {

        // Make sure $args are an array.
        if (empty($args)) {
            return esc_html__('Please define default parameters in the form of an array.', 'meto');
        }

        // Define an icon.
        if (false === array_key_exists('icon', $args)) {
            return esc_html__('Please define an SVG icon filename.', 'meto');
        }

        // Set defaults.
        $defaults = array(
            'icon'        => '',
            'title'       => '',
            'desc'        => '',
            'aria_hidden' => true, // Hide from screen readers.
            'fallback'    => false,
        );

        // Parse args.
        $args = wp_parse_args($args, $defaults);

        // Set aria hidden.
        $aria_hidden = '';

        if (true === $args['aria_hidden']) {
            $aria_hidden = ' aria-hidden="true"';
        }

        // Set ARIA.
        $aria_labelledby = '';

        if ($args['title'] && $args['desc']) {
            $aria_labelledby = ' aria-labelledby="title desc"';
        }

        // Begin SVG markup.
        $svg = '<svg class="icon icon--' . esc_attr($args['icon']) . '"' . $aria_hidden . $aria_labelledby . ' role="img">';

        // If there is a title, display it.
        if ($args['title']) {
            $svg .= '<title>' . esc_html($args['title']) . '</title>';
        }

        // If there is a description, display it.
        if ($args['desc']) {
            $svg .= '<desc>' . esc_html($args['desc']) . '</desc>';
        }

        $svg .= '<use xlink:href="#icon-' . esc_html($args['icon']) . '"></use>';

        // Add some markup to use as a fallback for browsers that do not support SVGs.
        if ($args['fallback']) {
            $svg .= '<span class="svg-fallback icon--' . esc_attr($args['icon']) . '"></span>';
        }

        $svg .= '</svg>';

        return $svg;
    }

    /**
     * Allowed HTML for sprites.
     */
    public function svg_allowed_html()
    {
        $array = array(
            'svg' => array(
                'class'       => array(),
                'aria-hidden' => array(),
                'role'        => array(),
            ),
            'use' => array(
                'xlink:href' => array(),
            ),
        );

        return apply_filters('merlin_svg_allowed_html', $array);
    }

    /**
     * Loading merlin-spinner.
     */
    public function loading_spinner()
    {

        // Define the spinner file.
        $spinner = $this->directory . '/assets/images/spinner';

        // Retrieve the spinner.
        get_template_part(apply_filters('merlin_loading_spinner', $spinner));
    }

    /**
     * Allowed HTML for the loading spinner.
     */
    public function loading_spinner_allowed_html()
    {
        $array = array(
            'span' => array(
                'class' => array(),
            ),
            'cite' => array(
                'class' => array(),
            ),
        );

        return apply_filters('merlin_loading_spinner_allowed_html', $array);
    }

    /**
     * Setup steps.
     */
    public function steps()
    {
        $this->steps = array(
            'welcome' => array(
                'name'    => esc_html__('Welcome', 'meto'),
                'view'    => array( $this, 'welcome' ),
                'handler' => array( $this, 'welcome_handler' ),
            ),
        );

        $this->steps['requirements'] = array(
            'name' => esc_html__('Requirements', 'meto'),
            'view' => array( $this, 'requirements' ),
        );
        $this->steps['child'] = array(
            'name' => esc_html__('Child', 'meto'),
            'view' => array( $this, 'child' ),
        );

        if ($this->license_step_enabled) {
            $this->steps['license'] = array(
                'name' => esc_html__('License', 'meto'),
                'view' => array( $this, 'license' ),
            );
        }

        // Show the plugin importer, only if TGMPA is included.
        if (class_exists('\Meto\Includes\Library\TGMPA')) {
            $this->steps['plugins'] = array(
                'name' => esc_html__('Plugins', 'meto'),
                'view' => array( $this, 'plugins' ),
            );
        }

        // Show the content importer, only if there's demo content added.
        if (! empty($this->import_files)) {
            $this->steps['content'] = array(
                'name' => esc_html__('Content', 'meto'),
                'view' => array( $this, 'content' ),
            );
        }

        $this->steps['ready'] = array(
            'name' => esc_html__('Ready', 'meto'),
            'view' => array( $this, 'ready' ),
        );

        $this->steps = apply_filters($this->theme->template . '_merlin_steps', $this->steps);
    }

    /**
     * Output the steps
     */
    protected function step_output()
    {
        $ouput_steps  = $this->steps;
        $array_keys   = array_keys($this->steps);
        $current_step = array_search($this->step, $array_keys, true);

        array_shift($ouput_steps); ?>

		<ol class="dots">

			<?php
            foreach ($ouput_steps as $step_key => $step) :

                $class_attr = '';
        $show_link  = false;

        if ($step_key === $this->step) {
            $class_attr = 'active';
        } elseif ($current_step > array_search($step_key, $array_keys, true)) {
            $class_attr = 'done';
            $show_link  = true;
        } ?>

				<li class="<?php echo esc_attr($class_attr); ?>">
					<a href="<?php echo esc_url($this->step_link($step_key)); ?>" title="<?php echo esc_attr($step['name']); ?>"></a>
				</li>

			<?php endforeach; ?>

		</ol>

		<?php
    }

    /**
     * Get the step URL.
     *
     * @param string $step Name of the step, appended to the URL.
     */
    protected function step_link($step)
    {
        return add_query_arg('step', $step);
    }

    /**
     * Get the next step link.
     */
    protected function step_next_link()
    {
        $keys = array_keys($this->steps);
        $step = array_search($this->step, $keys, true) + 1;

        return add_query_arg('step', $keys[ $step ]);
    }

    /**
     * Introduction step
     */
    protected function welcome()
    {

        // Has this theme been setup yet? Compare this to the option set when you get to the last panel.
        $already_setup = get_option('merlin_' . $this->slug . '_completed');

        // Theme Name.
        $theme = ucfirst($this->theme);

        // Remove "Child" from the current theme name, if it's installed.
        $theme = str_replace(' Child', '', $theme);

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $header    = ! $already_setup ? $strings['welcome-header%s'] : $strings['welcome-header-success%s'];
        $paragraph = ! $already_setup ? $strings['welcome%s'] : $strings['welcome-success%s'];
        $start     = $strings['btn-start'];
        $no        = $strings['btn-no']; ?>

		<div class="merlin__content--transition">

			<?php echo wp_kses($this->svg(array( 'icon' => 'welcome' )), $this->svg_allowed_html()); ?>

			<h1><?php echo esc_html(sprintf($header, $theme)); ?></h1>

			<p><?php echo esc_html(sprintf($paragraph, $theme)); ?></p>

		</div>

		<footer class="merlin__content__footer">
			<a href="<?php echo esc_url(wp_get_referer() && ! strpos(wp_get_referer(), 'update.php') ? wp_get_referer() : admin_url('/')); ?>" class="merlin__button merlin__button--skip"><?php echo esc_html($no); ?></a>
			<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next merlin__button--proceed merlin__button--colorchange"><?php echo esc_html($start); ?></a>
			<?php wp_nonce_field('merlin'); ?>
		</footer>

	<?php
        $this->logger->debug(esc_html__('The welcome step has been displayed', 'meto'));
    }

    protected function requirements()
    {
        $screen = get_current_screen();
        $allowed_html = wp_kses_allowed_html('post');
        // Theme Name.
        $theme = ucfirst($this->theme);

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $header    = esc_html__('System Health Check', 'meto');

        $php_version = phpversion();
        $paragraph = '';
        $start     = $strings['btn-start'];
        $no        = $strings['btn-no'];
        // $health_test = apply_filters( 'site_status_tests', [] );
        // printr($health_test);
        if (! class_exists('WP_Site_Health')) {
            require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
        }
        $health_class = new WP_Site_Health;
        $health_check_js_variables = array(
            'screen'      => '',
            'nonce'       => array(
                'site_status'        => wp_create_nonce('health-check-site-status'),
                'site_status_result' => wp_create_nonce('health-check-site-status-result'),
            ),
            'site_status' => array(
                'direct' => array(),
                'async'  => array(),
                'issues' => array(
                    'good'        => 0,
                    'recommended' => 0,
                    'critical'    => 0,
                ),
            ),
        );
        $tests = WP_Site_Health::get_tests();

        // Don't run https test on localhost
        if ('localhost' === preg_replace('|https?://|', '', get_site_url())) {
            unset($tests['direct']['https_status']);
        }

        foreach ($tests['direct'] as $test) {
            if (is_string($test['test'])) {
                $test_function = sprintf(
                    'get_test_%s',
                    $test['test']
                );

                if (method_exists($health_class, $test_function) && is_callable(array( $health_class, $test_function ))) {
                    $health_check_js_variables['site_status']['direct'][] = call_user_func(array( $health_class, $test_function ));
                    continue;
                }
            }

            if (is_callable($test['test'])) {
                $health_check_js_variables['site_status']['direct'][] = call_user_func($test['test']);
            }
        } ?>

		<div class="merlin__content--transition">

			<?php echo wp_kses($this->svg(array( 'icon' => 'welcome' )), $this->svg_allowed_html()); ?>
			<h1><?php echo esc_html(sprintf($header, $theme)); ?></h1>
			<ul class="merlin__drawer merlin__drawer--install-plugins" style="max-height: 100%; opacity: 1; pointer-events:inherit; max-width: 850px;">
				<?php foreach ($health_check_js_variables['site_status']['direct'] as $health_check) : ?>

					<?php
                        $label_class = 'success';
        if ($health_check['status'] == 'critical') {
            $label_class = 'error';
        } elseif ($health_check['status'] == 'recommended') {
            $label_class = 'warning';
        } ?>

					<li data-slug="php-version" style="opacity: 1; border-bottom: 1px solid #ddd; padding: 10px 0">
						<input type="checkbox" name="system_requirements[php-version]" class="checkbox" id="system_requirements-php-version" value="1" checked disabled>
						<label for="default_plugins" class="<?php echo esc_attr($label_class); ?>">
							<i></i>
							<span><strong><?php echo $health_check['label'] ?></strong></span>
							<span class="badge">
								<span class="hint--top" aria-label="<?php echo esc_attr(ucwords($health_check['status'])) ?>"><?php echo esc_attr($health_check['status']) ?></span>
							</span>
						</label>
						<?php echo wp_kses($health_check['description'], $allowed_html) ?>
					</li>
				<?php endforeach; ?>

			</ul>

		</div>

		<footer class="merlin__content__footer">
			<a href="<?php echo esc_url(wp_get_referer() && ! strpos(wp_get_referer(), 'update.php') ? wp_get_referer() : admin_url('/')); ?>" class="merlin__button merlin__button--skip"><?php echo esc_html($no); ?></a>
			<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next merlin__button--proceed merlin__button--colorchange"><?php echo esc_html($start); ?></a>
			<?php wp_nonce_field('merlin'); ?>
		</footer>

	<?php
        $this->logger->debug(esc_html__('The welcome step has been displayed', 'meto'));
    }

    /**
     * Handles save button from welcome page.
     * This is to perform tasks when the setup wizard has already been run.
     */
    protected function welcome_handler()
    {
        check_admin_referer('merlin');

        return false;
    }

    /**
     * Theme EDD license step.
     */
    protected function license()
    {
        $is_theme_registered = $this->is_theme_registered();
        $action_url          = $this->theme_license_help_url;
        $required            = $this->license_required;

        $is_theme_registered_class = ($is_theme_registered) ? ' is-registered' : null;

        // Theme Name.
        $theme = ucfirst($this->theme);

        // Remove "Child" from the current theme name, if it's installed.
        $theme = str_replace(' Child', '', $theme);

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $header    = ! $is_theme_registered ? $strings['license-header%s'] : $strings['license-header-success%s'];
        $action    = $strings['license-tooltip'];
        $label     = $strings['license-label'];
        $skip      = $strings['btn-license-skip'];
        $next      = $strings['btn-next'];
        $paragraph = ! $is_theme_registered ? $strings['license%s'] : $strings['license-success%s'];
        $install   = $strings['btn-license-activate']; ?>

		<div class="merlin__content--transition">

			<?php echo wp_kses($this->svg(array( 'icon' => 'license' )), $this->svg_allowed_html()); ?>

			<svg class="icon icon--checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
				<circle class="icon--checkmark__circle" cx="26" cy="26" r="25" fill="none"/><path class="icon--checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
			</svg>

			<h1><?php echo esc_html(sprintf($header, $theme)); ?></h1>

			<p id="license-text"><?php echo esc_html(sprintf($paragraph, $theme)); ?></p>

			<?php if (! $is_theme_registered) : ?>
				<div class="merlin__content--license-key">
					<label for="license-key"><?php echo esc_html($label); ?></label>

					<div class="merlin__content--license-key-wrapper">
						<input type="text" id="license-key" class="js-license-key" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
						<?php if (! empty($action_url)) : ?>
							<a href="<?php echo esc_url($action_url); ?>" alt="<?php echo esc_attr($action); ?>" target="_blank">
								<span class="hint--top" aria-label="<?php echo esc_attr($action); ?>">
									<?php echo wp_kses($this->svg(array( 'icon' => 'help' )), $this->svg_allowed_html()); ?>
								</span>
							</a>
						<?php endif ?>
					</div>

				</div>
			<?php endif; ?>

		</div>

		<footer class="merlin__content__footer <?php echo esc_attr($is_theme_registered_class); ?>">

			<?php if (! $is_theme_registered) : ?>

				<?php if (! $required) : ?>
					<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--skip merlin__button--proceed"><?php echo esc_html($skip); ?></a>
				<?php endif ?>

				<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next button-next js-merlin-license-activate-button" data-callback="activate_license">
					<span class="merlin__button--loading__text"><?php echo esc_html($install); ?></span>
					<?php echo wp_kses($this->loading_spinner(), $this->loading_spinner_allowed_html()); ?>
				</a>

			<?php else : ?>
				<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next merlin__button--proceed merlin__button--colorchange"><?php echo esc_html($next); ?></a>
			<?php endif; ?>
			<?php wp_nonce_field('merlin'); ?>
		</footer>
		<?php
        $this->logger->debug(esc_html__('The license activation step has been displayed', 'meto'));
    }


    /**
     * Check, if the theme is currently registered.
     *
     * @return boolean
     */
    private function is_theme_registered()
    {
        $is_registered = get_option($this->edd_theme_slug . '_license_key_status', false) === 'valid';
        return apply_filters('merlin_is_theme_registered', $is_registered);
    }

    /**
     * Child theme generator.
     */
    protected function child()
    {

        // Variables.
        $is_child_theme     = is_child_theme();
        $child_theme_option = get_option('merlin_' . $this->slug . '_child');
        $theme              = $child_theme_option ? wp_get_theme($child_theme_option)->name : $this->theme . ' Child';
        $action_url         = $this->child_action_btn_url;

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $header    = ! $is_child_theme ? $strings['child-header'] : $strings['child-header-success'];
        $action    = $strings['child-action-link'];
        $skip      = $strings['btn-skip'];
        $next      = $strings['btn-next'];
        $paragraph = ! $is_child_theme ? $strings['child'] : $strings['child-success%s'];
        $install   = $strings['btn-child-install']; ?>

		<div class="merlin__content--transition">

			<?php echo wp_kses($this->svg(array( 'icon' => 'child' )), $this->svg_allowed_html()); ?>

			<svg class="icon icon--checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
				<circle class="icon--checkmark__circle" cx="26" cy="26" r="25" fill="none"/><path class="icon--checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
			</svg>

			<h1><?php echo esc_html($header); ?></h1>

			<p id="child-theme-text"><?php echo esc_html(sprintf($paragraph, $theme)); ?></p>

			<a class="merlin__button merlin__button--knockout merlin__button--no-chevron merlin__button--external" href="<?php echo esc_url($action_url); ?>" target="_blank"><?php echo esc_html($action); ?></a>

		</div>

		<footer class="merlin__content__footer">

			<?php if (! $is_child_theme) : ?>

				<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--skip merlin__button--proceed"><?php echo esc_html($skip); ?></a>

				<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next button-next" data-callback="install_child">
					<span class="merlin__button--loading__text"><?php echo esc_html($install); ?></span>
					<?php echo wp_kses($this->loading_spinner(), $this->loading_spinner_allowed_html()); ?>
				</a>

			<?php else : ?>
				<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next merlin__button--proceed merlin__button--colorchange"><?php echo esc_html($next); ?></a>
			<?php endif; ?>
			<?php wp_nonce_field('merlin'); ?>
		</footer>
	<?php
        $this->logger->debug(esc_html__('The child theme installation step has been displayed', 'meto'));
    }

    /**
     * Theme plugins
     */
    protected function plugins()
    {

        // Variables.
        $url    = wp_nonce_url(add_query_arg(array( 'plugins' => 'go' )), 'merlin');
        $method = '';
        $fields = array_keys($_POST);
        $creds  = request_filesystem_credentials(esc_url_raw($url), $method, false, false, $fields);

        \Meto\Includes\Library\tgmpa_load_bulk_installer();

        if (false === $creds) {
            return true;
        }

        if (! WP_Filesystem($creds)) {
            request_filesystem_credentials(esc_url_raw($url), $method, true, false, $fields);
            return true;
        }

        // Are there plugins that need installing/activating?
        $plugins          = $this->get_tgmpa_plugins();

        $required_plugins = $recommended_plugins = array();
        $count            = count($plugins['all']);
        $class            = $count ? null : 'no-plugins';

        // Split the plugins into required and recommended.
        foreach ($plugins['all'] as $slug => $plugin) {
            if (! empty($plugin['required'])) {
                $required_plugins[ $slug ] = $plugin;
            } else {
                $recommended_plugins[ $slug ] = $plugin;
            }
        }

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $header    = $count ? $strings['plugins-header'] : $strings['plugins-header-success'];
        $paragraph = $count ? $strings['plugins'] : $strings['plugins-success%s'];
        $action    = $strings['plugins-action-link'];
        $skip      = $strings['btn-skip'];
        $next      = $strings['btn-next'];
        $install   = $strings['btn-plugins-install']; ?>

		<div class="merlin__content--transition">

			<?php echo wp_kses($this->svg(array( 'icon' => 'plugins' )), $this->svg_allowed_html()); ?>

			<svg class="icon icon--checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
				<circle class="icon--checkmark__circle" cx="26" cy="26" r="25" fill="none"/><path class="icon--checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
			</svg>

			<h1><?php echo esc_html($header); ?></h1>

			<p><?php echo esc_html($paragraph); ?></p>

			<?php if ($count) {
            ?>
				<a id="merlin__drawer-trigger" class="merlin__button merlin__button--knockout"><span><?php echo esc_html($action); ?></span><span class="chevron"></span></a>
			<?php
        } ?>

		</div>

		<form action="" method="post">

			<?php if ($count) : ?>

				<ul class="merlin__drawer merlin__drawer--install-plugins">

				<?php if (! empty($required_plugins)) : ?>
					<?php foreach ($required_plugins as $slug => $plugin) : ?>
						<li data-slug="<?php echo esc_attr($slug); ?>">
							<input type="checkbox" name="default_plugins[<?php echo esc_attr($slug); ?>]" class="checkbox" id="default_plugins_<?php echo esc_attr($slug); ?>" value="1" checked>

							<label for="default_plugins_<?php echo esc_attr($slug); ?>">
								<i></i>

								<span><?php echo esc_html($plugin['name']); ?></span>

								<span class="badge">
									<span class="hint--top" aria-label="<?php esc_html_e('Required', 'meto'); ?>">
										<?php esc_html_e('req', 'meto'); ?>
									</span>
								</span>
							</label>
						</li>
					<?php endforeach; ?>
				<?php endif; ?>

				<?php if (! empty($recommended_plugins)) : ?>
					<?php foreach ($recommended_plugins as $slug => $plugin) : ?>
						<li data-slug="<?php echo esc_attr($slug); ?>">
							<input type="checkbox" name="default_plugins[<?php echo esc_attr($slug); ?>]" class="checkbox" id="default_plugins_<?php echo esc_attr($slug); ?>" value="1" checked>

							<label for="default_plugins_<?php echo esc_attr($slug); ?>">
								<i></i><span><?php echo esc_html($plugin['name']); ?></span>
							</label>
						</li>
					<?php endforeach; ?>
				<?php endif; ?>

				</ul>

			<?php endif; ?>

			<footer class="merlin__content__footer <?php echo esc_attr($class); ?>">
				<?php if ($count) : ?>
					<a id="close" href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--skip merlin__button--closer merlin__button--proceed"><?php echo esc_html($skip); ?></a>
					<a id="skip" href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--skip merlin__button--proceed"><?php echo esc_html($skip); ?></a>
					<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next button-next" data-callback="install_plugins">
						<span class="merlin__button--loading__text"><?php echo esc_html($install); ?></span>
						<?php echo wp_kses($this->loading_spinner(), $this->loading_spinner_allowed_html()); ?>
					</a>
				<?php else : ?>
					<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next merlin__button--proceed merlin__button--colorchange"><?php echo esc_html($next); ?></a>
				<?php endif; ?>
				<?php wp_nonce_field('merlin'); ?>
			</footer>
		</form>

	<?php
        $this->logger->debug(esc_html__('The plugin installation step has been displayed', 'meto'));
    }

    /**
     * Page setup
     */
    protected function content()
    {
        $import_info = $this->get_import_data_info();

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $header    = $strings['import-header'];
        $paragraph = $strings['import'];
        $action    = $strings['import-action-link'];
        $skip      = $strings['btn-skip'];
        $next      = $strings['btn-next'];
        $import    = $strings['btn-import'];

        $multi_import = (1 < count($this->import_files)) ? 'is-multi-import' : null; ?>

		<div class="merlin__content--transition">

			<?php echo wp_kses($this->svg(array( 'icon' => 'content' )), $this->svg_allowed_html()); ?>

			<svg class="icon icon--checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
				<circle class="icon--checkmark__circle" cx="26" cy="26" r="25" fill="none"/><path class="icon--checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
			</svg>

			<h1><?php echo esc_html($header); ?></h1>

			<p><?php echo esc_html($paragraph); ?></p>

			<?php if (1 < count($this->import_files)) : ?>

				<div class="merlin__select-control-wrapper">

					<select class="merlin__select-control js-merlin-demo-import-select">
						<?php foreach ($this->import_files as $index => $import_file) : ?>
							<option value="<?php echo esc_attr($index); ?>"><?php echo esc_html($import_file['import_file_name']); ?></option>
						<?php endforeach; ?>
					</select>

					<div class="merlin__select-control-help">
						<span class="hint--top" aria-label="<?php echo esc_attr__('Select Demo', 'meto'); ?>">
							<?php echo wp_kses($this->svg(array( 'icon' => 'downarrow' )), $this->svg_allowed_html()); ?>
						</span>
					</div>
				</div>
			<?php endif; ?>

			<a id="merlin__drawer-trigger" class="merlin__button merlin__button--knockout"><span><?php echo esc_html($action); ?></span><span class="chevron"></span></a>

		</div>

		<form action="" method="post" class="<?php echo esc_attr($multi_import); ?>">

			<ul class="merlin__drawer merlin__drawer--import-content js-merlin-drawer-import-content">
				<?php echo $this->get_import_steps_html($import_info); ?>
			</ul>

			<footer class="merlin__content__footer">

				<a id="close" href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--skip merlin__button--closer merlin__button--proceed"><?php echo esc_html($skip); ?></a>

				<a id="skip" href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--skip merlin__button--proceed"><?php echo esc_html($skip); ?></a>

				<a href="<?php echo esc_url($this->step_next_link()); ?>" class="merlin__button merlin__button--next button-next" data-callback="install_content">
					<span class="merlin__button--loading__text"><?php echo esc_html($import); ?></span>

					<div class="merlin__progress-bar">
						<span class="js-merlin-progress-bar"></span>
					</div>

					<span class="js-merlin-progress-bar-percentage">0%</span>
				</a>

				<?php wp_nonce_field('merlin'); ?>
			</footer>
		</form>

	<?php
        $this->logger->debug(esc_html__('The content import step has been displayed', 'meto'));
    }


    /**
     * Final step
     */
    protected function ready()
    {

        // Author name.
        $author = $this->theme->author;

        // Theme Name.
        $theme = ucfirst($this->theme);

        // Remove "Child" from the current theme name, if it's installed.
        $theme = str_replace(' Child', '', $theme);

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $header    = $strings['ready-header'];
        $paragraph = $strings['ready%s'];
        $action    = $strings['ready-action-link'];
        $skip      = $strings['btn-skip'];
        $next      = $strings['btn-next'];
        $big_btn   = $strings['ready-big-button'];

        // Links.
        $links = array();

        for ($i = 1; $i < 4; $i++) {
            if (! empty($strings[ "ready-link-$i" ])) {
                $links[] = $strings[ "ready-link-$i" ];
            }
        }

        $links_class = empty($links) ? 'merlin__content__footer--nolinks' : null;

        $allowed_html_array = array(
            'a' => array(
                'href'   => array(),
                'title'  => array(),
                'target' => array(),
            ),
        );

        update_option('merlin_' . $this->slug . '_completed', time()); ?>

		<div class="merlin__content--transition">

			<?php echo wp_kses($this->svg(array( 'icon' => 'done' )), $this->svg_allowed_html()); ?>

			<h1><?php echo esc_html(sprintf($header, $theme)); ?></h1>

			<p><?php wp_kses(printf($paragraph, $author), $allowed_html_array); ?></p>

		</div>

		<footer class="merlin__content__footer merlin__content__footer--fullwidth <?php echo esc_attr($links_class); ?>">

			<a href="<?php echo esc_url($this->ready_big_button_url); ?>" class="merlin__button merlin__button--blue merlin__button--fullwidth merlin__button--popin"><?php echo esc_html($big_btn); ?></a>

			<?php if (! empty($links)) : ?>
				<a id="merlin__drawer-trigger" class="merlin__button merlin__button--knockout"><span><?php echo esc_html($action); ?></span><span class="chevron"></span></a>

				<ul class="merlin__drawer merlin__drawer--extras">

					<?php foreach ($links as $link) : ?>
						<li><?php echo wp_kses($link, $allowed_html_array); ?></li>
					<?php endforeach; ?>

				</ul>
			<?php endif; ?>

		</footer>

	<?php
        $this->logger->debug(esc_html__('The final step has been displayed', 'meto'));
    }

    /**
     * Get registered TGMPA plugins
     *
     * @return    array
     */
    protected function get_tgmpa_plugins()
    {
        $plugins = array(
            'all'      => array(), // Meaning: all plugins which still have open actions.
            'install'  => array(),
            'update'   => array(),
            'activate' => array(),
        );

        foreach ($this->tgmpa->plugins as $slug => $plugin) {
            if ($this->tgmpa->is_plugin_active($slug) && false === $this->tgmpa->does_plugin_have_update($slug)) {
                continue;
            } else {
                $plugins['all'][ $slug ] = $plugin;
                if (! $this->tgmpa->is_plugin_installed($slug)) {
                    $plugins['install'][ $slug ] = $plugin;
                } else {
                    if (false !== $this->tgmpa->does_plugin_have_update($slug)) {
                        $plugins['update'][ $slug ] = $plugin;
                    }
                    if ($this->tgmpa->can_plugin_activate($slug)) {
                        $plugins['activate'][ $slug ] = $plugin;
                    }
                }
            }
        }

        return $plugins;
    }

    /**
     * Generate the child theme via AJAX.
     */
    public function generate_child()
    {

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Text strings.
        $success = $strings['child-json-success%s'];
        $already = $strings['child-json-already%s'];

        $name = $this->theme . ' Child';
        $slug = sanitize_title($name);

        $path = get_theme_root() . '/' . $slug;

        if (! file_exists($path)) {
            WP_Filesystem();

            global $wp_filesystem;

            wp_mkdir_p($path);
            $wp_filesystem->put_contents($path . '/style.css', $this->generate_child_style_css($this->theme->template, $this->theme->name, $this->theme->author, $this->theme->version));
            $wp_filesystem->put_contents($path . '/functions.php', $this->generate_child_functions_php($this->theme->template));

            $this->generate_child_screenshot($path);

            $allowed_themes          = get_option('allowedthemes');
            $allowed_themes[ $slug ] = true;
            update_option('allowedthemes', $allowed_themes);
        } else {
            if ($this->theme->template !== $slug) :
                update_option('merlin_' . $this->slug . '_child', $name);
            switch_theme($slug);
            endif;

            $this->logger->debug(esc_html__('The existing child theme was activated', 'meto'));

            wp_send_json(
                array(
                    'done'    => 1,
                    'message' => sprintf(
                        esc_html($success),
                        $slug
                    ),
                )
            );
        }

        if ($this->theme->template !== $slug) :
            update_option('merlin_' . $this->slug . '_child', $name);
        switch_theme($slug);
        endif;

        $this->logger->debug(esc_html__('The newly generated child theme was activated', 'meto'));

        wp_send_json(
            array(
                'done'    => 1,
                'message' => sprintf(
                    esc_html($already),
                    $name
                ),
            )
        );
    }

    /**
     * Activate the theme (license key) via AJAX.
     */
    public function _ajax_activate_license()
    {
        if (! check_ajax_referer('merlin_nonce', 'wpnonce')) {
            wp_send_json(
                array(
                    'success' => false,
                    'message' => esc_html__('Yikes! The theme activation failed. Please try again or contact support.', 'meto'),
                )
            );
        }

        if (empty($_POST['license_key'])) {
            wp_send_json(
                array(
                    'success' => false,
                    'message' => esc_html__('Please add your license key before attempting to activate one.', 'meto'),
                )
            );
        }

        $license_key = sanitize_key($_POST['license_key']);

        if (! has_filter('merlin_ajax_activate_license')) {
            $result = $this->edd_activate_license($license_key);
        } else {
            $result = apply_filters('merlin_ajax_activate_license', $license_key);
        }

        $this->logger->debug(esc_html__('The license activation was performed with the following results', 'meto'), $result);

        wp_send_json(array_merge(array( 'done' => 1 ), $result));
    }

    /**
     * Activate the EDD license.
     *
     * This code was taken from the EDD licensing addon theme example code
     * (`activate_license` method of the `EDD_Theme_Updater_Admin` class).
     *
     * @param string $license The license key.
     *
     * @return array
     */
    protected function edd_activate_license($license)
    {
        $success = false;

        // Strings passed in from the config file.
        $strings = $this->strings;

        // Theme Name.
        $theme = ucfirst($this->theme);

        // Remove "Child" from the current theme name, if it's installed.
        $theme = str_replace(' Child', '', $theme);

        // Text strings.
        $success_message = $strings['license-json-success%s'];

        // Data to send in our API request.
        $api_params = array(
            'edd_action' => 'activate_license',
            'license'    => rawurlencode($license),
            'item_name'  => rawurlencode($this->edd_item_name),
            'url'        => esc_url(home_url('/')),
        );

        $response = $this->edd_get_api_response($api_params);

        // Make sure the response came back okay.
        if (is_wp_error($response) || 200 !== wp_remote_retrieve_response_code($response)) {
            if (is_wp_error($response)) {
                $message = $response->get_error_message();
            } else {
                $message = esc_html__('An error occurred, please try again.', 'meto');
            }
        } else {
            $license_data = json_decode(wp_remote_retrieve_body($response));

            if (false === $license_data->success) {
                switch ($license_data->error) {

                    case 'expired':
                        $message = sprintf(
                            /* translators: Expiration date */
                            esc_html__('Your license key expired on %s.', 'meto'),
                            date_i18n(get_option('date_format'), strtotime($license_data->expires, current_time('timestamp')))
                        );
                        break;

                    case 'revoked':
                        $message = esc_html__('Your license key has been disabled.', 'meto');
                        break;

                    case 'missing':
                        $message = esc_html__('This appears to be an invalid license key. Please try again or contact support.', 'meto');
                        break;

                    case 'invalid':
                    case 'site_inactive':
                        $message = esc_html__('Your license is not active for this URL.', 'meto');
                        break;

                    case 'item_name_mismatch':
                        /* translators: EDD Item Name */
                        $message = sprintf(esc_html__('This appears to be an invalid license key for %s.', 'meto'), $this->edd_item_name);
                        break;

                    case 'no_activations_left':
                        $message = esc_html__('Your license key has reached its activation limit.', 'meto');
                        break;

                    default:
                        $message = esc_html__('An error occurred, please try again.', 'meto');
                        break;
                }
            } else {
                if ('valid' === $license_data->license) {
                    $message = sprintf(esc_html($success_message), $theme);
                    $success = true;

                    // Removes the default EDD hook for this option, which breaks the AJAX call.
                    remove_all_actions('update_option_' . $this->edd_theme_slug . '_license_key', 10);

                    update_option($this->edd_theme_slug . '_license_key_status', $license_data->license);
                    update_option($this->edd_theme_slug . '_license_key', $license);
                }
            }
        }

        return compact('success', 'message');
    }

    /**
     * Makes a call to the API.
     *
     * This code was taken from the EDD licensing addon theme example code
     * (`get_api_response` method of the `EDD_Theme_Updater_Admin` class).
     *
     * @param array $api_params to be used for wp_remote_get.
     * @return array $response JSON response.
     */
    private function edd_get_api_response($api_params)
    {
        $verify_ssl = (bool) apply_filters('edd_sl_api_request_verify_ssl', true);

        $response = wp_remote_post(
            $this->edd_remote_api_url,
            array(
                'timeout'   => 15,
                'sslverify' => $verify_ssl,
                'body'      => $api_params,
            )
        );

        return $response;
    }

    /**
     * Content template for the child theme functions.php file.
     *
     * @link https://gist.github.com/richtabor/688327dd103b1aa826ebae47e99a0fbe
     *
     * @param string $slug Parent theme slug.
     */
    public function generate_child_functions_php($slug)
    {
        $slug_no_hyphens = strtolower(preg_replace('#[^a-zA-Z]#', '', $slug));

        $output = "
			<?php
			/**
			 * Theme functions and definitions.
			 * This child theme was generated by Merlin WP.
			 *
			 * @link https://developer.wordpress.org/themes/basics/theme-functions/
			 */

			/*
			 * If your child theme has more than one .css file (eg. ie.css, style.css, main.css) then
			 * you will have to make sure to maintain all of the parent theme dependencies.
			 *
			 * Make sure you're using the correct handle for loading the parent theme's styles.
			 * Failure to use the proper tag will result in a CSS file needlessly being loaded twice.
			 * This will usually not affect the site appearance, but it's inefficient and extends your page's loading time.
			 *
			 * @link https://codex.wordpress.org/Child_Themes
			 */
			function {$slug_no_hyphens}_child_enqueue_styles() {
			    wp_enqueue_style( '{$slug}-style' , get_template_directory_uri() . '/style.css' );
			    wp_enqueue_style( '{$slug}-child-style',
			        get_stylesheet_directory_uri() . '/style.css',
			        array( '{$slug}-style' ),
			        wp_get_theme()->get('Version')
			    );
			}

			add_action(  'wp_enqueue_scripts', '{$slug_no_hyphens}_child_enqueue_styles' );\n
		";

        // Let's remove the tabs so that it displays nicely.
        $output = trim(preg_replace('/\t+/', '', $output));

        $this->logger->debug(esc_html__('The child theme functions.php content was generated', 'meto'));

        // Filterable return.
        return apply_filters('merlin_generate_child_functions_php', $output, $slug);
    }

    /**
     * Content template for the child theme functions.php file.
     *
     * @link https://gist.github.com/richtabor/7d88d279706fc3093911e958fd1fd791
     *
     * @param string $slug    Parent theme slug.
     * @param string $parent  Parent theme name.
     * @param string $author  Parent theme author.
     * @param string $version Parent theme version.
     */
    public function generate_child_style_css($slug, $parent, $author, $version)
    {
        $output = "
			/**
			* Theme Name: {$parent} Child
			* Description: This is a child theme of {$parent}, generated by Merlin WP.
			* Author: {$author}
			* Template: {$slug}
			* Version: {$version}
			*/\n
		";

        // Let's remove the tabs so that it displays nicely.
        $output = trim(preg_replace('/\t+/', '', $output));

        $this->logger->debug(esc_html__('The child theme style.css content was generated', 'meto'));

        return apply_filters('merlin_generate_child_style_css', $output, $slug, $parent, $version);
    }

    /**
     * Generate child theme screenshot file.
     *
     * @param string $path    Child theme path.
     */
    public function generate_child_screenshot($path)
    {
        $screenshot = apply_filters('merlin_generate_child_screenshot', '');

        if (! empty($screenshot)) {
            // Get custom screenshot file extension
            if ('.png' === substr($screenshot, -4)) {
                $screenshot_ext = 'png';
            } else {
                $screenshot_ext = 'jpg';
            }
        } else {
            if (file_exists($this->base_path . '/screenshot.png')) {
                $screenshot     = $this->base_path . '/screenshot.png';
                $screenshot_ext = 'png';
            } elseif (file_exists($this->base_path . '/screenshot.jpg')) {
                $screenshot     = $this->base_path . '/screenshot.jpg';
                $screenshot_ext = 'jpg';
            }
        }

        if (! empty($screenshot) && file_exists($screenshot)) {
            $copied = copy($screenshot, $path . '/screenshot.' . $screenshot_ext);

            $this->logger->debug(esc_html__('The child theme screenshot was copied to the child theme, with the following result', 'meto'), array( 'copied' => $copied ));
        } else {
            $this->logger->debug(esc_html__('The child theme screenshot was not generated, because of these results', 'meto'), array( 'screenshot' => $screenshot ));
        }
    }

    /**
     * Do plugins' AJAX
     *
     * @internal    Used as a calback.
     */
    public function _ajax_plugins()
    {
        if (! check_ajax_referer('merlin_nonce', 'wpnonce') || empty($_POST['slug'])) {
            exit(0);
        }

        $json      = array();
        $tgmpa_url = $this->tgmpa->get_tgmpa_url();
        $plugins   = $this->get_tgmpa_plugins();

        foreach ($plugins['activate'] as $slug => $plugin) {
            if ($_POST['slug'] === $slug) {
                $json = array(
                    'url'           => $tgmpa_url,
                    'plugin'        => array( $slug ),
                    'tgmpa-page'    => $this->tgmpa->menu,
                    'plugin_status' => 'all',
                    '_wpnonce'      => wp_create_nonce('bulk-plugins'),
                    'action'        => 'tgmpa-bulk-activate',
                    'action2'       => - 1,
                    'message'       => esc_html__('Activating', 'meto'),
                );
                break;
            }
        }

        foreach ($plugins['update'] as $slug => $plugin) {
            if ($_POST['slug'] === $slug) {
                $json = array(
                    'url'           => $tgmpa_url,
                    'plugin'        => array( $slug ),
                    'tgmpa-page'    => $this->tgmpa->menu,
                    'plugin_status' => 'all',
                    '_wpnonce'      => wp_create_nonce('bulk-plugins'),
                    'action'        => 'tgmpa-bulk-update',
                    'action2'       => - 1,
                    'message'       => esc_html__('Updating', 'meto'),
                );
                break;
            }
        }

        foreach ($plugins['install'] as $slug => $plugin) {
            if ($_POST['slug'] === $slug) {
                $json = array(
                    'url'           => $tgmpa_url,
                    'plugin'        => array( $slug ),
                    'tgmpa-page'    => $this->tgmpa->menu,
                    'plugin_status' => 'all',
                    '_wpnonce'      => wp_create_nonce('bulk-plugins'),
                    'action'        => 'tgmpa-bulk-install',
                    'action2'       => - 1,
                    'message'       => esc_html__('Installing', 'meto'),
                );
                break;
            }
        }

        if ($json) {
            $this->logger->debug(
                esc_html__('A plugin with the following data will be processed', 'meto'),
                array(
                    'plugin_slug' => $_POST['slug'],
                    'message'     => $json['message'],
                )
            );

            $json['hash']    = md5(serialize($json));
            $json['message'] = esc_html__('Installing', 'meto');
            wp_send_json($json);
        } else {
            $this->logger->debug(
                esc_html__('A plugin with the following data was processed', 'meto'),
                array(
                    'plugin_slug' => $_POST['slug'],
                )
            );

            wp_send_json(
                array(
                    'done'    => 1,
                    'message' => esc_html__('Success', 'meto'),
                )
            );
        }

        exit;
    }

    /**
     * Do content's AJAX
     *
     * @internal    Used as a callback.
     */
    public function _ajax_content()
    {
        static $content = null;

        $selected_import = intval($_POST['selected_index']);

        if (null === $content) {
            $content = $this->get_import_data($selected_import);
        }

        if (! check_ajax_referer('merlin_nonce', 'wpnonce') || empty($_POST['content']) && isset($content[ $_POST['content'] ])) {
            $this->logger->error(esc_html__('The content importer AJAX call failed to start, because of incorrect data', 'meto'));

            wp_send_json_error(
                array(
                    'error'   => 1,
                    'message' => esc_html__('Invalid content!', 'meto'),
                )
            );
        }

        $json         = false;
        $this_content = $content[ $_POST['content'] ];

        if (isset($_POST['proceed'])) {
            if (is_callable($this_content['install_callback'])) {
                $this->logger->info(
                    esc_html__('The content import AJAX call will be executed with this import data', 'meto'),
                    array(
                        'title' => $this_content['title'],
                        'data'  => $this_content['data'],
                    )
                );

                $logs = call_user_func($this_content['install_callback'], $this_content['data']);
                if ($logs) {
                    $json = array(
                        'done'    => 1,
                        'message' => $this_content['success'],
                        'debug'   => '',
                        'logs'    => $logs,
                        'errors'  => '',
                    );

                    // The content import ended, so we should mark that all posts were imported.
                    if ('content' === $_POST['content']) {
                        $json['num_of_imported_posts'] = 'all';
                    }
                }
            }
        } else {
            $json = array(
                'url'            => admin_url('admin-ajax.php'),
                'action'         => 'merlin_content',
                'proceed'        => 'true',
                'content'        => $_POST['content'],
                '_wpnonce'       => wp_create_nonce('merlin_nonce'),
                'selected_index' => $selected_import,
                'message'        => $this_content['installing'],
                'logs'           => '',
                'errors'         => '',
            );
        }

        if ($json) {
            $json['hash'] = md5(serialize($json));
            wp_send_json($json);
        } else {
            $this->logger->error(
                esc_html__('The content import AJAX call failed with this passed data', 'meto'),
                array(
                    'selected_content_index' => $selected_import,
                    'importing_content'      => $_POST['content'],
                    'importing_data'         => $this_content['data'],
                )
            );

            wp_send_json(
                array(
                    'error'   => 1,
                    'message' => esc_html__('Error', 'meto'),
                    'logs'    => '',
                    'errors'  => '',
                )
            );
        }
    }


    /**
     * AJAX call to retrieve total items (posts, pages, CPT, attachments) for the content import.
     */
    public function _ajax_get_total_content_import_items()
    {
        if (! check_ajax_referer('merlin_nonce', 'wpnonce') && empty($_POST['selected_index'])) {
            $this->logger->error(esc_html__('The content importer AJAX call for retrieving total content import items failed to start, because of incorrect data.', 'meto'));

            wp_send_json_error(
                array(
                    'error'   => 1,
                    'message' => esc_html__('Invalid data!', 'meto'),
                )
            );
        }

        $selected_import = intval($_POST['selected_index']);
        $import_files    = $this->get_import_files_paths($selected_import);

        wp_send_json_success($this->importer->get_number_of_posts_to_import($import_files['content']));
    }


    /**
     * Get import data from the selected import.
     * Which data does the selected import have for the import.
     *
     * @param int $selected_import_index The index of the predefined demo import.
     *
     * @return bool|array
     */
    public function get_import_data_info($selected_import_index = 0)
    {
        $import_data = array(
            'content'      => false,
            'widgets'      => false,
            'options'      => false,
            'sliders'      => false,
            'redux'        => false,
            'after_import' => false,
        );

        if (empty($this->import_files[ $selected_import_index ])) {
            return false;
        }

        if (
            ! empty($this->import_files[ $selected_import_index ]['import_file_url']) ||
            ! empty($this->import_files[ $selected_import_index ]['local_import_file'])
        ) {
            $import_data['content'] = true;
        }

        if (
            ! empty($this->import_files[ $selected_import_index ]['import_widget_file_url']) ||
            ! empty($this->import_files[ $selected_import_index ]['local_import_widget_file'])
        ) {
            $import_data['widgets'] = true;
        }

        if (
            ! empty($this->import_files[ $selected_import_index ]['import_customizer_file_url']) ||
            ! empty($this->import_files[ $selected_import_index ]['local_import_customizer_file'])
        ) {
            $import_data['options'] = true;
        }

        if (
            ! empty($this->import_files[ $selected_import_index ]['import_rev_slider_file_url']) ||
            ! empty($this->import_files[ $selected_import_index ]['local_import_rev_slider_file'])
        ) {
            $import_data['sliders'] = true;
        }

        if (
            ! empty($this->import_files[ $selected_import_index ]['import_redux']) ||
            ! empty($this->import_files[ $selected_import_index ]['local_import_redux'])
        ) {
            $import_data['redux'] = true;
        }

        if (false !== has_action('merlin_after_all_import')) {
            $import_data['after_import'] = true;
        }

        return $import_data;
    }


    /**
     * Get the import files/data.
     *
     * @param int $selected_import_index The index of the predefined demo import.
     *
     * @return    array
     */
    protected function get_import_data($selected_import_index = 0)
    {
        $content = array();

        $import_files = $this->get_import_files_paths($selected_import_index);

        if (! empty($import_files['content'])) {
            $content['content'] = array(
                'title'            => esc_html__('Content', 'meto'),
                'description'      => esc_html__('Demo content data.', 'meto'),
                'pending'          => esc_html__('Pending', 'meto'),
                'installing'       => esc_html__('Installing', 'meto'),
                'success'          => esc_html__('Success', 'meto'),
                'checked'          => $this->is_possible_upgrade() ? 0 : 1,
                'install_callback' => array( $this->importer, 'import' ),
                'data'             => $import_files['content'],
            );
        }

        if (! empty($import_files['widgets'])) {
            $content['widgets'] = array(
                'title'            => esc_html__('Widgets', 'meto'),
                'description'      => esc_html__('Sample widgets data.', 'meto'),
                'pending'          => esc_html__('Pending', 'meto'),
                'installing'       => esc_html__('Installing', 'meto'),
                'success'          => esc_html__('Success', 'meto'),
                'install_callback' => array( 'Merlin_Widget_Importer', 'import' ),
                'checked'          => $this->is_possible_upgrade() ? 0 : 1,
                'data'             => $import_files['widgets'],
            );
        }

        if (! empty($import_files['sliders'])) {
            $content['sliders'] = array(
                'title'            => esc_html__('Revolution Slider', 'meto'),
                'description'      => esc_html__('Sample Revolution sliders data.', 'meto'),
                'pending'          => esc_html__('Pending', 'meto'),
                'installing'       => esc_html__('Installing', 'meto'),
                'success'          => esc_html__('Success', 'meto'),
                'install_callback' => array( $this, 'import_revolution_sliders' ),
                'checked'          => $this->is_possible_upgrade() ? 0 : 1,
                'data'             => $import_files['sliders'],
            );
        }

        if (! empty($import_files['options'])) {
            $content['options'] = array(
                'title'            => esc_html__('Options', 'meto'),
                'description'      => esc_html__('Sample theme options data.', 'meto'),
                'pending'          => esc_html__('Pending', 'meto'),
                'installing'       => esc_html__('Installing', 'meto'),
                'success'          => esc_html__('Success', 'meto'),
                'install_callback' => array( 'Merlin_Customizer_Importer', 'import' ),
                'checked'          => $this->is_possible_upgrade() ? 0 : 1,
                'data'             => $import_files['options'],
            );
        }

        if (! empty($import_files['redux'])) {
            $content['redux'] = array(
                'title'            => esc_html__('Redux Options', 'meto'),
                'description'      => esc_html__('Redux framework options.', 'meto'),
                'pending'          => esc_html__('Pending', 'meto'),
                'installing'       => esc_html__('Installing', 'meto'),
                'success'          => esc_html__('Success', 'meto'),
                'install_callback' => array( 'Merlin_Redux_Importer', 'import' ),
                'checked'          => $this->is_possible_upgrade() ? 0 : 1,
                'data'             => $import_files['redux'],
            );
        }

        if (false !== has_action('merlin_after_all_import')) {
            $content['after_import'] = array(
                'title'            => esc_html__('After import setup', 'meto'),
                'description'      => esc_html__('After import setup.', 'meto'),
                'pending'          => esc_html__('Pending', 'meto'),
                'installing'       => esc_html__('Installing', 'meto'),
                'success'          => esc_html__('Success', 'meto'),
                'install_callback' => array( $this->hooks, 'after_all_import_action' ),
                'checked'          => $this->is_possible_upgrade() ? 0 : 1,
                'data'             => $selected_import_index,
            );
        }

        $content = apply_filters('merlin_get_base_content', $content, $this);

        return $content;
    }

    /**
     * Import revolution slider.
     *
     * @param string $file Path to the revolution slider zip file.
     */
    public function import_revolution_sliders($file)
    {
        if (! class_exists('RevSlider', false)) {
            return 'failed';
        }


        $importer = new RevSliderSliderImport();

        $response = $importer->import_slider(true, $file);

        $this->logger->info(esc_html__('The revolution slider import was executed', 'meto'));

        if (defined('DOING_AJAX') && DOING_AJAX) {
            return 'true';
        }
    }

    /**
     * Change the new AJAX request response data.
     *
     * @param array $data The default data.
     *
     * @return array The updated data.
     */
    public function pt_importer_new_ajax_request_response_data($data)
    {
        $data['url']      = admin_url('admin-ajax.php');
        $data['message']  = esc_html__('Installing', 'meto');
        $data['proceed']  = 'true';
        $data['action']   = 'merlin_content';
        $data['content']  = 'content';
        $data['_wpnonce'] = wp_create_nonce('merlin_nonce');
        $data['hash']     = md5(rand()); // Has to be unique (check JS code catching this AJAX response).

        return $data;
    }

    /**
     * After content import setup code.
     */
    public function after_content_import_setup()
    {
        // Set static homepage.
        $homepage = get_page_by_title(apply_filters('merlin_content_home_page_title', 'Home'));

        if ($homepage) {
            update_option('page_on_front', $homepage->ID);
            update_option('show_on_front', 'page');

            $this->logger->debug(esc_html__('The home page was set', 'meto'), array( 'homepage_id' => $homepage ));
        }

        // Set static blog page.
        $blogpage = get_page_by_title(apply_filters('merlin_content_blog_page_title', 'Blog'));

        if ($blogpage) {
            update_option('page_for_posts', $blogpage->ID);
            update_option('show_on_front', 'page');

            $this->logger->debug(esc_html__('The blog page was set', 'meto'), array( 'blog_page_id' => $blogpage ));
        }
    }

    /**
     * Before content import setup code.
     */
    public function before_content_import_setup()
    {
        // Update the Hello World! post by making it a draft.
        $hello_world = get_page_by_title('Hello World!', OBJECT, 'post');

        if (! empty($hello_world)) {
            $hello_world->post_status = 'draft';
            wp_update_post($hello_world);

            $this->logger->debug(esc_html__('The Hello world post status was set to draft', 'meto'));
        }
    }

    /**
     * Register the import files via the `merlin_import_files` filter.
     */
    public function register_import_files()
    {
        $this->import_files = $this->validate_import_file_info(apply_filters('merlin_import_files', array()));
    }

    /**
     * Filter through the array of import files and get rid of those who do not comply.
     *
     * @param  array $import_files list of arrays with import file details.
     * @return array list of filtered arrays.
     */
    public function validate_import_file_info($import_files)
    {
        $filtered_import_file_info = array();

        foreach ($import_files as $import_file) {
            if (! empty($import_file['import_file_name'])) {
                $filtered_import_file_info[] = $import_file;
            } else {
                $this->logger->warning(esc_html__('This predefined demo import does not have the name parameter: import_file_name', 'meto'), $import_file);
            }
        }

        return $filtered_import_file_info;
    }

    /**
     * Set the import file base name.
     * Check if an existing base name is available (saved in a transient).
     */
    public function set_import_file_base_name()
    {
        $existing_name = get_transient('merlin_import_file_base_name');

        if (! empty($existing_name)) {
            $this->import_file_base_name = $existing_name;
        } else {
            $this->import_file_base_name = date('Y-m-d__H-i-s');
        }

        set_transient('merlin_import_file_base_name', $this->import_file_base_name, MINUTE_IN_SECONDS);
    }

    /**
     * Get the import file paths.
     * Grab the defined local paths, download the files or reuse existing files.
     *
     * @param int $selected_import_index The index of the selected import.
     *
     * @return array
     */
    public function get_import_files_paths($selected_import_index)
    {
        $selected_import_data = empty($this->import_files[ $selected_import_index ]) ? false : $this->import_files[ $selected_import_index ];

        if (empty($selected_import_data)) {
            return array();
        }

        // Set the base name for the import files.
        $this->set_import_file_base_name();

        $base_file_name = $this->import_file_base_name;
        $import_files   = array(
            'content' => '',
            'widgets' => '',
            'options' => '',
            'redux'   => array(),
            'sliders' => '',
        );

        $downloader = new Merlin_Downloader();

        // Check if 'import_file_url' is not defined. That would mean a local file.
        if (empty($selected_import_data['import_file_url'])) {
            if (! empty($selected_import_data['local_import_file']) && file_exists($selected_import_data['local_import_file'])) {
                $import_files['content'] = $selected_import_data['local_import_file'];
            }
        } else {
            // Set the filename string for content import file.
            $content_filename = 'content-' . $base_file_name . '.xml';

            // Retrieve the content import file.
            $import_files['content'] = $downloader->fetch_existing_file($content_filename);

            // Download the file, if it's missing.
            if (empty($import_files['content'])) {
                $import_files['content'] = $downloader->download_file($selected_import_data['import_file_url'], $content_filename);
            }

            // Reset the variable, if there was an error.
            if (is_wp_error($import_files['content'])) {
                $import_files['content'] = '';
            }
        }

        // Get widgets file as well. If defined!
        if (! empty($selected_import_data['import_widget_file_url'])) {
            // Set the filename string for widgets import file.
            $widget_filename = 'widgets-' . $base_file_name . '.json';

            // Retrieve the content import file.
            $import_files['widgets'] = $downloader->fetch_existing_file($widget_filename);

            // Download the file, if it's missing.
            if (empty($import_files['widgets'])) {
                $import_files['widgets'] = $downloader->download_file($selected_import_data['import_widget_file_url'], $widget_filename);
            }

            // Reset the variable, if there was an error.
            if (is_wp_error($import_files['widgets'])) {
                $import_files['widgets'] = '';
            }
        } elseif (! empty($selected_import_data['local_import_widget_file'])) {
            if (file_exists($selected_import_data['local_import_widget_file'])) {
                $import_files['widgets'] = $selected_import_data['local_import_widget_file'];
            }
        }

        // Get customizer import file as well. If defined!
        if (! empty($selected_import_data['import_customizer_file_url'])) {
            // Setup filename path to save the customizer content.
            $customizer_filename = 'options-' . $base_file_name . '.dat';

            // Retrieve the content import file.
            $import_files['options'] = $downloader->fetch_existing_file($customizer_filename);

            // Download the file, if it's missing.
            if (empty($import_files['options'])) {
                $import_files['options'] = $downloader->download_file($selected_import_data['import_customizer_file_url'], $customizer_filename);
            }

            // Reset the variable, if there was an error.
            if (is_wp_error($import_files['options'])) {
                $import_files['options'] = '';
            }
        } elseif (! empty($selected_import_data['local_import_customizer_file'])) {
            if (file_exists($selected_import_data['local_import_customizer_file'])) {
                $import_files['options'] = $selected_import_data['local_import_customizer_file'];
            }
        }

        // Get revolution slider import file as well. If defined!
        if (! empty($selected_import_data['import_rev_slider_file_url'])) {
            // Setup filename path to save the customizer content.
            $rev_slider_filename = 'slider-' . $base_file_name . '.zip';

            // Retrieve the content import file.
            $import_files['sliders'] = $downloader->fetch_existing_file($rev_slider_filename);

            // Download the file, if it's missing.
            if (empty($import_files['sliders'])) {
                $import_files['sliders'] = $downloader->download_file($selected_import_data['import_rev_slider_file_url'], $rev_slider_filename);
            }

            // Reset the variable, if there was an error.
            if (is_wp_error($import_files['sliders'])) {
                $import_files['sliders'] = '';
            }
        } elseif (! empty($selected_import_data['local_import_rev_slider_file'])) {
            if (file_exists($selected_import_data['local_import_rev_slider_file'])) {
                $import_files['sliders'] = $selected_import_data['local_import_rev_slider_file'];
            }
        }

        // Get redux import file as well. If defined!
        if (! empty($selected_import_data['import_redux'])) {
            $redux_items = array();

            // Setup filename paths to save the Redux content.
            foreach ($selected_import_data['import_redux'] as $index => $redux_item) {
                $redux_filename = 'redux-' . $index . '-' . $base_file_name . '.json';

                // Retrieve the content import file.
                $file_path = $downloader->fetch_existing_file($redux_filename);

                // Download the file, if it's missing.
                if (empty($file_path)) {
                    $file_path = $downloader->download_file($redux_item['file_url'], $redux_filename);
                }

                // Reset the variable, if there was an error.
                if (is_wp_error($file_path)) {
                    $file_path = '';
                }

                $redux_items[] = array(
                    'option_name' => $redux_item['option_name'],
                    'file_path'   => $file_path,
                );
            }

            // Download the Redux import file.
            $import_files['redux'] = $redux_items;
        } elseif (! empty($selected_import_data['local_import_redux'])) {
            $redux_items = array();

            // Setup filename paths to save the Redux content.
            foreach ($selected_import_data['local_import_redux'] as $redux_item) {
                if (file_exists($redux_item['file_path'])) {
                    $redux_items[] = $redux_item;
                }
            }

            // Download the Redux import file.
            $import_files['redux'] = $redux_items;
        }

        return $import_files;
    }

    /**
     * AJAX callback for the 'merlin_update_selected_import_data_info' action.
     */
    public function update_selected_import_data_info()
    {
        $selected_index = ! isset($_POST['selected_index']) ? false : intval($_POST['selected_index']);

        if (false === $selected_index) {
            wp_send_json_error();
        }

        $import_info      = $this->get_import_data_info($selected_index);
        $import_info_html = $this->get_import_steps_html($import_info);

        wp_send_json_success($import_info_html);
    }

    /**
     * Get the import steps HTML output.
     *
     * @param array $import_info The import info to prepare the HTML for.
     *
     * @return string
     */
    public function get_import_steps_html($import_info)
    {
        ob_start(); ?>
			<?php foreach ($import_info as $slug => $available) : ?>
				<?php
                if (! $available) {
                    continue;
                } ?>

				<li class="merlin__drawer--import-content__list-item status status--Pending" data-content="<?php echo esc_attr($slug); ?>">
					<input type="checkbox" name="default_content[<?php echo esc_attr($slug); ?>]" class="checkbox checkbox-<?php echo esc_attr($slug); ?>" id="default_content_<?php echo esc_attr($slug); ?>" value="1" checked>
					<label for="default_content_<?php echo esc_attr($slug); ?>">
						<i></i><span><?php echo esc_html(ucfirst(str_replace('_', ' ', $slug))); ?></span>
					</label>
				</li>

			<?php endforeach; ?>
		<?php

        return ob_get_clean();
    }


    /**
     * AJAX call for cleanup after the importing steps are done -> import finished.
     */
    public function import_finished()
    {
        delete_transient('merlin_import_file_base_name');
        wp_send_json_success();
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit