/** * Import */ public function import($import_data = NULL, $is_preset = FALSE, $clear_page = FALSE) { if (NULL == $import_data) { return; } global $wp_registered_sidebars, $sidebars_widgets; // Get all available widgets site supports $available_widgets = $this->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(); if (empty($import_data['widget_data'])) { return; } foreach ($import_data['widget_data'] as $sidebar_id => $sidebar_data) { $layers_sidebar_key = 'obox-layers-builder-'; if (FALSE !== $clear_page && isset($import_data['post_id'])) { $this->clear_page_sidebars_widget($layers_sidebar_key . $import_data['post_id']); } // If this is a builder page, set the ID to the current page we are importing INTO if (FALSE !== strpos($sidebar_id, $layers_sidebar_key)) { $sidebar_id = $layers_sidebar_key . $import_data['post_id']; } // 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 = ''; } elseif (isset($import_data['post_hash'])) { $args = array('meta_key' => '_layers_hash', 'meta_value' => $import_data['post_hash'], 'post_type' => 'page', 'post_status' => 'publish,draft', 'posts_per_page' => 1); $check_for_post = get_posts($args); if (!empty($check_for_post)) { $new_post_id = $check_for_post[0]->ID; } else { $new_post_id = layers_create_builder_page($import_data['post_title']); update_post_meta($new_post_id, '_layers_hash', $import_data['post_hash'], false); } if ($new_post_id) { $sidebar_available = true; $use_sidebar_id = $layers_sidebar_key . $new_post_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 = __('Sidebar does not exist in theme (using Inactive)', 'layerswp'); } } 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 = __('Sidebar does not exist in theme (using Inactive)', 'layerswp'); } // 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 ($sidebar_data as $widget_instance_id => $widget) { /* * Debug */ // Check for and import images foreach ($widget as $option => $widget_data) { $widget[$option] = $this->check_for_images($widget_data); } $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 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 = __('Widget already exists', 'layerswp'); // 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[] = (array) $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 $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 // Success message if ($sidebar_available) { $widget_message_type = 'success'; $widget_message = __('Imported', 'layerswp'); } else { $widget_message_type = 'warning'; $widget_message = __('Imported to Inactive', 'layerswp'); } } // 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'] = isset($widget->title) ? $widget->title : __('No Title', 'layerswp'); // 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; } } ob_start(); dynamic_sidebar('obox-layers-builder-' . $import_data['post_id']); $results['sidebar_html'] = trim(ob_get_clean()); if (FALSE == $is_preset) { do_action('layers_backup_sidebars_widgets'); } return $results; }
/** * Ajax Create a Builder Page from a preset page * * This function takes on the Preset Page Data and runs the import() function */ public function create_builder_page_from_preset() { global $layers_widgets; $check_builder_pages = layers_get_builder_pages(); if (isset($_POST['post_title'])) { $post_title = $_POST['post_title']; } else { $post_title = __('Home Page', 'layerswp'); } // Generate builder page and return page ID $import_data['post_id'] = layers_create_builder_page($post_title); $new_page = get_page($import_data['post_id']); // Register Builder Sidebar $layers_widgets->register_builder_sidebar($import_data['post_id']); // Add Widget Data to the import array if (isset($_POST['widget_data'])) { $import_data['widget_data'] = $_POST['widget_data']; } else { $import_data['widget_data'] = NULL; } // Run data import $import_progress = $this->import($import_data); if (count($check_builder_pages) == 0) { update_option('page_on_front', $import_data['post_id']); update_option('show_on_front', 'page'); } $results = array('post_id' => $import_data['post_id'], 'post_title' => $new_page->post_title, 'data_report' => $import_progress, 'customizer_location' => admin_url() . 'customize.php?url=' . esc_url(get_the_permalink($import_data['post_id']))); die(json_encode($results)); }