class-kirki-field-repeater.php (3574B)
1 <?php 2 /** 3 * Override field methods 4 * 5 * @package Kirki 6 * @subpackage Controls 7 * @copyright Copyright (c) 2016, Aristeides Stathopoulos 8 * @license http://opensource.org/licenses/https://opensource.org/licenses/MIT 9 * @since 2.2.7 10 */ 11 12 if ( ! class_exists( 'Kirki_Field_Repeater' ) ) { 13 14 /** 15 * Field overrides. 16 */ 17 class Kirki_Field_Repeater extends Kirki_Field { 18 19 /** 20 * Sets the control type. 21 * 22 * @access protected 23 */ 24 protected function set_type() { 25 26 $this->type = 'repeater'; 27 28 } 29 30 /** 31 * Sets the $sanitize_callback 32 * 33 * @access protected 34 */ 35 protected function set_sanitize_callback() { 36 37 // If a custom sanitize_callback has been defined, 38 // then we don't need to proceed any further. 39 if ( ! empty( $this->sanitize_callback ) ) { 40 return; 41 } 42 $this->sanitize_callback = array( $this, 'sanitize' ); 43 44 } 45 46 /** 47 * The sanitize method that will be used as a falback 48 * 49 * @param string|array $value The control's value. 50 */ 51 public function sanitize( $value ) { 52 53 // is the value formatted as a string? 54 if ( is_string( $value ) ) { 55 $value = rawurldecode( $value ); 56 $value = json_decode( $value, true ); 57 } 58 59 // Nothing to sanitize if we don't have fields. 60 if ( empty( $this->fields ) ) { 61 return $value; 62 } 63 64 foreach ( $value as $row_id => $row_value ) { 65 66 // Make sure the row is formatted as an array. 67 if ( ! is_array( $row_value ) ) { 68 $value[ $row_id ] = array(); 69 continue; 70 } 71 // Start parsing sub-fields in rows. 72 foreach ( $row_value as $subfield_id => $subfield_value ) { 73 // Make sure this is a valid subfield. 74 // If it's not, then unset it. 75 if ( ! isset( $this->fields[ $subfield_id ] ) ) { 76 unset( $value[ $row_id ][ $subfield_id ] ); 77 } 78 // Get the subfield-type. 79 $subfield_type = $this->fields[ $subfield_id ]['type']; 80 81 // Allow using a sanitize-callback on a per-field basis. 82 if ( isset( $this->fields[ $subfield_id ]['sanitize_callback'] ) ) { 83 84 $subfield_value = call_user_func( $this->fields[ $subfield_id ]['sanitize_callback'], $subfield_value ); 85 86 } else { 87 88 switch ( $subfield_type ) { 89 case 'image': 90 case 'cropped_image': 91 case 'upload': 92 if ( ! is_numeric( $subfield_value ) && is_string( $subfield_value ) ) { 93 $subfield_value = esc_url_raw( $subfield_value ); 94 } 95 break; 96 case 'dropdown-pages': 97 $subfield_value = (int) $subfield_value; 98 break; 99 case 'color': 100 // Instantiate the object. 101 $color_obj = ariColor::newColor( $subfield_value ); 102 $$subfield_value = $color_obj->toCSS( $color_obj->mode ); 103 break; 104 case 'text': 105 $subfield_value = esc_textarea( $subfield_value ); 106 break; 107 case 'url': 108 case 'link': 109 $subfield_value = esc_url_raw( $subfield_value ); 110 break; 111 case 'email': 112 $subfield_value = filter_var( $subfield_value, FILTER_SANITIZE_EMAIL ); 113 break; 114 case 'tel': 115 $subfield_value = esc_attr( $subfield_value ); 116 break; 117 case 'checkbox': 118 $subfield_value = (string) intval( $subfield_value ); 119 break; 120 case 'select': 121 case 'radio': 122 case 'radio-image': 123 $subfield_value = esc_attr( $subfield_value ); 124 break; 125 case 'textarea': 126 $subfield_value = wp_kses_post( $subfield_value ); 127 128 } 129 } 130 $value[ $row_id ][ $subfield_id ] = $subfield_value; 131 } 132 } 133 134 return $value; 135 } 136 } 137 }