1388 lines
47 KiB
PHP
Executable File

<?php
defined('ABSPATH') or die("No script kiddies please!");
/**
* The admin-specific functionality of the plugin.
*
* @link https://mysterythemes.com/
* @since 1.0.0
*
* @package Mystery Themes Demo Importer
* @subpackage /admin
*/
if ( !class_exists( 'MTDI_Admin' ) ) :
class MTDI_Admin extends MTDI_Library{
/**
* The name of this plugin.
*
* @since 1.0.0
* @access private
* @var string $plugin_name The ID of this plugin.
*/
private $plugin_name;
/**
* The version of this plugin.
*
* @since 1.0.0
* @access private
* @var string $version The current version of this plugin.
*/
private $version;
/**
* Initialize the class and set its properties.
*
* @since 1.0.0
* @param string $plugin_name The name of this plugin.
* @param string $version The version of this plugin.
*/
public function __construct( $plugin_name, $version ) {
$this->plugin_name = $plugin_name;
$this->version = $version;
}
/**
* Register the stylesheets for the admin area.
*
* @since 1.0.0
*/
public function enqueue_styles() {
wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'css/mtdi-admin.css', array(), MTDI_VERSION, 'all' );
}
/**
* Register the JavaScript for the admin area.
*
* @since 1.0.0
*/
public function enqueue_scripts( $hook_suffix ) {
/**
* Applies condition for theme setting s page only.
*/
$activated_theme = get_stylesheet();
if ( is_child_theme() ) {
$activated_theme = get_template();
}
if ( $hook_suffix == 'appearance_page_'. esc_html( $activated_theme ) .'-settings' || $hook_suffix == 'appearance_page_'. esc_html( $activated_theme ) .'-dashboard' || $hook_suffix == 'appearance_page_mysterythemes-demo-importer' ) {
wp_enqueue_script( 'mtdi-admin', plugin_dir_url( __FILE__ ) . 'js/mtdi-admin.js', array( 'jquery','wp-util', 'updates' ), $this->version, false );
/** Localizing the text to be used in Scripts **/
wp_localize_script( 'mtdi-admin', 'MTDI_JSObject',
array(
'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ),
'wp_customize_on' => apply_filters( 'enable_wp_customize_save_hooks', false ),
'demo_installing' => __( 'Installing Demo...', 'mysterythemes-demo-importer' ),
'demo_installed' => __( 'Demo Installed', 'mysterythemes-demo-importer' ),
'plugin_installing' => __( 'Installing', 'mysterythemes-demo-importer' ),
'importing_demo' => __( 'Demo Importing...', 'mysterythemes-demo-importer' ),
'plugin_activating' => __( 'Activating', 'mysterythemes-demo-importer' ),
'activating_installing' => __( 'Installing & Activating', 'mysterythemes-demo-importer' ),
'plugin_activated' => __( 'Activated', 'mysterythemes-demo-importer' ),
'plugin_activate' => __( 'Activate Now', 'mysterythemes-demo-importer' ),
'_wpnonce' => wp_create_nonce( 'mtdi_admin_import_nonce' ),
'home_url' => get_bloginfo( 'url' ),
'demo_import_success' => __( 'Demo has been successfully installed', 'mysterythemes-demo-importer' ),
'demo_confirm' => __( 'Are you sure to import demo content?', 'mysterythemes-demo-importer' ),
)
);
}
}
/**
* Sets up plugin transient cache for further use
*
*/
public function plugin_setup() {
$packages = array();
$xmldemopackages = get_transient( 'mtdi_theme_packages' );
$activated_theme = get_template(); //active template slug
/**
* Fixed activated theme demo package's issue
* while switching in house theme
*
* @since 1.1.1
*/
$get_activated_theme = get_option( 'mtdi_activated_theme' );
if ( empty( $get_activated_theme ) || $activated_theme !== $get_activated_theme ) {
$packages = $this->retrieve_demo_by_activatetheme( $activated_theme );
if ( $packages ) {
set_transient( 'mtdi_theme_packages', $packages, WEEK_IN_SECONDS );
}
$xmldemopackages = get_transient( 'mtdi_theme_packages' );
update_option( 'mtdi_activated_theme', $activated_theme );
}
if ( ! empty( $xmldemopackages[$activated_theme]['theme_slug'] ) ) {
if ( empty( $xmldemopackages ) || $activated_theme !== $xmldemopackages[$activated_theme]['theme_slug'] ) {
$packages = $this->retrieve_demo_by_activatetheme( $activated_theme );
if ( $packages ) {
set_transient( 'mtdi_theme_packages', $packages, WEEK_IN_SECONDS );
}
}
}
return apply_filters( 'mtdi_theme_packages_' . $activated_theme, $packages );
}
/**
* Get All demo data from selected demo name Ajax Method
*
* @since 1.0.0
*/
public function displayPopupImportForm() {
if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'mtdi_admin_import_nonce' ) ) {
esc_html_e( 'This action was stopped for security purposes.', 'mysterythemes-demo-importer' );
die();
}
$selected_demo = get_template();
$demodata = get_transient( 'mtdi_theme_packages' );
if ( empty( $demodata ) || $demodata == false ) {
$demodata = $this->retrieve_demo_by_activatetheme( $selected_demo );
}
$selected_demo = sanitize_text_field( $_POST['plugin_slug'] );
include( MTDI_ADMIN_DIR. 'partials/mtdi-import-popup.php' );
wp_die();
}
/**
* Install required plugins
*
* @since 1.0.0
*/
function install_required_plugins() {
if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'mtdi_admin_import_nonce' ) ) {
esc_html_e( 'This action was stopped for security purposes.', 'mysterythemes-demo-importer' );
die();
}
if ( empty( $_POST['plugin_slug'] ) || empty( $_POST['plugin_init'] ) ) {
wp_send_json_error(
array(
'slug' => '',
'errorCode' => 'no_plugin_specified',
'errorMessage' => __( 'No plugin specified.', 'mysterythemes-demo-importer'),
)
);
}
$plugin_slug = sanitize_key( wp_unslash( $_POST['plugin_slug'] ) );
$plugin_init = plugin_basename( sanitize_text_field( wp_unslash( $_POST['plugin_init'] ) ) );
$status = array(
'install' => 'plugin',
'slug' => sanitize_key( wp_unslash( $_POST['plugin_slug'] ) ),
);
if ( ! current_user_can( 'install_plugins' ) ) {
$status['errorMessage'] = __( 'Sorry, you are not allowed to install plugins on this site.', 'mysterythemes-demo-importer' );
wp_send_json_error( $status );
}
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
// Looks like a plugin is installed, but not active.
if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) {
$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_init );
$status['plugin'] = $plugin_init;
$status['pluginName'] = $plugin_data['Name'];
if ( current_user_can( 'activate_plugin', $plugin_init ) && is_plugin_inactive( $plugin_init ) ) {
$result = activate_plugin( $plugin_init );
if ( is_wp_error( $result ) ) {
$status['errorCode'] = $result->get_error_code();
$status['errorMessage'] = $result->get_error_message();
wp_send_json_error( $status );
}
wp_send_json_success( $status );
}
}
// Install plugin locally from zip file
if ( isset( $_POST['install'] ) && ( $_POST['install'] === "locally" ) ) {
$file_location = get_template_directory() . '/inc/plugins/' . esc_html( $plugin_slug ) . '.zip';
$file = $_POST['file'];
$plugin_directory = ABSPATH . 'wp-content/plugins/';
$zip = new ZipArchive;
if ( $zip->open( esc_html( $file_location ) ) === TRUE ) {
$zip->extractTo( $plugin_directory );
$zip->close();
if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) {
$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_init );
$status['plugin'] = $plugin_init;
$status['pluginName'] = $plugin_data['Name'];
$this->check_do_activate_plugin( $plugin_init );
}
} else {
$status['errorMessage'] = esc_html__( 'There was an error installing plugin', 'mysterythemes-demo-importer' );
wp_send_json_error( $status );
}
}
$api = plugins_api(
'plugin_information',
array(
'slug' => sanitize_key( wp_unslash( $plugin_slug ) ),
'fields' => array(
'sections' => false,
),
)
);
if ( is_wp_error( $api ) ) {
$status['errorMessage'] = $api->get_error_message();
wp_send_json_error( $status );
}
$status['pluginName'] = $api->name;
$skin = new WP_Ajax_Upgrader_Skin();
$upgrader = new Plugin_Upgrader( $skin );
$result = $upgrader->install( $api->download_link );
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
$status['debug'] = $skin->get_upgrade_messages();
}
if ( is_wp_error( $result ) ) {
$status['errorCode'] = $result->get_error_code();
$status['errorMessage'] = $result->get_error_message();
wp_send_json_error( $status );
} elseif ( is_wp_error( $skin->result ) ) {
$status['errorCode'] = $skin->result->get_error_code();
$status['errorMessage'] = $skin->result->get_error_message();
wp_send_json_error( $status );
} elseif ( $skin->get_errors()->get_error_code() ) {
$status['errorMessage'] = $skin->get_error_messages();
wp_send_json_error( $status );
} elseif ( is_null( $result ) ) {
global $wp_filesystem;
$status['errorCode'] = esc_html__( 'unable_to_connect_to_filesystem', 'mysterythemes-demo-importer' );
$status['errorMessage'] = esc_html__( 'Unable to connect to the filesystem. Please confirm your credentials.', 'mysterythemes-demo-importer' );
// Pass through the error from WP_Filesystem if one was raised.
if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
$status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() );
}
wp_send_json_error( $status );
}
$install_status = install_plugin_install_status( $api );
if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) {
$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_init );
$status['plugin'] = $plugin_init;
$status['pluginName'] = $plugin_data['Name'];
if ( current_user_can( 'activate_plugin', $plugin_init ) && is_plugin_inactive( $plugin_init ) ) {
$result = activate_plugin( $plugin_init );
if ( is_wp_error( $result ) ) {
$status['errorCode'] = $result->get_error_code();
$status['errorMessage'] = $result->get_error_message();
wp_send_json_error( $status );
}
wp_send_json_success( $status );
}
}
wp_send_json_success( $status );
}
/**
* Activate Required Plugins Ajax Method
*
* @since 1.0.0
*/
public function activate_req_plugins() {
if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'mtdi_admin_import_nonce' ) ) {
esc_html_e_( 'This action was stopped for security purposes.', 'mysterythemes-demo-importer' );
die();
}
$plugininit = ( isset( $_POST['plugin_init'] ) ) ? esc_attr( $_POST['plugin_init'] ) : '';
$result = activate_plugin( $plugininit );
if ( is_wp_error( $result ) ) {
// Process Error
wp_send_json_error(
array(
'success' => false,
'message' => $result->get_error_message(),
)
);
} else {
wp_send_json_success(
array(
'success' => true,
'message' => esc_html__( 'Plugin Successfully Activated.', 'mysterythemes-demo-importer' ),
)
);
}
}
/**
* Append popup form for demo import.
*
* @since 1.0.0
*/
public function append_popup_form() {
echo '<div id="mtdi-demo-popup-wrap" class="mtdi-popup-wrap"></div>';
}
/**
* function about import all demo content.
*
* @since 1.0.0
*/
public function import_all_demo() {
if ( wp_verify_nonce( $_POST['_wpnonce'], 'mtdi_admin_import_nonce' ) ) {
$execution_time = sanitize_text_field( $_POST['execution_time'] );
ini_set( 'memory_limit', '350M' );
if ( $execution_time != 'default' ) {
ini_set( 'max_execution_time', apply_filters( 'mtdi_demo_import_execution_time', $execution_time ) );
} else {
ini_set( 'max_execution_time', apply_filters( 'mtdi_demo_import_execution_time', 300 ) );
}
if ( empty( $_POST['plugin_slug'] ) ) {
wp_send_json_error(
array(
'slug' => '',
'errorCode' => esc_html__( 'Plugin slug is not specified', 'mysterythemes-demo-importer' ),
'errorMessage' => esc_html__( 'Plugin slug is not specified.', 'mysterythemes-demo-importer' ),
)
);
}
$slug = sanitize_key( wp_unslash( $_POST['plugin_slug'] ) );
if ( ! defined( 'WP_LOAD_IMPORTERS' ) ) {
define( 'WP_LOAD_IMPORTERS', true );
}
if ( ! current_user_can( 'import' ) ) {
$status['errorMessage'] = esc_html__( 'Sorry, you have no permission to import the demo content.', 'mysterythemes-demo-importer');
wp_send_json_error( $status );
}
$status = array(
'import' => 'demo',
'slug' => $slug,
);
$template = get_option( 'template' );
do_action( 'mtdi_ajax_before_demo_import' );
$xmldemopackages = get_transient( 'mtdi_theme_packages' );
if ( empty( $xmldemopackages ) ) {
$xmldemopackages = $this->retrieve_demo_by_activatetheme( $template );
}
if ( is_child_theme() ) {
$parent_theme = get_template();
$demo_data = $xmldemopackages[$parent_theme]['child_themes'][ $slug ];
} else {
$demo_data = $xmldemopackages[ $slug ];
}
$demoName = strtoupper( $slug );
$status['demoName'] = str_replace( '-', ' ', $demoName );
$status['previewUrl'] = get_home_url();
if ( ! empty( $demo_data ) ) {
$status['xmlmessage'] = $this->mtdi_import_dummy_xml( $slug, $demo_data, $status );
$status['coremessage'] = $this->mtdi_import_core_options( $slug, $demo_data );
$status['customizermessage'] = $this->mtdi_import_customizer_data( $slug, $demo_data, $status );
$status['widgetmessage'] = $this->mtdi_import_widget_settings( $slug, $demo_data, $status );
// Update imported demo ID.
update_option( 'mtdi_activated_check', $slug );
do_action( 'mtdi_ajax_imported', $slug, $demo_data );
$activated_demo_check = get_option( 'mtdi_activated_check' );
if ( $activated_demo_check != '' ) {
$status['message'] = __( 'success', 'mysterythemes-demo-importer' );
} else {
$status['message'] = __( 'fail', 'mysterythemes-demo-importer' );
}
}
wp_send_json_success( $status );
}
wp_die();
}
/**
* Import site core options from its ID.
* General > Reading > Your homepage displays options
*
* @since 1.0.0
*
* @param string $demo_id
* @param array $demo_data
* @return bool
*/
public function mtdi_import_core_options( $demo_id, $demo_data ) {
if ( ! empty( $demo_data ) ) {
foreach ( $demo_data as $option_key => $option_value ) {
if ( ! in_array( $option_key, array( 'name', 'theme_description','blog_description', 'show_on_front', 'blog_title', 'home_title' ) ) ) {
continue;
}
$page = get_page_by_title( $option_value );
// Format the value based on option key.
switch ( $option_key ) {
case 'show_on_front':
// Your latest posts
if ( in_array( $option_value, array( 'posts', 'page' ) ) ) {
update_option( 'show_on_front', sanitize_text_field( $option_value ) );
}
break;
case 'home_title':
// static page > Homepage (page_on_front)
if ( is_object( $page ) && $page->ID ) {
update_option( 'page_on_front', esc_attr( $page->ID ) );
}
break;
case 'blog_title':
// static page > Posts page: (page_for_posts)
if ( is_object( $page ) && $page->ID ) {
update_option( 'page_for_posts', esc_attr( $page->ID ) );
}
break;
default:
if ( $option_key == 'name' ) {
$option_key = 'blogname';
} elseif ( $option_key == 'blog_description' ) {
$option_key = 'blogdescription';
}
update_option( $option_key, wp_kses_post( $option_value ) );
break;
}
}
return true;
}
}
/**
* Import dummy content from a XML file.
*
* @since 1.0.0
*
* @param string $demo_id
* @param array $demo_data
* @param array $status
* @return bool
*/
public function mtdi_import_dummy_xml( $demo_id, $demo_data, $status ) {
$import_file_url = $demo_data['xml_file'];
// Load Importer API.
require_once ABSPATH . 'wp-admin/includes/import.php';
if ( ! class_exists( 'WP_Importer' ) ) {
$class_wp_importer = ABSPATH . 'wp-admin/includes/class-wp-importer.php';
if ( file_exists( $class_wp_importer ) ) {
require $class_wp_importer;
}
}
require MTDI_PLUGIN_DIR . 'includes/wp-importers/class-mtdi-importer.php';
// Import XML file demo content.
$folderpath = MTDI_PLUGIN_DIR.'includes/wp-importers/temp';
if ( ! file_exists( $folderpath ) ) {
mkdir( $folderpath, 0777, true );
}
$destination_path = $folderpath."/demo.xml";
$response = wp_remote_get( $import_file_url );
$response_code = wp_remote_retrieve_response_code( $response );
if ( $response_code == '200' ) {
file_put_contents( $destination_path, $response['body'] );
}
$import_file = MTDI_PLUGIN_DIR.'includes/wp-importers/temp/demo.xml';
if ( is_file( $import_file ) ) {
$wp_import = new MTDI_Demo_WPImporter();
$wp_import->fetch_attachments = true;
ob_start();
$wp_import->import( $import_file );
ob_end_clean();
flush_rewrite_rules();
} else {
$status['errorMsg'] = esc_html__( 'Missing XML file dummy content.', 'mysterythemes-demo-importer' );
wp_send_json_error( $status );
}
return true;
}
/**
* Import customizer data from a DAT file.
*
* @since 1.0.0
*
* @param string $demo_id
* @param array $demo_data
* @param array $status
* @return bool
*/
public function mtdi_import_customizer_data( $demo_id, $demo_data, $status ) {
$import_file_url = $demo_data['theme_settings'];
$folderpath = MTDI_PLUGIN_DIR.'includes/wp-importers/temp';
$destinationpath = $folderpath."/demo-customizer.dat";
$response = wp_remote_get( $import_file_url );
$response_code = wp_remote_retrieve_response_code( $response );
if ( $response_code == '200' ) {
$fh = fopen( $destinationpath, 'w' );
fclose( $fh );
file_put_contents( $destinationpath, $response['body'] );
}
$import_cfile = MTDI_PLUGIN_DIR.'includes/wp-importers/temp/demo-customizer.dat';
if ( is_file( $import_cfile ) ) {
$results = MTDI_Customizer_Importer::import( $import_cfile, $demo_id, $demo_data );
if ( is_wp_error( $results ) ) {
return false;
}
} else {
$status['errorMsg'] = esc_html__( 'The DAT file customizer data is missing.', 'mysterythemes-demo-importer' );
wp_send_json_error( $status );
}
return true;
}
/**
* Import widgets settings from WIE or JSON file.
*
* @since 1.0.0
*
* @param string $demo_id
* @param array $demo_data
* @param array $status
* @return bool
*/
public function mtdi_import_widget_settings( $demo_id, $demo_data, $status ) {
$import_file_wurl = $demo_data['widgets_file'];
$folderpath = MTDI_PLUGIN_DIR.'includes/wp-importers/temp';
$destination_path = $folderpath."/demo-widget.wie";
$response = wp_remote_get( $import_file_wurl );
$response_code = wp_remote_retrieve_response_code( $response );
if ( $response_code == '200' ) {
$fh = fopen( $destination_path, 'w' );
fclose( $fh );
file_put_contents( $destination_path, $response['body'] );
}
$import_wfile = MTDI_PLUGIN_DIR.'includes/wp-importers/temp/demo-widget.wie';
if ( is_file( $import_wfile ) ) {
$results = MTDI_Widget_Importer::mtdi_import_widget( $import_wfile, $demo_id, $demo_data );
if ( is_wp_error( $results ) ) {
return false;
}
} else {
$status['errorMsg'] = esc_html__( 'The WIE file widget content is missing.', 'mysterythemes-demo-importer' );
wp_send_json_error( $status );
}
return true;
}
/**
* Include required core importer files.
*
* @since 1.0.0
*/
public function include_files() {
include_once MTDI_PLUGIN_DIR . 'includes/wp-importers/class-widget-importer.php';
include_once MTDI_PLUGIN_DIR . 'includes/wp-importers/class-customizer-importer.php';
}
/**
* Update widget and customizer demo import settings data.
*
* @since 1.0.0
*/
public function mtdi_update_widget_data( $widget, $widget_type, $instance_id, $demo_data ) {
if ( ! empty( $demo_data['widgets_data_update'] ) ) {
foreach ( $demo_data['widgets_data_update'] as $dropdown_type => $dropdown_data ) {
if ( ! in_array( $dropdown_type, array( 'multi_checkbox', 'dropdown_categories', 'dropdown_pages', 'navigation_menus', 'mega_menus' ) ) ) {
continue;
}
// Format the value based on dropdown type.
switch ( $dropdown_type ) {
case 'multi_checkbox':
foreach ( $dropdown_data as $taxonomy => $taxonomy_data ) {
if ( ! taxonomy_exists( $taxonomy ) ) {
continue;
}
foreach ( $taxonomy_data as $widget_id => $widget_data ) {
if ( ! empty( $widget_data[ $instance_id ] ) && $widget_id == $widget_type ) {
foreach ( $widget_data[ $instance_id ] as $widget_key => $widget_value) {
$widget[$widget_key] = array();
foreach ( $widget_value as $k => $v ) {
$term = get_term_by( 'name', $v, $taxonomy );
if ( is_object( $term ) && $term->term_id ) {
$term_id = $term->term_id;
$widget[$widget_key][$term_id] = '1';
}
}
}
}
}
}
break;
case 'dropdown_categories':
foreach ( $dropdown_data as $taxonomy => $taxonomy_data ) {
if ( ! taxonomy_exists( $taxonomy ) ) {
continue;
}
foreach ( $taxonomy_data as $widget_id => $widget_data ) {
if ( ! empty( $widget_data[ $instance_id ] ) && $widget_id == $widget_type ) {
foreach ( $widget_data[ $instance_id ] as $widget_key => $widget_value ) {
$term = get_term_by( 'name', $widget_value, $taxonomy );
if ( is_object( $term ) && $term->term_id ) {
$widget[ $widget_key ] = $term->term_id;
}
}
}
}
}
break;
case 'navigation_menus':
foreach ( $dropdown_data as $widget_id => $widget_data ) {
if ( ! empty( $widget_data[ $instance_id ] ) && $widget_id == $widget_type ) {
foreach ( $widget_data[ $instance_id ] as $widget_key => $widget_value ) {
$menu = wp_get_nav_menu_object( $widget_value );
if ( is_object( $menu ) && $menu->term_id ) {
$widget[ $widget_key ] = $menu->term_id;
}
}
}
}
break;
case 'dropdown_pages':
foreach ( $dropdown_data as $widget_id => $widget_data ) {
if ( ! empty( $widget_data[ $instance_id ] ) && $widget_id == $widget_type ) {
foreach ( $widget_data[ $instance_id ] as $widget_key => $widget_value ) {
$page = get_page_by_title( $widget_value );
if ( is_object( $page ) && $page->ID ) {
$widget[ $widget_key ] = $page->ID;
}
}
}
}
break;
case 'mega_menus':
$nav_menu_items = wp_get_nav_menu_items( $dropdown_data['menu']['name'] );
$nav_menu_megamenu_items = $dropdown_data['menu']['items'];
foreach ( $nav_menu_megamenu_items as $nav_menu_megamenu_item ) {
$item_title = $nav_menu_megamenu_item["title"];
$meta_key_name = $nav_menu_megamenu_item["meta_key"];
$megamenu_widget_id = isset( $nav_menu_megamenu_item["widget_id"] ) ? $nav_menu_megamenu_item["widget_id"] : '';
foreach ( $nav_menu_items as $nav_menu_item ) {
if ( $item_title === $nav_menu_item->post_title ) {
if ( isset( $nav_menu_megamenu_item['data'] ) ) {
$megamenu_meta_value = get_post_meta( $nav_menu_item->ID, $meta_key_name, true );
if ( function_exists( 'wp_get_sidebars_widgets' ) ) {
$widgets = wp_get_sidebars_widgets(true);
$megamenu_widgets = $widgets[$megamenu_widget_id];
$menu_data = $nav_menu_megamenu_item['data'];
foreach ( $menu_data as $menu_dat_key => $menu_dat_value ) {
foreach ( $menu_dat_value as $widget_per_col_key => $widget_per_col_value ) {
foreach ( $widget_per_col_value as $widget_num_key => $widget_num_value ) {
$col_widget_count = 0;
foreach ( $widget_num_value as $widget_index_key => $widget_index_value ) {
$widget_index = $widget_index_value['index'];
$widget_id_to_set = $megamenu_widgets[$widget_index];
$megamenu_meta_value['layout'][0]['row'][$widget_per_col_key]['items'][$col_widget_count]['widget_id'] = $widget_id_to_set;
$col_widget_count++;
}
}
}
}
update_post_meta( $nav_menu_item->ID, $meta_key_name, $megamenu_meta_value );
} // check wp_get_sidebars_widgets function End
}
}
}
}
break;
}
}
}
return $widget;
}
/**
* Update customizer settings data.
*
* @since 1.0.0
*
* @param array $data
* @param array $demo_data
* @return array
*/
public function mtdi_update_customizer_data( $data, $demo_data ) {
if ( ! empty( $demo_data['customizer_data_update'] ) ) {
foreach ( $demo_data['customizer_data_update'] as $data_type => $data_value ) {
if ( ! in_array( $data_type, array( 'pages', 'categories', 'nav_menu_locations', 'multi_categories', 'mega_menus' ) ) ) {
continue;
}
switch ( $data_type ) {
case 'categories':
foreach ( $data_value as $taxonomy => $taxonomy_data ) {
if ( ! taxonomy_exists( $taxonomy ) ) {
continue;
}
foreach ( $taxonomy_data as $option_key => $option_value ) {
if ( ! empty( $data['mods'][ $option_key ] ) ) {
$term = get_term_by( 'name', $option_value, $taxonomy );
if ( is_object( $term ) && $term->term_id ) {
$data['mods'][ $option_key ] = $term->term_id;
}
}
}
}
break;
case 'multi_categories':
foreach ( $data_value as $taxonomy => $taxonomy_data ) {
if ( ! taxonomy_exists( $taxonomy ) ) {
continue;
}
foreach ( $taxonomy_data as $option_key => $option_value ) {
if ( ! empty( $data['mods'][ $option_key ] ) ) {
$term_ids = array();
foreach ( $option_value as $op_key => $op_value ) {
$term = get_term_by( 'name', $op_value, $taxonomy );
if ( is_object( $term ) && $term->term_id ) {
$term_id = $term->term_id;
$term_ids[] = $term_id;
}
}
$multi_values = ! is_array( $term_ids ) ? explode( ',', $term_ids ) : $term_ids;
$multi_s_value = array_map( 'sanitize_text_field', $multi_values );
$data['mods'][ $option_key ] = $multi_s_value;
}
}
}
break;
case 'nav_menu_locations':
$nav_menus = wp_get_nav_menus();
if ( ! empty( $nav_menus ) ) {
foreach ( $nav_menus as $nav_menu ) {
if ( is_object( $nav_menu ) ) {
foreach ( $data_value as $location => $location_name ) {
if ( $nav_menu->name == $location_name ) {
$data['mods'][ $data_type ][ $location ] = $nav_menu->term_id;
}
}
}
}
}
break;
case 'mega_menus':
$nav_menu_items = wp_get_nav_menu_items( $data_value['menu']['name'] );
$nav_menu_megamenu_items = $data_value['menu']['items'];
foreach ( $nav_menu_megamenu_items as $nav_menu_megamenu_item ) {
$item_title = $nav_menu_megamenu_item["title"];
$meta_key_name = $nav_menu_megamenu_item["meta_key"];
$item_meta_value = $nav_menu_megamenu_item["item_meta"];
foreach ( $nav_menu_items as $nav_menu_item ) {
if ( $item_title === $nav_menu_item->post_title ) {
update_post_meta( $nav_menu_item->ID, $meta_key_name, $item_meta_value );
}
}
}
break;
} // Ends switch
}
}
return $data;
}
/**
* Update custom nav menu items URL.
*
* @since 1.0.0
*/
public function update_nav_menu_items() {
$menu_locations = get_nav_menu_locations();
foreach ( $menu_locations as $location => $menu_id ) {
if ( is_nav_menu( $menu_id ) ) {
$menu_items = wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'any' ) );
if ( ! empty( $menu_items ) ) {
foreach ( $menu_items as $menu_item ) {
if ( isset( $menu_item->url ) && isset( $menu_item->db_id ) && 'custom' == $menu_item->type ) {
$site_parts = parse_url( home_url( '/' ) );
$menu_parts = parse_url( $menu_item->url );
// Update existing custom nav menu item URL.
if ( isset( $menu_parts['path'] ) && isset( $menu_parts['host'] ) && apply_filters( 'mtdi_nav_menu_item_url_hosts', in_array( $menu_parts['host'], array( 'demo.mysterythemes.com', 'localhost' ) ) ) ) {
$menu_item->url = str_replace( array( $menu_parts['scheme'], $menu_parts['host'], $menu_parts['path'] ), array( $site_parts['scheme'], $site_parts['host'], trailingslashit( $site_parts['path'] ) ), $menu_item->url );
update_post_meta( $menu_item->db_id, '_menu_item_url', esc_url_raw( $menu_item->url ) );
}
}
} //End foreach
}
} // End is_nav_menu
}
}
/**
* Set WC pages properly and disable setup wizard redirect.
*
* After importing demo data filter out duplicate WC pages and set them properly.
* Happens when the user run default woocommerce setup wizard during installation.
*
* Note: WC pages ID are stored in an option and slug are modified to remove any numbers.
*
* @since 1.0.0
*
* @param string $demo_id
*/
function mt_set_woo_pages( $demo_id ) {
global $wpdb;
$woo_pages = apply_filters(
'mt_woo_' . $demo_id . '_pages',
array(
'shop' => array(
'name' => 'shop',
'title' => __( 'Shop', 'mysterythemes-demo-importer' ),
),
'cart' => array(
'name' => 'cart',
'title' => __( 'Cart', 'mysterythemes-demo-importer' ),
),
'checkout' => array(
'name' => 'checkout',
'title' => __( 'Checkout', 'mysterythemes-demo-importer' ),
),
'myaccount' => array(
'name' => 'my-account',
'title' => __( 'My Account', 'mysterythemes-demo-importer' ),
),
)
);
// Set WooCommerce pages properly.
foreach ( $woo_pages as $key => $wc_page ) {
// Get the ID of every page with matching name or title.
$page_ids = $wpdb->get_results( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE (post_name = %s OR post_title = %s) AND post_type = 'page' AND post_status = 'publish'", $wc_page['name'], $wc_page['title'] ) );
if ( ! is_null( $page_ids ) ) {
$page_id = 0;
$delete_ids = array();
// Retrieve page with greater id and delete others.
if ( sizeof( $page_ids ) > 1 ) {
foreach ( $page_ids as $page ) {
if ( $page->ID > $page_id ) {
if ( $page_id ) {
$delete_ids[] = $page_id;
}
$page_id = $page->ID;
} else {
$delete_ids[] = $page->ID;
}
}
} else {
$page_id = $page_ids[0]->ID;
}
// Delete posts.
foreach ( $delete_ids as $delete_id ) {
wp_delete_post( $delete_id, true );
}
// Update WC page.
if ( $page_id > 0 ) {
update_option( 'woocommerce_' . $key . '_page_id', $page_id );
wp_update_post(
array(
'ID' => $page_id,
'post_name' => sanitize_title( $wc_page['name'] ),
)
);
}
}
}
// We no longer need WC setup wizard redirect.
delete_transient( '_wc_activation_redirect' );
}
/**
* Update elementor settings data.
*
* @since 1.0.0
*
* @param string $demo_id Demo ID.
* @param array $demo_data Demo Data.
*/
public function update_elementor_data( $demo_id, $demo_data ) {
if ( ! empty( $demo_data['elementor_data_update'] ) ) {
foreach ( $demo_data['elementor_data_update'] as $data_type => $data_value ) {
if ( ! empty( $data_value['post_title'] ) ) {
$page = get_page_by_title( $data_value['post_title'] );
if ( is_object( $page ) && $page->ID ) {
$elementor_data = get_post_meta( $page->ID, '_elementor_data', true );
if ( ! empty( $elementor_data ) ) {
$elementor_data = $this->elementor_recursive_update( $elementor_data, $data_type, $data_value );
}
// Update elementor data.
update_post_meta( $page->ID, '_elementor_data', $elementor_data );
}
}
}
}
}
/**
* Delete the `Hello world!` post after successful demo import
*
* @since 1.0.0
*/
function delete_post_import() {
$page = get_page_by_title( 'Hello world!', OBJECT, 'post' );
if ( is_object( $page ) && $page->ID ) {
wp_delete_post( $page->ID, true );
}
}
/**
* Update siteorigin panel settings data.
*
* @since 1.0.0
*
* @param string $demo_id Demo ID.
* @param array $demo_data Demo Data.
*/
public function update_siteorigin_data( $demo_id, $demo_data ) {
if ( ! empty( $demo_data['siteorigin_panels_data_update'] ) ) {
foreach ( $demo_data['siteorigin_panels_data_update'] as $data_type => $data_value ) {
if ( ! empty( $data_value['post_title'] ) ) {
$page = get_page_by_title( $data_value['post_title'] );
if ( is_object( $page ) && $page->ID ) {
$panels_data = get_post_meta( $page->ID, 'panels_data', true );
if ( ! empty( $panels_data ) ) {
$panels_data = $this->siteorigin_recursive_update( $panels_data, $data_type, $data_value );
}
// Update siteorigin panels data.
update_post_meta( $page->ID, 'panels_data', $panels_data );
}
}
}
}
}
/**
* Recursive function to address n level deep layout builder data update.
*
* @since 1.0.0
*
* @param array $panels_data
* @param string $data_type
* @param array $data_value
* @return array
*/
public function siteorigin_recursive_update( $panels_data, $data_type, $data_value ) {
static $instance = 0;
foreach ( $panels_data as $panel_type => $panel_data ) {
// Format the value based on panel type.
switch ( $panel_type ) {
case 'grids':
foreach ( $panel_data as $instance_id => $grid_instance ) {
if ( ! empty( $data_value['data_update']['grids_data'] ) ) {
foreach ( $data_value['data_update']['grids_data'] as $grid_id => $grid_data ) {
if ( ! empty( $grid_data['style'] ) && $instance_id === $grid_id ) {
$level = isset( $grid_data['level'] ) ? $grid_data['level'] : (int) 0;
if ( $level == $instance ) {
foreach ( $grid_data['style'] as $style_key => $style_value ) {
if ( empty( $style_value ) ) {
continue;
}
// Format the value based on style key.
switch ( $style_key ) {
case 'background_image_attachment':
$attachment_id = $this->get_attachment_id( $style_value );
if ( 0 !== $attachment_id ) {
$grid_instance['style'][ $style_key ] = $attachment_id;
}
break;
default:
$grid_instance['style'][ $style_key ] = $style_value;
break;
}
}
}
}
}
}
// Update panel grids data.
$panels_data['grids'][ $instance_id ] = $grid_instance;
}
break;
case 'widgets':
foreach ( $panel_data as $instance_id => $widget_instance ) {
if ( isset( $widget_instance['panels_data']['widgets'] ) ) {
$instance = $instance + 1;
$child_panels_data = $widget_instance['panels_data'];
$panels_data['widgets'][ $instance_id ]['panels_data'] = $this->siteorigin_recursive_update( $child_panels_data, $data_type, $data_value );
$instance = $instance - 1;
continue;
}
if ( isset( $widget_instance['nav_menu'] ) && isset( $widget_instance['title'] ) ) {
$nav_menu = wp_get_nav_menu_object( $widget_instance['title'] );
if ( is_object( $nav_menu ) && $nav_menu->term_id ) {
$widget_instance['nav_menu'] = $nav_menu->term_id;
}
} elseif ( ! empty( $data_value['data_update']['widgets_data'] ) ) {
$instance_class = $widget_instance['panels_info']['class'];
foreach ( $data_value['data_update']['widgets_data'] as $dropdown_type => $dropdown_data ) {
if ( ! in_array( $dropdown_type, array( 'dropdown_pages', 'dropdown_categories' ) ) ) {
continue;
}
// Format the value based on data type.
switch ( $dropdown_type ) {
case 'dropdown_pages':
foreach ( $dropdown_data as $widget_id => $widget_data ) {
if ( ! empty( $widget_data[ $instance_id ] ) && $widget_id == $instance_class ) {
$level = isset( $widget_data['level'] ) ? $widget_data['level'] : (int) 0;
if ( $level == $instance ) {
foreach ( $widget_data[ $instance_id ] as $widget_key => $widget_value ) {
$page = get_page_by_title( $widget_value );
if ( is_object( $page ) && $page->ID ) {
$widget_instance[ $widget_key ] = $page->ID;
}
}
}
}
}
break;
case 'dropdown_categories':
foreach ( $dropdown_data as $taxonomy => $taxonomy_data ) {
if ( ! taxonomy_exists( $taxonomy ) ) {
continue;
}
foreach ( $taxonomy_data as $widget_id => $widget_data ) {
if ( ! empty( $widget_data[ $instance_id ] ) && $widget_id == $instance_class ) {
$level = isset( $widget_data['level'] ) ? $widget_data['level'] : (int) 0;
if ( $level == $instance ) {
foreach ( $widget_data[ $instance_id ] as $widget_key => $widget_value ) {
$term = get_term_by( 'name', $widget_value, $taxonomy );
if ( is_object( $term ) && $term->term_id ) {
$widget_instance[ $widget_key ] = $term->term_id;
}
}
}
}
}
}
break;
}
}
}
$panels_data['widgets'][ $instance_id ] = $widget_instance;
}
break;
}
}
return $panels_data;
}
/**
* Get an attachment ID from the filename.
*
* @since 1.0.0
*
* @param string $filename
* @return int Attachment ID on success, 0 on failure
*/
function get_attachment_id( $filename ) {
$attachment_id = 0;
$file = basename( $filename );
$query_args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'fields' => 'ids',
'meta_query' => array(
array(
'value' => $file,
'compare' => 'LIKE',
'key' => '_wp_attachment_metadata',
),
),
);
$query = new WP_Query( $query_args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post_id ) {
$meta = wp_get_attachment_metadata( $post_id );
$original_file = basename( $meta['file'] );
$cropped_image_files = wp_list_pluck( $meta['sizes'], 'file' );
if ( $original_file === $file || in_array( $file, $cropped_image_files ) ) {
$attachment_id = $post_id;
break;
}
}
}
return $attachment_id;
}
/**
* Recursive function to address n level deep elementor data update.
*
* @since 1.0.0
*
* @param array $elementor_data
* @param string $data_type
* @param array $data_value
* @return array
*/
public function elementor_recursive_update( $elementor_data, $data_type, $data_value ) {
$elementor_data = json_decode( stripslashes( $elementor_data ), true );
// Recursively update elementor data.
foreach ( $elementor_data as $element_id => $element_data ) {
if ( ! empty( $element_data['elements'] ) ) {
foreach ( $element_data['elements'] as $el_key => $el_data ) {
if ( ! empty( $el_data['elements'] ) ) {
foreach ( $el_data['elements'] as $el_child_key => $child_el_data ) {
if ( 'widget' === $child_el_data['elType'] ) {
$settings = isset( $child_el_data['settings'] ) ? $child_el_data['settings'] : array();
$widgetType = isset( $child_el_data['widgetType'] ) ? $child_el_data['widgetType'] : '';
if ( isset( $settings['display_type'] ) && 'categories' === $settings['display_type'] ) {
$categories_selected = isset( $settings['categories_selected'] ) ? $settings['categories_selected'] : '';
if ( ! empty( $data_value['data_update'] ) ) {
foreach ( $data_value['data_update'] as $taxonomy => $taxonomy_data ) {
if ( ! taxonomy_exists( $taxonomy ) ) {
continue;
}
foreach ( $taxonomy_data as $widget_id => $widget_data ) {
if ( ! empty( $widget_data ) && $widget_id == $widgetType ) {
if ( is_array( $categories_selected ) ) {
foreach ( $categories_selected as $cat_key => $cat_id ) {
if ( isset( $widget_data[ $cat_id ] ) ) {
$term = get_term_by( 'name', $widget_data[ $cat_id ], $taxonomy );
if ( is_object( $term ) && $term->term_id ) {
$categories_selected[ $cat_key ] = $term->term_id;
}
}
}
} elseif ( isset( $widget_data[ $categories_selected ] ) ) {
$term = get_term_by( 'name', $widget_data[ $categories_selected ], $taxonomy );
if ( is_object( $term ) && $term->term_id ) {
$categories_selected = $term->term_id;
}
}
}
}
}
}
// Update the elementor data.
$elementor_data[ $element_id ]['elements'][ $el_key ]['elements'][ $el_child_key ]['settings']['categories_selected'] = $categories_selected;
}
}
}
}
}
}
}
return wp_json_encode( $elementor_data );
}
/**
* Reset existing active widgets.
*
* @since 1.0.0
*/
function mt_reset_widgets() {
$sidebars_widgets = wp_get_sidebars_widgets();
// Reset active widgets.
foreach ( $sidebars_widgets as $key => $widgets ) {
$sidebars_widgets[ $key ] = array();
}
wp_set_sidebars_widgets( $sidebars_widgets );
}
/**
* Delete existing navigation menus.
*
* @since 1.0.0
*/
function mt_delete_nav_menus() {
$nav_menus = wp_get_nav_menus();
// Delete navigation menus.
if ( ! empty( $nav_menus ) ) {
foreach ( $nav_menus as $nav_menu ) {
wp_delete_nav_menu( $nav_menu->slug );
}
}
}
/**
* Remove theme modifications option.
*
* @since 1.0.0
*/
function mt_remove_theme_mods() {
remove_theme_mods();
}
/**
* Display action links in the Plugins list table.
*
* @since 1.0.0
*
* @param array $actions Plugin Action links.
* @return array
*/
function plugin_action_links( $actions ) {
$new_actions = array(
'importer' => '<a href="' . admin_url( 'themes.php?page=mysterythemes-demo-importer' ) . '" aria-label="' . esc_attr( __( 'View Demo Importer', 'mysterythemes-demo-importer') ) . '">' . __( 'MT Demo Importer', 'mysterythemes-demo-importer') . '</a>',
);
return array_merge( $new_actions, $actions );
}
/**
* Display row meta in the Plugins list table.
*
* @since 1.0.0
*
* @param array $plugin_meta Plugin Row Meta.
* @param string $plugin_file Plugin Row Meta.
* @return array
*/
function plugin_row_meta( $plugin_meta, $plugin_file ) {
if ( MTDI_PLUGIN_BASENAME === $plugin_file ) {
$new_plugin_meta = array(
'docs' => '<a href="' . esc_url( apply_filters( 'mtdi_demo_importer_docs_url', '//mysterythemes.com/docs/mysterythemes-demo-importer/' ) ) . '" title="' . esc_attr( __( 'View Demo Importer Documentation', 'mysterythemes-demo-importer' ) ) . '" target="_blank">' . __( 'Documentation', 'mysterythemes-demo-importer' ) . '</a>',
'support' => '<a href="' . esc_url( apply_filters( 'mtdi_demo_importer_support_url', '//wordpress.org/support/plugin/mysterythemes-demo-importer' ) ) . '" title="' . esc_attr( __( 'Visit Free Support Forum', 'mysterythemes-demo-importer' ) ) . '" target="_blank">' . __( 'Free Support', 'mysterythemes-demo-importer' ) . '</a>',
);
return array_merge( $plugin_meta, $new_plugin_meta );
}
return (array) $plugin_meta;
}
/**
* Theme support fallback notice.
*
* @since 1.0.0
*/
public function missing_notice() {
$admin_obj = new MTDI();
$themes_url = array_intersect( array_keys( wp_get_themes() ), $admin_obj->get_supported_themes() ) ? admin_url( 'themes.php?search=mysterythemes' ) : admin_url( 'theme-install.php?search=mysterythemes' );
/* translators: %s: official Mystery themes URL */
echo '<div class="error notice is-dismissible"><p><strong>' . esc_html__( 'Mystery Themes Demo Importer', 'mysterythemes-demo-importer') . '</strong> &#8211; ' . sprintf( esc_html__( 'This plugin requires %s to be activated to work.', 'mysterythemes-demo-importer'), '<a href="' . esc_url( $themes_url ) . '">' . esc_html__( 'Official Mystery Themes', 'mysterythemes-demo-importer') . '</a>' ) . '</p></div>';
}
}
endif;