); $post_type = isset( $field['search_post_type'] ) ? $field['search_post_type'] : 'any'; $result[ $field['name'] ]['action'] = 'cx_search_posts'; $result[ $field['name'] ]['post_type'] = $post_type; $result[ $field['name'] ]['inline_style'] = 'width: 100%;'; $result[ $field['name'] ]['multiple'] = $multiple; break; case 'date': case 'time': case 'datetime': case 'datetime-local': $result[ $field['name'] ]['type'] = 'text'; $result[ $field['name'] ]['input_type'] = $field['type']; $result[ $field['name'] ]['autocomplete'] = 'off'; $field['is_timestamp'] = ! empty( $field['is_timestamp'] ) ? $field['is_timestamp'] : false; $field['is_timestamp'] = filter_var( $field['is_timestamp'], FILTER_VALIDATE_BOOLEAN ); if ( $field['is_timestamp'] ) { $result[ $field['name'] ]['is_timestamp'] = true; } if ( ! $date_assets_added ) { add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_date_assets' ) ); $date_assets_added = true; } break; case 'select': if ( empty( $field['options'] ) ) { $field['options'] = array(); } $prepared_options = $this->prepare_select_options( $field ); if ( ! empty( $prepared_options['options_callback'] ) && is_callable( $prepared_options['options_callback'] ) ) { $field['options_callback'] = $prepared_options['options_callback']; } $result[ $field['name'] ]['options'] = $prepared_options['options']; if ( ! empty( $prepared_options['default'] ) ) { $result[ $field['name'] ]['value'] = $prepared_options['default']; } if ( ! empty( $field['options_callback'] ) ) { $result[ $field['name'] ]['options_callback'] = $field['options_callback']; } $multiple = ! empty( $field['is_multiple'] ) ? $field['is_multiple'] : false; $multiple = filter_var( $multiple, FILTER_VALIDATE_BOOLEAN ); if ( $multiple ) { $result[ $field['name'] ]['multiple'] = true; } break; case 'checkbox': case 'checkbox-raw': if ( empty( $field['options'] ) ) { $field['options'] = array(); } $prepared_options = $this->prepare_select_options( $field ); if ( ! empty( $prepared_options['options_callback'] ) && is_callable( $prepared_options['options_callback'] ) ) { $field['options_callback'] = $prepared_options['options_callback']; } $result[ $field['name'] ]['options'] = $prepared_options['options']; if ( ! empty( $prepared_options['default'] ) ) { $result[ $field['name'] ]['value'] = $prepared_options['default']; } if ( ! empty( $field['options_callback'] ) ) { $result[ $field['name'] ]['options_callback'] = $field['options_callback']; } $field['is_array'] = ! empty( $field['is_array'] ) ? $field['is_array'] : false; $field['is_array'] = filter_var( $field['is_array'], FILTER_VALIDATE_BOOLEAN ); $result[ $field['name'] ]['is_array'] = $field['is_array']; if ( ! Jet_Engine_Tools::is_empty( $field, 'check_radio_layout' ) ) { $result[ $field['name'] ]['layout'] = $field['check_radio_layout']; } break; case 'radio': if ( empty( $field['options'] ) ) { $field['options'] = array(); } $prepared_options = $this->prepare_radio_options( $field['options'], $field ); if ( ! empty( $prepared_options['options_callback'] ) && is_callable( $prepared_options['options_callback'] ) ) { $field['options_callback'] = $prepared_options['options_callback']; } $result[ $field['name'] ]['options'] = $prepared_options['options']; if ( ! Jet_Engine_Tools::is_empty( $prepared_options['default'] ) ) { $result[ $field['name'] ]['value'] = $prepared_options['default']; } if ( ! empty( $field['options_callback'] ) ) { $result[ $field['name'] ]['options_callback'] = $field['options_callback']; } if ( ! Jet_Engine_Tools::is_empty( $field, 'check_radio_layout' ) ) { $result[ $field['name'] ]['layout'] = $field['check_radio_layout']; } break; case 'number': $result[ $field['name'] ]['type'] = 'stepper'; if ( ! Jet_Engine_Tools::is_empty( $field, 'min_value' ) ) { $result[ $field['name'] ]['min_value'] = $field['min_value']; } if ( ! Jet_Engine_Tools::is_empty( $field, 'max_value' ) ) { $result[ $field['name'] ]['max_value'] = $field['max_value']; } if ( ! Jet_Engine_Tools::is_empty( $field, 'step_value' ) ) { $result[ $field['name'] ]['step_value'] = $field['step_value']; } break; case 'switcher': $result[ $field['name'] ]['toggle'] = array( 'true_toggle' => esc_html__( 'On', 'jet-engine' ), 'false_toggle' => esc_html__( 'Off', 'jet-engine' ), ); // Set default value $result[ $field['name'] ]['value'] = false; break; case 'colorpicker': $alpha_mode = isset( $field['alpha_mode'] ) ? filter_var( $field['alpha_mode'], FILTER_VALIDATE_BOOLEAN ) : false; $result[ $field['name'] ]['alpha'] = $alpha_mode; break; case 'html': $result[ $field['name'] ]['element'] = 'html'; $result[ $field['name'] ]['html'] = isset( $field['html'] ) ? $field['html'] : ''; break; case 'hidden': $result[ $field['name'] ]['view_wrapping'] = false; break; default: $result[ $field['name'] ] = apply_filters( 'jet-engine/meta-fields/repeater/' . $field['type'] . '/args', $result[ $field['name'] ], $field, $this ); } $result[ $field['name'] ] = apply_filters( 'jet-engine/meta-fields/repeater/field/args', $result[ $field['name'] ], $field, $this ); } return $result; } public function prepare_radio_options( $options = array(), $field = array() ) { $result = array( 'options' => array(), 'default' => false, ); $options = $this->filter_options_list( $options, $field ); if ( empty( $options ) ) { return $result; } if ( is_callable( $options ) ) { $result['options_callback'] = $options; return $result; } foreach ( $options as $index => $option ) { if ( ! isset( $option['key'] ) || ! is_array( $option ) ) { $key = $index; $value = $option; } else { $key = $option['key']; $value = $option['value']; } $label = apply_filters( 'jet-engine/compatibility/translate-string', $value ); if ( $this->is_blocks() ) { $result['options'][] = array( 'value' => $key, 'label' => $label, ); } else { /** * Such format used due to radio control configuration which allows also pass * image source to use as visual radio choice. Could be implemented in the future */ $result['options'][ $key ] = array( 'label' => $label, ); } if ( ! empty( $option['is_checked'] ) ) { $result['default'] = $key; } } return $result; } /** * Prepare options for select * @return [type] [description] */ public function prepare_select_options( $field = array() ) { $result = array( 'options' => array(), 'default' => false, ); $options = $this->filter_options_list( [], $field ); if ( empty( $options ) ) { return $result; } if ( is_callable( $options ) ) { $result['options_callback'] = $options; return $result; } $check_is_array = false; if ( 'checkbox' === $field['type'] ) { $multiple = true; $check_is_array = ! empty( $field['is_array'] ) ? filter_var( $field['is_array'], FILTER_VALIDATE_BOOLEAN ) : false; } else { $multiple = ! empty( $field['is_multiple'] ) ? $field['is_multiple'] : false; $multiple = filter_var( $multiple, FILTER_VALIDATE_BOOLEAN ); } if ( $multiple ) { $result['default'] = array(); } if ( ! empty( $field['type'] ) && 'select' === $field['type'] && ! empty( $field['placeholder'] ) && ! $multiple ) { if ( $this->is_blocks() ) { $result['options'][] = array( 'value' => '', 'label' => $field['placeholder'] ); } else { $result['options'][''] = $field['placeholder']; } } foreach ( $options as $index => $option ) { if ( ! isset( $option['key'] ) || ! is_array( $option ) ) { $key = $index; $value = $option; } else { $key = $option['key']; $value = $option['value']; } /* Looks like this code not needed anymore, but keep commented just in case if ( $multiple && empty( $option['key'] ) ) { continue; } */ $key = apply_filters( 'jet-engine/compatibility/translate-string', $key ); $value = apply_filters( 'jet-engine/compatibility/translate-string', $value ); if ( $this->is_blocks() ) { $result['options'][] = array( 'value' => $key, 'label' => $value ); } else { $result['options'][ $key ] = $value; } if ( ! empty( $option['is_checked'] ) ) { if ( $multiple ) { if ( 'checkbox' === $field['type'] && ! $check_is_array ) { $result['default'][ $key ] = 'true'; } else { $result['default'][] = $key; } } else { $result['default'] = $key; } } } return $result; } /** * Prepare field conditions. * * @param array $field * @param array $all_fields * @return array */ public function prepare_field_conditions( $field = array(), $all_fields = array() ) { $result = array(); if ( empty( $field['conditions'] ) ) { return $result; } $result['__relation__'] = ! empty( $field['conditional_relation'] ) ? $field['conditional_relation'] : 'AND'; $result['__terms__'] = array(); foreach ( $field['conditions'] as $condition ) { if ( empty( $condition['field'] ) || empty( $condition['operator'] ) ) { continue; } $condition_field = $this->get_field_args_by_name( $condition['field'], $all_fields ); if ( empty( $condition_field['type'] ) ) { continue; } switch( $condition_field['type'] ) { case 'switcher': $value = ! empty( $condition['value'] ) ? $condition['value'] : false; $value = filter_var( $value, FILTER_VALIDATE_BOOLEAN ); break; case 'checkbox': case 'checkbox-raw': case 'radio': case 'select': if ( in_array( $condition['operator'], array( 'in', 'not_in' ) ) ) { $value = ! empty( $condition['values'] ) ? $condition['values'] : array(); } else { $value = ! empty( $condition['value'] ) ? $condition['value'] : ''; } break; default: $value = ! empty( $condition['value'] ) ? $condition['value'] : ''; if ( in_array( $condition['operator'], array( 'in', 'not_in' ) ) ) { $value = explode( ',', $value ); $value = array_map( 'trim', $value ); } } if ( in_array( $condition['operator'], array( 'empty', '!empty' ) ) ) { $value = ''; } $is_checkbox = ( 'checkbox' === $condition_field['type'] ); $is_multi_select = ( 'select' === $condition_field['type'] ) && ! empty( $condition_field['is_multiple'] ) && filter_var( $condition_field['is_multiple'], FILTER_VALIDATE_BOOLEAN ); switch( $condition['operator'] ) { case 'equal': $operator = '=='; if ( $is_checkbox || $is_multi_select ) { $operator = 'contains'; } break; case 'not_equal': $operator = '!='; if ( $is_checkbox || $is_multi_select ) { $operator = '!contains'; } break; case 'in': $operator = 'in'; if ( $is_checkbox || $is_multi_select ) { $operator = 'intersect'; } break; case 'not_in': $operator = '!in'; if ( $is_checkbox || $is_multi_select ) { $operator = '!intersect'; } break; case 'greater_than': $operator = '>'; break; case 'less_than': $operator = '<'; break; case 'chars_greater_than': $operator = 'length_greater'; break; case 'chars_less_than': $operator = 'length_less'; break; default: $operator = $condition['operator']; } $result['__terms__'][] = array( 'name' => $condition['field'], 'operator' => $operator, 'value' => $value ); } return $result; } /** * Return filtered options list * * @param array $options [description] * @param array $field [description] * @return [type] [description] */ public function filter_options_list( $options = array(), $field = array() ) { return apply_filters( 'jet-engine/meta-fields/field-options', $options, $field, $this ); } /** * Get field type by name. * * @param string $name * @return string|null */ public function get_field_type_by_name( $name ) { $list = wp_list_pluck( $this->meta_box, 'type', 'name' ); return isset( $list[ $name ] ) ? $list[ $name ] : null; } /** * Get field args by name. * * @param string $name * @param array $fields * @return string|null */ public function get_field_args_by_name( $name = null, $fields = array() ) { $names = wp_list_pluck( $fields, 'name' ); $list = array_combine( $names, $fields ); return isset( $list[ $name ] ) ? $list[ $name ] : null; } } }