. * * @package ReduxFramework * @author Dovy Paukstys (dovy) * @version 3.0.0 */ // Exit if accessed directly if (!defined('ABSPATH')) { exit; } // Don't duplicate me! if (!class_exists('ReduxFramework_extension_customizer')) { /** * Main ReduxFramework customizer extension class * * @since 1.0.0 */ class ReduxFramework_extension_customizer { // Protected vars protected $redux; private $_extension_url; private $_extension_dir; private $parent; public static $version = "2.0"; /** * Class Constructor. Defines the args for the extions class * * @since 1.0.0 * @access public * @param array $sections Panel sections. * @param array $args Class constructor arguments. * @param array $extra_tabs Extra panel tabs. * @return void */ public function __construct($parent) { //add_action('wp_head', array( $this, '_enqueue_new' )); global $pagenow; if (( $pagenow !== "customize.php" && $pagenow !== "admin-ajax.php" && !isset($GLOBALS['wp_customize']))) { return; } $this->parent = $parent; if (empty($this->_extension_dir)) { $this->_extension_dir = trailingslashit(str_replace('\\', '/', dirname(__FILE__))); $this->_extension_url = site_url(str_replace(trailingslashit(str_replace('\\', '/', ABSPATH)), '', $this->_extension_dir)); } // Create defaults array $defaults = array(); /* customize_controls_init customize_controls_enqueue_scripts customize_controls_print_styles customize_controls_print_scripts customize_controls_print_footer_scripts */ if (!isset($_POST['customized']) || $pagenow == "admin-ajax.php") { add_action('customize_register', array($this, '_register_customizer_controls')); // Create controls } if (isset($_POST['customized'])) { if ($pagenow == "admin-ajax.php" && $_POST['action'] == 'customize_save') { //$this->parent-> } add_action("redux/options/{$this->parent->args['opt_name']}/options", array($this, '_override_values'), 100); add_action('customize_save', array($this, 'customizer_save_before')); // Before save add_action('customize_save_after', array(&$this, 'customizer_save_after')); // After save add_action( 'wp_head', array( $this, 'customize_preview_init' ) ); } //add_action( 'wp_enqueue_scripts', array( &$this, '_enqueue_previewer_css' ) ); // Enqueue previewer css //add_action( 'wp_enqueue_scripts', array( &$this, '_enqueue_previewer_js' ) ); // Enqueue previewer javascript //add_action( "wp_footer", array( $this, '_enqueue_new' ), 100 ); //$this->_enqueue_new(); } function customize_preview_init() { do_action('redux/customizer/live_preview'); } public function _override_values($data) { if (isset($_POST['customized'])) { $this->orig_options = $this->parent->options; $options = json_decode(stripslashes_deep($_POST['customized']), true); foreach ($options as $key => $value) { if (strpos($key, $this->parent->args['opt_name']) !== false) { $key = str_replace($this->parent->args['opt_name'] . '[', '', rtrim($key, "]")); $data[$key] = $value; $GLOBALS[$this->parent->args['global_variable']][$key] = $value; $this->parent->options[$key] = $value; } } } return $data; } public function _enqueue_new() { //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; //echo ""; /* wp_enqueue_script('redux-extension-customizer-codemirror-js', $this->_extension_url . 'new/codemirror.min.js'); wp_enqueue_script('redux-extension-customizer-color-js', $this->_extension_url . 'new/colors-control.js'); wp_enqueue_script('redux-extension-customizer-controls-js', $this->_extension_url . 'new/customizer-control.js'); wp_enqueue_script('redux-extension-customizer-fonts-js', $this->_extension_url . 'new/fonts-customizer-admin.js'); wp_enqueue_script('redux-extension-customizer-header-js', $this->_extension_url . 'new/header-control.js'); wp_enqueue_script('redux-extension-customizer-models-js', $this->_extension_url . 'new/header-models.js'); wp_enqueue_script('redux-extension-customizer-slimscroll-js', $this->_extension_url . 'new/jquery.slimscroll.js'); wp_enqueue_script('redux-extension-customizer-droppable-js', $this->_extension_url . 'new/jquery.ui.droppable.min.js'); wp_enqueue_script('redux-extension-customizer-editor-js', $this->_extension_url . 'new/media-editor.min.js'); wp_enqueue_script('redux-extension-customizer-new-js', $this->_extension_url . 'new/new-customizer.js'); wp_enqueue_script('redux-extension-customizer-previewing-js', $this->_extension_url . 'new/previewing.js'); wp_enqueue_script('redux-extension-customizer-theme-js', $this->_extension_url . 'new/theme-customizer.js'); */ } // All sections, settings, and controls will be added here public function _register_customizer_controls($wp_customize) { $order = array( 'heading' => -500, 'option' => -500, ); $defaults = array( 'default-color' => '', 'default-image' => '', 'wp-head-callback' => '', 'admin-head-callback' => '', 'admin-preview-callback' => '' ); foreach ($this->parent->sections as $key => $section) { // Not a type that should go on the customizer if (empty($section['fields']) || ( isset($section['type']) && $section['type'] == "divide" )) { continue; } // If section customizer is set to false if (isset($section['customizer']) && $section['customizer'] === false) { continue; } // No errors please if (!isset($section['desc'])) { $section['desc'] = ""; } // Fill the description if there is a subtitle if (empty($section['desc']) && !empty($section['subtitle'])) { $section['desc'] = $section['subtitle']; } // Let's make a section ID from the title if (empty($section['id'])) { $section['id'] = strtolower(str_replace(" ", "", $section['title'])); } // No title is present, let's show what section is missing a title if (!isset($section['title'])) { print_r($section); } // Let's set a default priority if (empty($section['priority'])) { $section['priority'] = $order['heading']; $order['heading'] ++; } $wp_customize->add_section($section['id'], array( 'title' => $section['title'], 'priority' => $section['priority'], 'description' => $section['desc'] )); foreach ($section['fields'] as $skey => $option) { if (isset($option['customizer']) && $option['customizer'] === false) { continue; } if ($this->parent->args['customizer'] === false && (!isset($option['customizer']) || $option['customizer'] !== true )) { continue; } //Change the item priority if not set if ($option['type'] != 'heading' && !isset($option['priority'])) { $option['priority'] = $order['option']; $order['option'] ++; } if (!empty($this->options_defaults[$option['id']])) { $option['default'] = $this->options_defaults['option']['id']; } //$option['id'] = $this->parent->args['opt_name'].'['.$option['id'].']'; //echo $option['id']; if (!isset($option['default'])) { $option['default'] = ""; } if (!isset($option['title'])) { $option['title'] = ""; } // Wordpress doesn't support multi-select if ($option['type'] == "select" && isset($option['multi']) && $option['multi'] == true) { continue; } $customSetting = array( 'default' => $option['default'], 'type' => 'option', 'capabilities' => 'manage_theme_options', 'transport' => 'refresh', 'theme_supports' => '', //'sanitize_callback' => array( $this, '_field_validation' ), //'sanitize_js_callback' =>array( &$parent, '_field_input' ), ); $option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']'; if ($option['type'] != "heading" || !empty($option['type'])) { $wp_customize->add_setting($option['id'], array ( 'default' => '', 'sanitize_callback' => array( $this, '_field_validation' ), )); } if (!empty($option['data']) && empty($option['options'])) { if (empty($option['args'])) { $option['args'] = array(); } if ($option['data'] == "elusive-icons" || $option['data'] == "elusive-icon" || $option['data'] == "elusive") { $icons_file = ReduxFramework::$_dir . 'inc/fields/select/elusive-icons.php'; $icons_file = apply_filters('redux-font-icons-file', $icons_file); if (file_exists($icons_file)) { require_once $icons_file; } } $option['options'] = $this->parent->get_wordpress_data($option['data'], $option['args']); } switch ($option['type']) { case 'heading': // We don't want to put up the section unless it's used by something visible in the customizer $section = $option; $section['id'] = strtolower(str_replace(" ", "", $option['title'])); $order['heading'] = -500; if (!empty($option['priority'])) { $section['priority'] = $option['priority']; } else { $section['priority'] = $order['heading']; $order['heading'] ++; } break; case 'text': if (isset($option['data']) && $option['data']) { continue; } $wp_customize->add_control($option['id'], array( 'label' => $option['title'], 'section' => $section['id'], 'settings' => $option['id'], 'priority' => $option['priority'], 'type' => 'text', )); break; case 'select': if (( isset($option['sortable']) && $option['sortable'])) { continue; } $wp_customize->add_control($option['id'], array( 'label' => $option['title'], 'section' => $section['id'], 'settings' => $option['id'], 'priority' => $option['priority'], 'type' => 'select', 'choices' => $option['options'] )); break; case 'radio': //continue; $wp_customize->add_control($option['id'], array( 'label' => $option['title'], 'section' => $section['id'], 'settings' => $option['id'], 'priority' => $option['priority'], 'type' => 'radio', 'choices' => $option['options'] )); break; case 'checkbox': if (( isset($option['data']) && $option['data'] ) || ( ( isset($option['multi']) && $option['multi'] ) ) || ( ( isset($option['options']) && !empty($option['options']) ) )) { continue; } $wp_customize->add_control($option['id'], array( 'label' => $option['title'], 'section' => $section['id'], 'settings' => $option['id'], 'priority' => $option['priority'], 'type' => 'checkbox', )); break; case 'media': continue; $wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, $option['id'], array( 'label' => $option['title'], 'section' => $section['id'], 'settings' => $option['id'], 'priority' => $option['priority'] ))); break; case 'color': $wp_customize->add_control(new WP_Customize_Color_Control($wp_customize, $option['id'], array( 'label' => $option['title'], 'section' => $section['id'], 'settings' => $option['id'], 'priority' => $option['priority'] ))); break; case 'switch': continue; $wp_customize->add_control(new Redux_customizer_switch($wp_customize, $option['id'], array( 'label' => $option['title'], 'section' => $section['id'], 'settings' => $option['id'], 'field' => $option, 'ReduxFramework' => $this->parent, 'priority' => $option['priority'], ))); break; default: break; } } } /* title_tagline - Site Title & Tagline colors - Colors header_image - Header Image background_image - Background Image nav - Navigation static_front_page - Static Front Page */ } public function customizer_save_before($plugin_options) { $this->before_save = $this->parent->options; //$parent->_field_input( $plugin_options ); } public function customizer_save_after($wp_customize) { //if( isset( $_POST['customized'] ) ) { $options = json_decode(stripslashes_deep($_POST['customized']), true); $compiler = false; $changed = array(); foreach ($options as $key => $value) { if (strpos($key, $this->parent->args['opt_name']) !== false) { $key = str_replace($this->parent->args['opt_name'] . '[', '', rtrim($key, "]")); if (!isset($this->orig_options[$key]) || $this->orig_options[$key] != $value || (isset($this->orig_options[$key]) && !empty($this->orig_options[$key]) && empty($value))) { $changed[$key] = $value; if (isset($this->parent->compiler_fields[$key])) { $compiler = true; } } } } if (!empty($changed)) { setcookie("redux-saved-{$this->args['opt_name']}", 1, time() + 1000, "/"); } if ($compiler) { // Have to set this to stop the output of the CSS and typography stuff. $this->parent->no_output = true; $this->parent->_enqueue_output(); do_action("redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS); } //} // print_r($wp_customize); //exit(); //return $wp_customize; } /** * Enqueue CSS/JS for preview pane * * @since 1.0.0 * @access public * @global $wp_styles * @return void */ public function _enqueue_previewer() { wp_enqueue_script( 'redux-extension-previewer-js', $this->_extension_url . 'assets/js/preview.js' ); $localize = array( 'save_pending' => __('You have changes that are not saved. Would you like to save them now?', 'redux-framework'), 'reset_confirm' => __('Are you sure? Resetting will lose all custom values.', 'redux-framework'), 'preset_confirm' => __('Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework'), 'opt_name' => $this->args['opt_name'], //'folds' => $this->folds, 'options' => $this->parent->options, 'defaults' => $this->parent->options_defaults, ); wp_localize_script( 'redux-extension-previewer-js', 'reduxPost', $localize ); } /** * Enqueue CSS/JS for the customizer controls * * @since 1.0.0 * @access public * @global $wp_styles * @return void */ public function _enqueue() { global $wp_styles; //wp_enqueue_style( 'wp-pointer' ); //wp_enqueue_script( 'wp-pointer' ); // Remove when code is in place! //wp_enqueue_script('redux-extension-customizer-js', $this->_extension_url . 'assets/js/customizer.js'); // Get styles //wp_enqueue_style('redux-extension-customizer-css', $this->_extension_url . 'assets/css/customizer.css'); $localize = array( 'save_pending' => __('You have changes that are not saved. Would you like to save them now?', 'redux-framework'), 'reset_confirm' => __('Are you sure? Resetting will lose all custom values.', 'redux-framework'), 'preset_confirm' => __('Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework'), 'opt_name' => $this->args['opt_name'], //'folds' => $this->folds, 'field' => $this->parent->options, 'defaults' => $this->parent->options_defaults, ); // Values used by the javascript wp_localize_script( 'redux-js', 'redux_opts', $localize ); do_action('redux-enqueue-' . $this->args['opt_name']); foreach ($this->sections as $section) { if (isset($section['fields'])) { foreach ($section['fields'] as $field) { if (isset($field['type'])) { $field_class = 'ReduxFramework_' . $field['type']; if (!class_exists($field_class)) { $class_file = apply_filters('redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class); if ($class_file) { /** @noinspection PhpIncludeInspection */ require_once( $class_file ); } } if (class_exists($field_class) && method_exists($field_class, 'enqueue')) { $enqueue = new $field_class('', '', $this); $enqueue->enqueue(); } } } } } } /** * Register Option for use * * @since 1.0.0 * @access public * @return void */ public function _register_setting() { } /** * Validate the options before insertion * * @since 3.0.0 * @access public * @param array $plugin_options The options array * @return */ public function _field_validation($plugin_options, $two) { echo "dovy"; echo $two; return $plugin_options; return $this->parent->_validate_options($plugin_options); } /** * HTML OUTPUT. * * @since 1.0.0 * @access public * @return void */ public function _customizer_html_output() { } } // class } // if