array( 'title' => __('ScrollMe Demo', APTU_TD), 'name' => 'scrollme-demo', 'screenshot' => APTU_IMPORT_DIR.'demo/scrollme-demo/screen.png', 'home_page' => 'front-page', 'menus' => array( 'Main Menu' => 'primary' ) ), ); /** Assigning Demos **/ $this->demos = empty( $demos ) ? $default_demo_lists : $demos; /** Assigning demo folder path **/ $this->demo_dir = ( $demo_dir == '' ) ? APTU_PATH.'importer/demo/' : $demo_dir; $this->options_replace_url = ''; // Assign url that needs to replaced in the theme options value $this->option_name = ''; // Assign name for the option (useful for the theme based on theme options) /** Loads plugin text domain for internationalization **/ add_action('init', array($this, 'load_text_domain')); /** Hook Demo Importer Section to accesspress_demo_importer hook **/ add_action('aptu_demo_importer', array($this, 'demo_importer') ); /** Demo Import Ajax Call **/ add_action( 'wp_ajax_demo_import_action', array( $this, 'demo_import_callback' ) ); /** Enqueue Styles & Scripts **/ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles_and_scripts' ) ); } /** Enqueue Necessary Plugin Scripts and Styles **/ public function enqueue_styles_and_scripts() { /** Admin Styles **/ wp_enqueue_style( 'IDM-admin', APTU_CSS_DIR . 'admin.css', APTU_VERSION ); /** Admin Scripts **/ wp_enqueue_script( 'IDM-admin', APTU_JS_DIR . 'admin.js', array( 'jquery' ), APTU_VERSION ); /** Localizing the text to be used in Scripts **/ wp_localize_script( 'IDM-admin', 'IDMObject', array( 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ), 'demo_installing' => __('Installing Demo', APTU_TD), 'demo_installed' => __('Demo Installed', APTU_TD), 'demo_import_success' => __('Demo has been successfully installed', APTU_TD), 'demo_confirm' => __('Are you sure to import demo content ?', APTU_TD), ) ); } /** Add Demo Importer Section to `APTU_Class` hook **/ public function demo_importer() { $demos = $this->demos; ?>
demo_dir; $path = $demo_dir_path.$folder; /** Site Content Import **/ $this->fetch_attachments = true; $this->import($path.'/content.xml'); /** Set Theme Options **/ $this->set_theme_options($path.'/theme_options.dat'); /** Set Customizer Options **/ $this->set_customizer_options($path.'/customizer_options.dat'); /** Set Widgets **/ $this->save_widgets($path.'/widgets.wie'); /** Set Featured Home Page **/ if($homepage) { $this->set_home_page($homepage); } /** Configure Menus **/ if( $mmenu != '' ) { $this->set_menus($mmenu); } die(); } /** Function to Set the theme option (Demo Import) **/ public function set_theme_options($filepath) { if(file_exists($filepath)) { $opt_unserialized = file_get_contents($filepath, true); $data = preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) { return 's:' . strlen($m[2]) . ':"' . $m[2] . '";'; }, $opt_unserialized); $unserialized_data = unserialize($data); $options = $this->recursive_array_replace(esc_html($this->options_replace_url), get_site_url(), $unserialized_data); update_option( $this->option_name, $options ); } } /** Function to Set the theme Customizer Options (Demo Import) **/ public function set_customizer_options($filepath) { if(file_exists($filepath)) { $opt_unserialized = file_get_contents($filepath, true); $options = unserialize($opt_unserialized); // Loop through the mods. foreach ( $options['mods'] as $key => $val ) { // Save the mod. set_theme_mod( $key, $val ); } } } /** Function to Save the widgets **/ public function save_widgets($filepath) { if(file_exists($filepath)) { global $wp_registered_sidebars; $widget_file = file_get_contents($filepath, true); $data = json_decode($widget_file); // Have valid data? // If no data or could not decode if ( empty( $data ) || ! is_object( $data ) ) { wp_die( _e( 'Widget data is not available', APTU_TD ), '', array( 'back_link' => true ) ); } global $wp_registered_widget_controls; $widget_controls = $wp_registered_widget_controls; $available_widgets = array(); foreach ( $widget_controls as $widget ) { if ( ! empty( $widget[ 'id_base' ] ) && ! isset( $available_widgets[ $widget[ 'id_base' ] ] ) ) { // no dupes $available_widgets[ $widget[ 'id_base' ] ][ 'id_base' ] = $widget[ 'id_base' ]; $available_widgets[ $widget[ 'id_base' ] ][ 'name' ] = $widget[ 'name' ]; } } // Get all existing widget instances $widget_instances = array(); foreach ( $available_widgets as $widget_data ) { $widget_instances[ $widget_data[ 'id_base' ] ] = get_option( 'widget_' . $widget_data[ 'id_base' ] ); } // Begin results $results = array(); // Loop import data's sidebars foreach ( $data as $sidebar_id => $widgets ) { // Skip inactive widgets // (should not be in export file) if ( 'wp_inactive_widgets' == $sidebar_id ) { continue; } // Check if sidebar is available on this site // Otherwise add widgets to inactive, and say so if ( isset( $wp_registered_sidebars[ $sidebar_id ] ) ) { $sidebar_available = true; $use_sidebar_id = $sidebar_id; $sidebar_message_type = 'success'; $sidebar_message = ''; } else { $sidebar_available = false; $use_sidebar_id = 'wp_inactive_widgets'; // add to inactive if sidebar does not exist in theme $sidebar_message_type = 'error'; $sidebar_message = _e( 'Widget area does not exist in theme (using Inactive)', APTU_TD ); } // Result for sidebar $results[ $sidebar_id ][ 'name' ] = ! empty( $wp_registered_sidebars[ $sidebar_id ][ 'name' ] ) ? $wp_registered_sidebars[ $sidebar_id ][ 'name' ] : $sidebar_id; // sidebar name if theme supports it; otherwise ID $results[ $sidebar_id ][ 'message_type' ] = $sidebar_message_type; $results[ $sidebar_id ][ 'message' ] = $sidebar_message; $results[ $sidebar_id ][ 'widgets' ] = array(); // Loop widgets foreach ( $widgets as $widget_instance_id => $widget ) { $fail = false; // Get id_base (remove -# from end) and instance ID number $id_base = preg_replace( '/-[0-9]+$/', '', $widget_instance_id ); $instance_id_number = str_replace( $id_base . '-', '', $widget_instance_id ); // Does site support this widget? if ( ! $fail && ! isset( $available_widgets[ $id_base ] ) ) { $fail = true; $widget_message_type = 'error'; $widget_message = _e( 'Site does not support widget', APTU_TD ); // explain why widget not imported } // Filter to modify settings object before conversion to array and import // Leave this filter here for backwards compatibility with manipulating objects (before conversion to array below) // Ideally the newer wie_widget_settings_array below will be used instead of this $widget = apply_filters( 'wie_widget_settings', $widget ); // object // Convert multidimensional objects to multidimensional arrays // Some plugins like Jetpack Widget Visibility store settings as multidimensional arrays // Without this, they are imported as objects and cause fatal error on Widgets page // If this creates problems for plugins that do actually intend settings in objects then may need to consider other approach: https://wordpress.org/support/topic/problem-with-array-of-arrays // It is probably much more likely that arrays are used than objects, however $widget = json_decode( wp_json_encode( $widget ), true ); // Filter to modify settings array // This is preferred over the older wie_widget_settings filter above // Do before identical check because changes may make it identical to end result (such as URL replacements) $widget = apply_filters( 'wie_widget_settings_array', $widget ); // Does widget with identical settings already exist in same sidebar? if ( ! $fail && isset( $widget_instances[ $id_base ] ) ) { // Get existing widgets in this sidebar $sidebars_widgets = get_option( 'sidebars_widgets' ); $sidebar_widgets = isset( $sidebars_widgets[ $use_sidebar_id ] ) ? $sidebars_widgets[ $use_sidebar_id ] : array(); // check Inactive if that's where will go // Loop widgets with ID base $single_widget_instances = ! empty( $widget_instances[ $id_base ] ) ? $widget_instances[ $id_base ] : array(); foreach ( $single_widget_instances as $check_id => $check_widget ) { // Is widget in same sidebar and has identical settings? if ( in_array( "$id_base-$check_id", $sidebar_widgets ) && ( array ) $widget == $check_widget ) { $fail = true; $widget_message_type = 'warning'; // $widget_message = _e( 'Widget already exists', APTU_TD ); // explain why widget not imported break; } } } // No failure if ( ! $fail ) { // Add widget instance $single_widget_instances = get_option( 'widget_' . $id_base ); // all instances for that widget ID base, get fresh every time $single_widget_instances = ! empty( $single_widget_instances ) ? $single_widget_instances : array( '_multiwidget' => 1 ); // start fresh if have to $single_widget_instances[] = $widget; // add it // Get the key it was given end( $single_widget_instances ); $new_instance_id_number = key( $single_widget_instances ); // If key is 0, make it 1 // When 0, an issue can occur where adding a widget causes data from other widget to load, and the widget doesn't stick (reload wipes it) if ( '0' === strval( $new_instance_id_number ) ) { $new_instance_id_number = 1; $single_widget_instances[ $new_instance_id_number ] = $single_widget_instances[ 0 ]; unset( $single_widget_instances[ 0 ] ); } // Move _multiwidget to end of array for uniformity if ( isset( $single_widget_instances[ '_multiwidget' ] ) ) { $multiwidget = $single_widget_instances[ '_multiwidget' ]; unset( $single_widget_instances[ '_multiwidget' ] ); $single_widget_instances[ '_multiwidget' ] = $multiwidget; } // Update option with new widget update_option( 'widget_' . $id_base, $single_widget_instances ); // Assign widget instance to sidebar $sidebars_widgets = get_option( 'sidebars_widgets' ); // which sidebars have which widgets, get fresh every time // Avoid rarely fatal error when the option is an empty string // https://github.com/churchthemes/widget-importer-exporter/pull/11 if ( ! $sidebars_widgets ) { $sidebars_widgets = array(); } $new_instance_id = $id_base . '-' . $new_instance_id_number; // use ID number from new widget instance $sidebars_widgets[ $use_sidebar_id ][] = $new_instance_id; // add new instance to sidebar update_option( 'sidebars_widgets', $sidebars_widgets ); // save the amended data // After widget import action $after_widget_import = array( 'sidebar' => $use_sidebar_id, 'sidebar_old' => $sidebar_id, 'widget' => $widget, 'widget_type' => $id_base, 'widget_id' => $new_instance_id, 'widget_id_old' => $widget_instance_id, 'widget_id_num' => $new_instance_id_number, 'widget_id_num_old' => $instance_id_number ); do_action( 'wie_after_widget_import', $after_widget_import ); // Success message if ( $sidebar_available ) { $widget_message_type = 'success'; $widget_message = esc_html__( 'Imported', APTU_TD ); } else { $widget_message_type = 'warning'; $widget_message = esc_html__( 'Imported to Inactive', APTU_TD ); } } // Result for widget instance $results[ $sidebar_id ][ 'widgets' ][ $widget_instance_id ][ 'name' ] = isset( $available_widgets[ $id_base ][ 'name' ] ) ? $available_widgets[ $id_base ][ 'name' ] : $id_base; // widget name or ID if name not available (not supported by site) $results[ $sidebar_id ][ 'widgets' ][ $widget_instance_id ][ 'title' ] = ! empty( $widget[ 'title' ] ) ? $widget[ 'title' ] : esc_html__( 'No Title', APTU_TD ); // show "No Title" if widget instance is untitled $results[ $sidebar_id ][ 'widgets' ][ $widget_instance_id ][ 'message_type' ] = $widget_message_type; $results[ $sidebar_id ][ 'widgets' ][ $widget_instance_id ][ 'message' ] = $widget_message; } } } } /** Function to Set the featured Home Page **/ public function set_home_page($homepage) { $fpage = get_page_by_path( $homepage ); // Set Frontpage to display Page update_option( 'show_on_front', 'page' ); // Set front page to display specific page update_option( 'page_on_front', $fpage->ID); } /** Function to set the Menus **/ public function set_menus($menu) { if( $menu != '' ) { global $wpdb; $table_db_name = $wpdb->prefix . "terms"; $menu_ids = array(); $save_menu = array(); $menu = rtrim($menu, '|'); $menu_arr = explode('|', $menu); foreach($menu_arr as $menu_single_ar) { $mens = explode('>', $menu_single_ar); $rows = $wpdb->get_results("SELECT * FROM $table_db_name where name='".$mens[0]."'",ARRAY_A); foreach($rows as $row) { $menu_ids[$row["name"]] = $row["term_id"] ; } if ( has_nav_menu( $mens[0] ) ) { continue; } else { $save_menu[$mens[1]] = $menu_ids[$mens[0]]; } $save_menu[$mens[1]] = $menu_ids[$mens[0]]; } set_theme_mod('nav_menu_locations', $save_menu); } } /** Function to change modify the url within the options **/ public function recursive_array_replace($find, $replace, $array){ $newArray = array(); foreach ($array as $key => $value) { if (!is_array($value)) { $newArray[$key] = str_replace($find, $replace, $value); } else { $newArray[$key] = $this->recursive_array_replace($find, $replace, $value); } } return $newArray; } /** * Loads Plugin Text Domain * */ function load_text_domain() { load_plugin_textdomain('ap-theme-utility-plugin', false, basename(dirname(__FILE__)) . '/languages'); } } endif;