admin_url( 'admin-ajax.php' ), 'ajax_nonce' => $admin_ajax_nonce ); wp_localize_script( 'aptu-admin-js', 'aptu_backend_js_params', $admin_ajax_object ); wp_enqueue_style( 'aptu-admin-css', APTU_CSS_DIR . 'backend.css', '', APTU_VERSION ); } } function aptu_import_form_action(){ include('inc/aptu-upload.php'); } function print_array( $array ){ echo "
";
            print_r( $array );
            echo "
"; } function get_theme_list(){ $demo_list_file_url = APTU_DEMO_URL . '/themes-list.json'; $connection = wp_remote_get( $demo_list_file_url ); if ( is_array( $connection ) && ! is_wp_error( $connection ) ) { $body = $connection[ 'body' ]; $themes_list = json_decode( $body ); return $themes_list; } else { return array(); } } function aptu_my_action_callback( $wp_customize ){ if ( isset( $_POST[ '_wpnonce' ] ) && wp_verify_nonce( $_POST[ '_wpnonce' ], 'aptu-admin-ajax-nonce' ) ) { $theme_slug = sanitize_text_field( $_POST[ 'theme_slug' ] ); $theme_option_name = sanitize_text_field( $_POST[ 'option_name' ] ); $file = APTU_DEMO_URL . '/' . $theme_slug . '/demo-data.xml'; $newfile = APTU_PATH . '/inc/upload/demo-data.xml'; if ( copy( $file, $newfile ) ) { global $wpdb; if ( ! defined( 'WP_LOAD_IMPORTERS' ) ) define( 'WP_LOAD_IMPORTERS', true ); // Load Importer API require_once ABSPATH . 'wp-admin/includes/import.php'; $importer_error = false; if ( ! class_exists( 'APTU_Importer' ) ) { $class_wp_importer = ABSPATH . 'wp-admin/includes/class-wp-importer.php'; if ( file_exists( $class_wp_importer ) ) { require_once $class_wp_importer; } else { $importer_error = true; } } if ( ! class_exists( 'APTU_Demo_Import' ) ) { $class_wp_importer = APTU_PATH . "inc/importer/wordpress-importer.php"; if ( file_exists( $class_wp_importer ) ) { require_once $class_wp_importer; } else { $importer_error = true; } } if ( $importer_error ) { die( _e( "Import error! Please uninstall Wordpress importer plugin and try again", APTU_TD ) ); } else { $import_filepath = APTU_PATH . 'inc/upload/demo-data.xml'; // Get the xml file from directory require APTU_PATH . 'inc/importer/aptu-import.php'; $aptu_demo_import = new aptu_theme_import(); $aptu_demo_import -> fetch_attachments = true; $aptu_demo_import -> import( $import_filepath ); $aptu_demo_import -> aptu_set_theme_setting( $theme_option_name, $theme_slug ); $aptu_demo_import -> aptu_set_menu(); self::aptu_import_widget_detail( $theme_slug ); if ( self::aptu_have_import_results() ) { self::aptu_show_import_results(); return; // don't show content below } self::aptu_import_customize( $wp_customize, $theme_slug ); } die(); // this is required to return a proper result } else { die( _e( "Import error! XML data is missing.", APTU_TD ) ); } } else { die( _e( 'No script kiddies please!', APTU_TD ) ); } } /* * Import widget functionality * * * Code is mostly from the Widget Importer & Exporter plugin. * * @see https://wordpress.org/plugins/widget-importer-exporter/ */ function aptu_import_widget_detail( $theme_slug ){ global $aptu_widget_import_results; // Get file contents and decode $widget_file_url = APTU_DEMO_URL . '/' . $theme_slug . '/widget-data.wie'; $connection = wp_remote_get( $widget_file_url ); if ( is_array( $connection ) && ! is_wp_error( $connection ) ) { $body = $connection[ 'body' ]; $data = json_decode( $body ); // Import the widget data // Make results available for display on import/export page $aptu_import_results = self::aptu_import_data( $data ); } } /** * Import widget JSON data * * @since 0.4 * @global array $wp_registered_sidebars * @param object $data JSON widget data from .wie file * @return array Results array */ function aptu_import_data( $data ){ global $wp_registered_sidebars; // Have valid data? // If no data or could not decode if ( empty( $data ) || ! is_object( $data ) ) { wp_die( _e( 'Widget data is not avilable', APTU_TD ), '', array( 'back_link' => true ) ); } // Hook before import do_action( 'wie_before_import' ); $data = apply_filters( 'aptu_import_data', $data ); // Get all available widgets site supports $available_widgets = self::aptu_available_widgets(); // 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; } } // Hook after import do_action( 'wie_after_import' ); // Return results return apply_filters( 'aptu_import_results', $results ); } function aptu_available_widgets(){ 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' ]; } } return apply_filters( 'aptu_available_widgets', $available_widgets ); } /** * Have import results to show? * * @since 0.3 * @global string $wie_import_results * @return bool True if have import results to show */ function aptu_have_import_results(){ global $aptu_import_results; if ( ! empty( $aptu_import_results ) ) { return true; } return false; } /** * Show import results * * This is shown in place of import/export page's regular content. * * @since 0.3 * @global string $wie_import_results */ function aptu_show_import_results(){ global $aptu_import_results; ?>

$option_value ) { $option = new APTU_Option( $wp_customize, $option_key, array( 'default' => '', 'type' => 'option', 'capability' => 'edit_theme_options' ) ); $option -> aptu_import( $option_value ); } } // Call the customize_save action. do_action( 'customize_save', $wp_customize ); // Loop through the mods. foreach ( $data[ 'mods' ] as $key => $val ) { // Call the customize_save_ dynamic action. do_action( 'customize_save_' . $key, $wp_customize ); // Save the mod. set_theme_mod( $key, $val ); } } } /** * Imports images for settings saved as mods. * */ static private function aptu_import_images( $mods ){ $attachment_id = $mods[ 'header_image_data' ] -> attachment_id; foreach ( $mods as $key => $val ) { if ( self::aptu_is_image_url( $val ) ) { $id = $attachment_id; $meta = wp_get_attachment_metadata( $id ); $data -> attachment_id = $id; $data -> url = wp_get_attachment_url( $id ); $data -> thumbnail_url = wp_get_attachment_thumb_url( $id ); $data -> height = $meta[ 'height' ]; $data -> width = $meta[ 'width' ]; if ( ! is_wp_error( $data ) ) { $mods[ $key ] = $data -> url; // Handle header image controls. if ( isset( $mods[ $key . '_data' ] ) ) { $mods[ $key . '_data' ] = $data; update_post_meta( $data -> attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() ); } } } } return $mods; } /** * Checks to see whether a string is an image url or not. * */ static private function aptu_is_image_url( $string = '' ){ if ( is_string( $string ) ) { if ( preg_match( '/\.(jpg|jpeg|png|gif)/i', $string ) ) { return true; } } return false; } /* * Export Theme Option Settings */ function aptu_export_setting(){ if ( ! empty( $_POST ) && wp_verify_nonce( $_POST[ 'aptu-nonce-setup' ], 'aptu-nonce' ) ) { if ( isset( $_POST[ 'file_export_submit' ] ) ) { $theme_option_name = sanitize_text_field( $_POST[ 'aptu_export_theme_name' ] ); if ( $theme_option_name != '' ) { $settings = get_option( $theme_option_name ); if ( $settings !== false ) { $data = json_encode( $settings ); header( 'Content-Disposition: attachment; filename=theme-option-data.json' ); header( 'Content-Type: application/json' ); echo $data; } else { echo _e( 'Please choose current activated theme', APTU_TD ); } } else { wp_redirect( admin_url( 'admin.php?page=aptu-demo-exporter' ) ); exit; } } else { die( _e( 'No script kiddies please!', APTU_TD ) ); } } } } $aptu_obj = new APTU_Class(); }