/** * 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 = Kirki_Toolkit::i18n(); $choices = self::background_choices(); // Early exit if this is not a background field. if ('background' != $field['type']) { return; } // Sanitize field $field = Kirki_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 = Kirki_Color::get_rgba($value, $field['default']['opacity']); } $sanitize_callback = array('Kirki_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' => Kirki_Field_Sanitize::sanitize_id(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 : Kirki_Field_Sanitize::fallback_callback($type))); $i++; } return $fields; }
public function test_fallback_callback() { $this->assertEquals(array('Kirki_Sanitize_Values', 'checkbox'), Kirki_Field_Sanitize::fallback_callback('checkbox')); $this->assertEquals(array('Kirki_Sanitize_Values', 'color'), Kirki_Field_Sanitize::fallback_callback('color-alpha')); $this->assertEquals(array('Kirki_Sanitize_Values', 'color'), Kirki_Field_Sanitize::fallback_callback('color')); $this->assertEquals(array('Kirki_Sanitize_Values', 'unfiltered'), Kirki_Field_Sanitize::fallback_callback('custom')); $this->assertEquals(array('Kirki_Sanitize_Values', 'dropdown_pages'), Kirki_Field_Sanitize::fallback_callback('dropdown-pages')); $this->assertEquals('esc_textarea', Kirki_Field_Sanitize::fallback_callback('editor')); $this->assertEquals('esc_url_raw', Kirki_Field_Sanitize::fallback_callback('image')); $this->assertEquals(array('Kirki_Sanitize_Values', 'multicheck'), Kirki_Field_Sanitize::fallback_callback('multicheck')); $this->assertEquals(array('Kirki_Sanitize_Values', 'number'), Kirki_Field_Sanitize::fallback_callback('number')); $this->assertEquals('esc_attr', Kirki_Field_Sanitize::fallback_callback('palette')); $this->assertEquals('esc_attr', Kirki_Field_Sanitize::fallback_callback('radio-buttonset')); $this->assertEquals('esc_attr', Kirki_Field_Sanitize::fallback_callback('radio-image')); $this->assertEquals('esc_attr', Kirki_Field_Sanitize::fallback_callback('radio')); $this->assertEquals(array('Kirki_Sanitize_Values', 'unfiltered'), Kirki_Field_Sanitize::fallback_callback('select')); $this->assertEquals(array('Kirki_Sanitize_Values', 'number'), Kirki_Field_Sanitize::fallback_callback('slider')); $this->assertEquals(array('Kirki_Sanitize_Values', 'sortable'), Kirki_Field_Sanitize::fallback_callback('sortable')); $this->assertEquals(array('Kirki_Sanitize_Values', 'checkbox'), Kirki_Field_Sanitize::fallback_callback('switch')); $this->assertEquals('esc_textarea', Kirki_Field_Sanitize::fallback_callback('text')); $this->assertEquals('esc_textarea', Kirki_Field_Sanitize::fallback_callback('textarea')); $this->assertEquals(array('Kirki_Sanitize_Values', 'checkbox'), Kirki_Field_Sanitize::fallback_callback('toggle')); $this->assertEquals('esc_url_raw', Kirki_Field_Sanitize::fallback_callback('upload')); }