public function add_settings($args) { if (isset($args['settings']) && is_array($args['settings'])) { $settings = Nova_Field_Sanitize::sanitize_settings($args); $defaults = isset($args['default']) ? $args['default'] : array(); $sanitize_callback = Nova_Field_Sanitize::sanitize_callback($args); foreach ($settings as $setting_key => $setting_value) { $default = isset($defaults[$setting_key]) ? $defaults[$setting_key] : ''; $type = Nova_Field_Sanitize::sanitize_type($args); $capability = Nova_Field_Sanitize::sanitize_capability($args); $transport = isset($args['transport']) ? $args['transport'] : 'refresh'; if (isset($args['sanitize_callback']) && is_array($args['sanitize_callback'])) { if (isset($args['sanitize_callback'][$setting_key])) { $sanitize_callback = Nova_Field_Sanitize::sanitize_callback(array('sanitize_callback' => $args['sanitize_callback'][$setting_key])); } } $this->wp_customize->add_setting($setting_value, array('default' => $default, 'type' => $type, 'capability' => $capability, 'sanitize_callback' => $sanitize_callback, 'transport' => $transport)); } } if (isset($args['type']) && array_key_exists($args['type'], Nova_Control::$setting_types)) { // We must instantiate a custom class for the setting $setting_classname = Nova_Control::$setting_types[$args['type']]; $this->wp_customize->add_setting(new $setting_classname($this->wp_customize, Nova_Field_Sanitize::sanitize_settings($args), array('default' => isset($args['default']) ? $args['default'] : '', 'type' => Nova_Field_Sanitize::sanitize_type($args), 'capability' => Nova_Field_Sanitize::sanitize_capability($args), 'transport' => isset($args['transport']) ? $args['transport'] : 'refresh', 'sanitize_callback' => Nova_Field_Sanitize::sanitize_callback($args)))); } else { $this->wp_customize->add_setting(Nova_Field_Sanitize::sanitize_settings($args), array('default' => isset($args['default']) ? $args['default'] : '', 'type' => Nova_Field_Sanitize::sanitize_type($args), 'capability' => Nova_Field_Sanitize::sanitize_capability($args), 'transport' => isset($args['transport']) ? $args['transport'] : 'refresh', 'sanitize_callback' => Nova_Field_Sanitize::sanitize_callback($args))); } }
/** * Generates the scripts needed for postMessage. * This works on a per-field basis. * Once created, the script is added to the $postmessage_script property. * * @param array the field definition * @return void */ public static function generate_script($args = array()) { $script = ''; /** * Make sure "transport" is defined */ $args['transport'] = isset($args['transport']) ? $args['transport'] : 'refresh'; /** * Make sure that we need to proceed */ if (isset($args['js_vars']) && 'postMessage' == $args['transport']) { /** * Make sure that "js_vars" is an array. * If not, then early exit with return. */ if (!is_array($args['js_vars']) || empty($args['js_vars'])) { return; } /** * Start looping through all the "js_vars" items in the array. * Documentation on how to use the "js_vars" argument and its syntax * can be found on https://github.com/aristath/nova/wiki/js_vars */ foreach ($args['js_vars'] as $js_vars) { /** * Sanitize the arguments */ $js_vars = array('element' => isset($js_vars['element']) ? sanitize_text_field($js_vars['element']) : '', 'function' => isset($js_vars['function']) ? esc_js($js_vars['function']) : '', 'property' => isset($js_vars['property']) ? esc_js($js_vars['property']) : '', 'units' => isset($js_vars['units']) ? esc_js($js_vars['units']) : '', 'prefix' => isset($js_vars['prefix']) ? esc_js($js_vars['prefix']) : '', 'suffix' => isset($js_vars['prefix']) ? esc_js($js_vars['prefix']) : ''); $units = !empty($js_vars['units']) ? " + '" . $js_vars['units'] . "'" : ''; $prefix = !empty($js_vars['prefix']) ? "'" . $js_vars['prefix'] . "' + " : ''; $suffix = !empty($js_vars['suffix']) ? " + '" . $js_vars['suffix'] . "'" : ''; $script .= 'wp.customize( \'' . Nova_Field_Sanitize::sanitize_settings($args) . '\', function( value ) {'; $script .= 'value.bind( function( newval ) {'; if ('html' == $js_vars['function']) { $script .= '$(\'' . $js_vars['element'] . '\').html( newval );'; } else { $script .= '$(\'' . $js_vars['element'] . '\').' . $js_vars['function'] . '(\'' . $js_vars['property'] . '\', ' . $prefix . 'newval' . $units . $suffix . ' );'; } $script .= '}); });'; } } self::$postmessage_script .= $script; }
/** * Generates the scripts needed for tooltips. * This works on a per-field basis. * Once created, the script is added to the $tooltip_script property. * * @param array the field definition * @return void */ public static function generate_script($args = array()) { /** * The following control types already have the "help" argument in them * and they don't need an extra implementation in order to be rendered. * We're going to ignore these control-types and only process the rest. */ $ready_controls = array('checkbox', 'code', 'color-alpha', 'custom', 'dimension', 'editor', 'multicheck', 'number', 'palette', 'radio-buttonset', 'radio-image', 'radio', 'nova-radio', 'repeater', 'select', 'nova-select', 'select2', 'select2-multiple', 'slider', 'sortable', 'spacing', 'switch', 'textarea', 'toggle', 'typography'); /** * Make sure the field-type has been defined. * If it has not been defined the we don't know what to do with it and should exit. * No error is displayed, we just won't do anything. */ if (isset($args['type']) && in_array($args['type'], $ready_controls)) { return; } $args['settings'] = Nova_Field_Sanitize::sanitize_settings($args); $script = ''; if (isset($args['help']) && !empty($args['help'])) { $content = "<a href='#' class='tooltip hint--left' data-hint='" . wp_strip_all_tags($args['help']) . "'><span class='dashicons dashicons-info'></span></a>"; $script = '$( "' . $content . '" ).prependTo( "#customize-control-' . $args['settings'] . '" );'; } self::$tooltip_script .= $script; }
/** * Build the background fields. * Takes a single field with type = background and explodes it to multiple controls. * * @param array * @return null|array */ public static function explode($field) { $i18n = Nova_Toolkit::i18n(); $choices = self::background_choices(); // Early exit if this is not a background field. if ('background' != $field['type']) { return; } // Sanitize field $field = Nova_Field_Sanitize::sanitize_field($field); // No need to proceed any further if no defaults have been set. // We build the array of fields based on what default values have been defined. if (!isset($field['default']) || !is_array($field['default'])) { return; } $fields = array(); $i = 0; foreach ($field['default'] as $key => $value) { // No need to process the opacity, it is factored in the color control. if ('opacity' == $key) { continue; } $key = esc_attr($key); $setting = $key; $help = $field['help']; $description = isset($i18n['background-' . $key]) ? $i18n['background-' . $key] : ''; $output_property = 'background-' . $key; $label = 0 === $i ? $field['label'] : ''; $type = 'select'; $sanitize_callback = 'esc_attr'; switch ($key) { case 'color': /** * Use 'color-alpha' instead of 'color' if default is an rgba value * or if 'opacity' is set. */ $type = false !== strpos($field['default']['color'], 'rgba') ? 'color-alpha' : 'color'; $type = isset($field['default']['opacity']) ? 'color-alpha' : $type; if (isset($field['default']['opacity']) && false === strpos($value, 'rgb')) { $value = Nova_Color::get_rgba($value, $field['default']['opacity']); } $sanitize_callback = array('Nova_Sanitize_Values', 'color'); break; case 'image': $type = 'image'; $sanitize_callback = 'esc_url_raw'; break; case 'attach': /** * Small hack so that background attachments properly work. */ $output_property = 'background-attachment'; $description = $i18n['background-attachment']; break; default: $help = ''; break; } /** * If we're using options & option_name is set, then we need to modify the setting. */ if (isset($field['option_type']) && 'option' == $field['option_type'] && isset($field['option_name']) && !empty($field['option_name'])) { $property_setting = str_replace(']', '', str_replace($field['option_name'] . '[', '', $field['settings'])); $property_setting = esc_attr($field['option_name']) . '[' . esc_attr($property_setting) . '_' . $setting . ']'; } else { $property_setting = esc_attr($field['settings']) . '_' . $setting; } /** * Build the field. * We're merging with the original field here, so any extra properties are inherited. */ $fields[$property_setting] = array_merge($field, array('type' => $type, 'label' => $label, 'settings' => $property_setting, 'help' => $help, 'section' => $field['section'], 'priority' => $field['priority'], 'required' => $field['required'], 'description' => $description, 'default' => $value, 'id' => Nova_Field_Sanitize::sanitize_id(array('settings' => Nova_Field_Sanitize::sanitize_settings(array('settings' => $field['settings'] . '_' . $setting)))), 'choices' => isset($choices[$key]) ? $choices[$key] : array(), 'output' => '' != $field['output'] ? array(array('element' => $field['output'], 'property' => $output_property)) : '', 'sanitize_callback' => isset($sanitize_callback) ? $sanitize_callback : Nova_Field_Sanitize::fallback_callback($type))); $i++; } return $fields; }
/** * Build the variables. * * @return array ('variable-name' => value) */ public function get_variables() { $variables = array(); /** * Loop through all fields */ foreach (Nova::$fields as $field) { /** * Check if we have variables for this field */ if (isset($field['variables']) && false != $field['variables'] && !empty($field['variables'])) { /** * Loop through the array of variables */ foreach ($field['variables'] as $field_variable) { /** * Is the variable ['name'] defined? * If yes, then we can proceed. */ if (isset($field_variable['name'])) { /** * Sanitize the variable name */ $variable_name = esc_attr($field_variable['name']); /** * Do we have a callback function defined? * If not then set $variable_callback to false. */ $variable_callback = isset($field_variable['callback']) && is_callable($field_variable['callback']) ? $field_variable['callback'] : false; /** * If we have a variable_callback defined then get the value of the option * and run it through the callback function. * If no callback is defined (false) then just get the value. */ if ($variable_callback) { $variables[$variable_name] = call_user_func($field_variable['callback'], Nova::get_option(Nova_Field_Sanitize::sanitize_settings($field))); } else { $variables[$variable_name] = Nova::get_option($field['settings']); } } } } } /** * Pass the variables through a filter ('nova/variable') * and return the array of variables */ return apply_filters('nova/variable', $variables); }
public static function add_field($config_id, $args) { if (is_array($config_id) && empty($args)) { $args = $config_id; $config_id = 'global'; } $config_id = '' == $config_id ? 'global' : $config_id; /** * Get the configuration options */ if (!isset(Nova::$config[$config_id])) { $config_id = 'global'; } $config = Nova::$config[$config_id]; /** * If we've set an option in the configuration * then make sure we're using options and not theme_mods */ if ('' != $config['option_name']) { $config['option_type'] = 'option'; } /** * If no option name has been set for the field, * use the one from the configuration */ if (!isset($args['option_name'])) { $args['option_name'] = $config['option_name']; } /** * If no capability has been set for the field, * use the one from the configuration */ if (!isset($args['capability'])) { $args['capability'] = $config['capability']; } /** * Check if [settings] is set. * If not set, check for [setting] */ if (!isset($args['settings']) && isset($args['setting'])) { $args['settings'] = $args['setting']; } /** * If no option-type has been set for the field, * use the one from the configuration */ if (!isset($args['option_type'])) { $args['option_type'] = $config['option_type']; } /** * Add the field to the static $fields variable properly indexed */ Nova::$fields[Nova_Field_Sanitize::sanitize_settings($args)] = $args; if ('background' == $args['type']) { /** * Build the background fields */ Nova::$fields = Nova_Explode_Background_Field::process_fields(Nova::$fields); } }