202 lines
7.1 KiB
PHP
Executable File
202 lines
7.1 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
*
|
|
* Code is mostly from the Customizer Export/Import plugin.
|
|
*
|
|
* @see https://wordpress.org/plugins/customizer-export-import/
|
|
*
|
|
*/
|
|
if (!defined('ABSPATH')) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* The customizer import class.
|
|
*
|
|
*/
|
|
class BLAZE_DEMO_IMPORTER_Customizer_Importer {
|
|
|
|
/**
|
|
* Imports uploaded mods
|
|
*
|
|
*
|
|
* @access public
|
|
* @param object $wp_customize An instance of WP_Customize_Manager.
|
|
* @return void
|
|
*/
|
|
public static function import($customizerFile) {
|
|
global $wp_customize;
|
|
$template = get_template();
|
|
$data = maybe_unserialize(file_get_contents($customizerFile));
|
|
|
|
// Data checks.
|
|
if ('array' != gettype($data)) {
|
|
$error = __('Error importing settings! Please check that you uploaded a customizer export file.', 'blaze-demo-importer');
|
|
return;
|
|
}
|
|
if (!isset($data['template']) || !isset($data['mods'])) {
|
|
$error = __('Error importing settings! Please check that you uploaded a customizer export file.', 'blaze-demo-importer');
|
|
return;
|
|
}
|
|
if ($data['template'] != $template) {
|
|
$error = __('Error importing settings! The settings you uploaded are not for the current theme.', 'blaze-demo-importer');
|
|
return;
|
|
}
|
|
|
|
// Import Images.
|
|
$data['mods'] = self::import_images($data['mods']);
|
|
|
|
// Import custom options.
|
|
if (isset($data['options'])) {
|
|
|
|
// Load WordPress Customize Setting Class
|
|
if (!class_exists('WP_Customize_Setting')) {
|
|
require_once( ABSPATH . WPINC . '/class-wp-customize-setting.php' );
|
|
}
|
|
|
|
// Include Customizer Option class.
|
|
include_once( dirname(__FILE__) . '/class-customizer-option.php' );
|
|
|
|
foreach ($data['options'] as $option_key => $option_value) {
|
|
$option = new BLAZE_DEMO_IMPORTER_Customzer_Option($wp_customize, $option_key, array(
|
|
'default' => '',
|
|
'type' => 'option',
|
|
'capability' => 'edit_theme_options',
|
|
));
|
|
|
|
$option->import($option_value);
|
|
}
|
|
}
|
|
|
|
// If wp_css is set then import it.
|
|
if (function_exists('wp_update_custom_css_post') && isset($data['wp_css']) && '' !== $data['wp_css']) {
|
|
wp_update_custom_css_post($data['wp_css']);
|
|
}
|
|
|
|
// Loop through theme mods and update them.
|
|
if (!empty($data['mods'])) {
|
|
foreach ($data['mods'] as $key => $value) {
|
|
set_theme_mod($key, $value);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Imports images for settings saved as mods.
|
|
*
|
|
* @param array $mods An array of customizer mods.
|
|
* @return array The mods array with any new import data.
|
|
*/
|
|
private static function import_images($mods) {
|
|
foreach ($mods as $key => $value) {
|
|
|
|
//For repeater fields
|
|
if (self::isJSON($value)) {
|
|
$data_array = json_decode($value);
|
|
foreach ($data_array as $data_key => $data_object) {
|
|
if( is_array( $data_object ) ) {
|
|
foreach ($data_object as $sub_data_key => $sub_data_value) {
|
|
if (self::is_image_url($sub_data_value)) {
|
|
$sub_data = self::media_handle_sideload($sub_data_value);
|
|
if (!is_wp_error($sub_data)) {
|
|
$data_object->$sub_data_key = $sub_data->url;
|
|
}
|
|
} else {
|
|
$data_object->$sub_data_key = $sub_data_value;
|
|
}
|
|
}
|
|
}
|
|
if( is_array( $data_array ) ) $data_array[$data_key] = $data_object;
|
|
if( is_object( $data_array ) ) $data_array->$data_key = $data_object;
|
|
}
|
|
|
|
$mods[$key] = json_encode($data_array);
|
|
} else if (self::is_image_url($value)) {
|
|
$data = self::media_handle_sideload($value);
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* Taken from the core media_sideload_image function and
|
|
* modified to return an array of data instead of html.
|
|
*
|
|
* @param string $file The image file path.
|
|
* @return array An array of image data.
|
|
*/
|
|
private static function media_handle_sideload($file) {
|
|
$data = new stdClass();
|
|
|
|
if (!function_exists('media_handle_sideload')) {
|
|
require_once( ABSPATH . 'wp-admin/includes/media.php' );
|
|
require_once( ABSPATH . 'wp-admin/includes/file.php' );
|
|
require_once( ABSPATH . 'wp-admin/includes/image.php' );
|
|
}
|
|
|
|
if (!empty($file)) {
|
|
// Set variables for storage, fix file filename for query strings.
|
|
preg_match('/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches);
|
|
$file_array = array();
|
|
$file_array['name'] = basename($matches[0]);
|
|
|
|
// Download file to temp location.
|
|
$file_array['tmp_name'] = download_url($file);
|
|
|
|
// If error storing temporarily, return the error.
|
|
if (is_wp_error($file_array['tmp_name'])) {
|
|
return $file_array['tmp_name'];
|
|
}
|
|
|
|
// Do the validation and storage stuff.
|
|
$id = media_handle_sideload($file_array, 0);
|
|
|
|
// If error storing permanently, unlink.
|
|
if (is_wp_error($id)) {
|
|
@unlink($file_array['tmp_name']);
|
|
return $id;
|
|
}
|
|
|
|
// Build the object to return.
|
|
$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'];
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Checks to see whether a url is an image url or not.
|
|
*
|
|
* @param string $url The url to check.
|
|
* @return bool Whether the url is an image url or not.
|
|
*/
|
|
private static function is_image_url($url) {
|
|
if (is_string($url) && preg_match('/\.(jpg|jpeg|png|gif)/i', $url)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private static function isJSON($string) {
|
|
return is_string($string) && is_array(json_decode($string, true)) ? true : false;
|
|
}
|
|
|
|
}
|