class-kirki-active-callback.php (5238B)
1 <?php 2 /** 3 * Active callback used with the "required" argument in fields 4 * 5 * @package Kirki 6 * @category Core 7 * @author Aristeides Stathopoulos 8 * @copyright Copyright (c) 2016, Aristeides Stathopoulos 9 * @license http://opensource.org/licenses/https://opensource.org/licenses/MIT 10 */ 11 12 if ( ! class_exists( 'Kirki_Active_Callback' ) ) { 13 14 /** 15 * Callback class for use with the "required" argument 16 */ 17 class Kirki_Active_Callback { 18 19 /** 20 * Figure out whether the current object should be displayed or not. 21 * 22 * @param WP_Customize_Setting $object The current field. 23 * @return boolean 24 */ 25 public static function evaluate( $object ) { 26 27 // Get all fields. 28 $fields = Kirki::$fields; 29 30 // Make sure the current object matches a registered field. 31 if ( ! isset( $object->setting->id ) || ! isset( $fields[ $object->setting->id ] ) ) { 32 return true; 33 } 34 35 $show = true; 36 37 $field = $fields[ $object->setting->id ]; 38 39 if ( isset( $field['required'] ) ) { 40 41 foreach ( $field['required'] as $requirement ) { 42 // Handles "AND" functionality. 43 $show = self::evaluate_requirement( $object, $field, $requirement ); 44 // No need to process further if one requirement returns false. 45 if ( ! $show ) { 46 return false; 47 } 48 } 49 } 50 51 return $show; 52 53 } 54 55 /** 56 * Figure out whether the current object should be displayed or not. 57 * We're only parsing a single requirement here from the array of requirements. 58 * This is a proxy function that facilitates evaluating and/or conditions. 59 * 60 * @param WP_Customize_Setting $object The current field. 61 * @param object $field The current object. 62 * @param array $requirement A single requirement. 63 * @return boolean 64 */ 65 private static function evaluate_requirement( $object, $field, $requirement ) { 66 67 $show = true; 68 // Test for callables first. 69 if ( is_callable( $requirement ) ) { 70 71 $show = call_user_func_array( $requirement, array( $field, $object ) ); 72 73 // Look for comparison array. 74 } elseif ( is_array( $requirement ) && isset( $requirement['operator'], $requirement['value'], $requirement['setting'] ) ) { 75 76 if ( isset( $field['option_name'] ) && '' !== $field['option_name'] ) { 77 if ( false === strpos( $requirement['setting'], '[' ) ) { 78 $requirement['setting'] = $field['option_name'] . '[' . $requirement['setting'] . ']'; 79 } 80 } 81 82 $current_setting = $object->manager->get_setting( $requirement['setting'] ); 83 84 /** 85 * Depending on the 'operator' argument we use, 86 * we'll need to perform the appropriate comparison 87 * and figure out if the control will be shown or not. 88 */ 89 $show = self::compare( $requirement['value'], $current_setting->value(), $requirement['operator'] ); 90 91 } else { 92 93 if ( is_array( $requirement ) ) { 94 // Handles "OR" functionality. 95 $show = false; 96 foreach ( $requirement as $sub_requirement ) { 97 $show = self::evaluate_requirement( $object, $field, $sub_requirement ); 98 // No need to go on if one sub_requirement returns true. 99 if ( $show ) { 100 return true; 101 } 102 } 103 } else { 104 return true; 105 } 106 } 107 108 return $show; 109 } 110 111 /** 112 * Compares the 2 values given the condition 113 * 114 * @param mixed $value1 The 1st value in the comparison. 115 * @param mixed $value2 The 2nd value in the comparison. 116 * @param string $operator The operator we'll use for the comparison. 117 * @return boolean whether The comparison has succeded (true) or failed (false). 118 */ 119 public static function compare( $value1, $value2, $operator ) { 120 switch ( $operator ) { 121 case '===': 122 $show = ( $value1 === $value2 ) ? true : false; 123 break; 124 case '==': 125 case '=': 126 case 'equals': 127 case 'equal': 128 $show = ( $value1 == $value2 ) ? true : false; 129 break; 130 case '!==': 131 $show = ( $value1 !== $value2 ) ? true : false; 132 break; 133 case '!=': 134 case 'not equal': 135 $show = ( $value1 != $value2 ) ? true : false; 136 break; 137 case '>=': 138 case 'greater or equal': 139 case 'equal or greater': 140 $show = ( $value1 >= $value2 ) ? true : false; 141 break; 142 case '<=': 143 case 'smaller or equal': 144 case 'equal or smaller': 145 $show = ( $value1 <= $value2 ) ? true : false; 146 break; 147 case '>': 148 case 'greater': 149 $show = ( $value1 > $value2 ) ? true : false; 150 break; 151 case '<': 152 case 'smaller': 153 $show = ( $value1 < $value2 ) ? true : false; 154 break; 155 case 'contains': 156 case 'in': 157 if ( is_array( $value1 ) && ! is_array( $value2 ) ) { 158 $array = $value1; 159 $string = $value2; 160 } elseif ( is_array( $value2 ) && ! is_array( $value1 ) ) { 161 $array = $value2; 162 $string = $value1; 163 } 164 if ( isset( $array ) && isset( $string ) ) { 165 if ( ! in_array( $string, $array ) ) { 166 $show = false; 167 } 168 } else { 169 if ( false === strrpos( $value1, $value2 ) && false === strpos( $value2, $value1 ) ) { 170 $show = false; 171 } 172 } 173 break; 174 default: 175 $show = ( $value1 == $value2 ) ? true : false; 176 177 } 178 179 if ( isset( $show ) ) { 180 return $show; 181 } 182 183 return true; 184 } 185 } 186 }