web/wp-content/plugins/acf-extended/includes/fields-settings/validation.php (534 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } if(!class_exists('acfe_field_validation')): class acfe_field_validation{ /** * construct */ function __construct(){ // actions add_action('acf/field_group/admin_head', array($this, 'load')); add_action('wp_ajax_acf/field_group/render_field_settings', array($this, 'load_ajax'), 5); // filters add_filter('acf/validate_value', array($this, 'validate_value'), 99, 4); } /** * load */ function load(){ if(!acf_is_filter_enabled('acfe/field_group/advanced')){ return; } $this->prepare_settings(); $this->add_settings(); } /** * load_ajax */ function load_ajax(){ $post_id = acf_maybe_get_POST('post_id'); $field_group = acf_get_field_group($post_id); if(!$field_group){ return; } if(!acf_maybe_get($field_group, 'acfe_form')){ return; } $this->add_settings(); } /** * add_settings */ function add_settings(){ // exclude $exclude = array('accordion', 'acfe_button', 'acfe_column', 'acfe_dynamic_render', 'clone', 'flexible_content', 'group', 'message', 'repeater', 'tab'); // get fields types foreach(acf_get_field_types_info() as $field){ // field type $field_type = $field['name']; // check if(in_array($field_type, $exclude)){ continue; } add_action("acf/render_field_settings/type={$field_type}", array($this, 'render_field_settings'), 99); } } /** * render_field_settings * * @param $field */ function render_field_settings($field){ $functions = array( 'General' => array( 'value' => 'If value', 'strlen' => 'If value length - strlen(value)', 'count' => 'If count value - count(value)', ), 'Exists' => array( 'email_exists' => 'If email exists - email_exists(value)', 'post_type_exists' => 'If post type exists - post_type_exists(value)', 'taxonomy_exists' => 'If taxonomy exists - taxonomy_exists(value)', 'term_exists' => 'If term exists - term_exists(value)', 'username_exists' => 'If username exists - username_exists(value)', ), 'Is' => array( 'is_email' => 'If is email - is_email(value)', 'is_user_logged_in' => 'If is user logged in - is_user_logged_in()', 'is_array' => 'If is array - is_array(value)', 'is_string' => 'If is string - is_string(value)', 'is_numeric' => 'If is numeric - is_numeric(value)', ), 'Post' => array( 'get_post_type' => 'If get post type - get_post_type(value)', 'get_post_by_id' => 'If post id exists - get_post_by_id(value)', 'get_post_by_slug' => 'If post slug exists - get_post_by_slug(value)', 'get_post_by_title' => 'If post title exists - get_post_by_title(value)', ), 'Sanitize' => array( 'sanitize_email' => 'If sanitize email - sanitize_email(value)', 'sanitize_file_name' => 'If sanitize file name - sanitize_file_name(value)', 'sanitize_html_class' => 'If sanitize html class - sanitize_html_class(value)', 'sanitize_key' => 'If sanitize key - sanitize_key(value)', 'sanitize_meta' => 'If sanitize meta - sanitize_meta(value)', 'sanitize_mime_type' => 'If sanitize mime type - sanitize_mime_type(value)', 'sanitize_option' => 'If sanitize option - sanitize_option(value)', 'sanitize_text_field' => 'If sanitize text field - sanitize_text_field(value)', 'sanitize_title' => 'If sanitize title - sanitize_title(value)', 'sanitize_user' => 'If sanitize user - sanitize_user(value)', ), 'User' => array( 'get_user_by_id' => 'If get user by id - get_user_by(\'id\', value)', 'get_user_by_slug' => 'If get user by slug - get_user_by(\'slug\', value)', 'get_user_by_email' => 'If get user by email - get_user_by(\'email\', value)', 'get_user_by_login' => 'If get user by login - get_user_by(\'login\', value)', ) ); $choices = apply_filters('acfe/validate/functions', $functions, $field); if(empty($choices)){ return; } // settings acf_render_field_setting($field, array( 'label' => __('Advanced Validation'), 'name' => 'acfe_validate', 'key' => 'acfe_validate', 'instructions' => __('Validate value against rules'), 'type' => 'repeater', 'button_label' => __('Add validation'), 'required' => false, 'layout' => 'row', 'wrapper' => array( 'data-enable-switch' => true ), 'sub_fields' => array( array( 'label' => 'Location', 'name' => 'acfe_validate_location', 'key' => 'acfe_validate_location', 'type' => 'select', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'choices' => array( 'admin' => 'Administration', 'front' => 'Front-end', ), 'allow_null' => true, 'multiple' => 0, 'ui' => 0, 'return_format' => 'value', 'ajax' => 0, 'placeholder' => 'Everywhere', ), array( 'label' => __('Rules'), 'name' => 'acfe_validate_rules_and', 'key' => 'acfe_validate_rules_and', 'instructions' => '', 'type' => 'repeater', 'button_label' => __('+ AND'), 'required' => false, 'layout' => 'table', 'sub_fields' => array( array( 'ID' => false, 'label' => 'Function', 'name' => 'acfe_validate_function', 'key' => 'acfe_validate_function', 'prefix' => '', '_name' => '', '_prepare' => '', 'type' => 'select', 'choices' => $choices, 'instructions' => false, 'required' => false, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), ), array( 'ID' => false, 'label' => 'Operator / Value', 'name' => 'acfe_validate_operator', 'key' => 'acfe_validate_operator', 'prefix' => '', '_name' => '', '_prepare' => '', 'type' => 'select', 'choices' => array( 'Operators' => array( '==' => '==', '!=' => '!=', '>' => '>', '>=' => '>=', '<' => '<', '<=' => '<=', 'contains' => 'Contains', '!contains' => 'Doesn\'t contain', 'starts' => 'Starts with', '!starts' => 'Doesn\'t start with', 'ends' => 'Ends with', '!ends' => 'Doesn\'t end with', 'regex' => 'Matches regex', '!regex' => 'Doesn\'t matches regex', ), 'Values' => array( 'true' => '== true', '!true' => '!= true', 'false' => '== false', '!false'=> '!= false', 'null' => '== null', '!null' => '!= null', 'empty' => '== (empty)', '!empty'=> '!= (empty)', ) ), 'instructions' => false, 'required' => false, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), ), array( 'ID' => false, 'label' => 'Value', 'name' => 'acfe_validate_match', 'key' => 'acfe_validate_match', 'prefix' => '', '_name' => '', '_prepare' => '', 'type' => 'text', 'instructions' => false, 'placeholder' => '', 'required' => false, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'conditional_logic' => array( array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '==', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '!=', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '>', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '>=', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '<', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '<=', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => 'contains', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '!contains', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => 'starts', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '!starts', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => 'ends', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '!ends', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => 'regex', ) ), array( array( 'field' => 'acfe_validate_operator', 'operator' => '==', 'value' => '!regex', ) ), ) ), ) ), array( 'label' => 'Error', 'name' => 'acfe_validate_error', 'key' => 'acfe_validate_error', 'prefix' => '', '_name' => '', '_prepare' => '', 'type' => 'text', 'instructions' => false, 'required' => false, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), ), ) )); } /** * validate_value * * @param $valid * @param $value * @param $field * @param $input * * @return mixed */ function validate_value($valid, $value, $field, $input){ if(!$valid){ return $valid; } if(!acf_maybe_get($field, 'acfe_validate')){ return $valid; } foreach($field['acfe_validate'] as $k => $rule){ // fix possible acf clone index if($k === 'acfcloneindex'){ continue; } // screen $screen = isset($rule['acfe_validate_location']) ? $rule['acfe_validate_location'] : ''; $screen_allow = false; // screen: all if(empty($screen)){ $screen_allow = true; } // screen: admin elseif($screen === 'admin' && acfe_is_admin()){ $screen_allow = true; } // screen: front elseif($screen === 'front' && acfe_is_front()){ $screen_allow = true; } if(!$screen_allow){ continue; } if(!acf_maybe_get($rule, 'acfe_validate_rules_and')){ continue; } $rule_match = true; foreach($rule['acfe_validate_rules_and'] as $k => $function){ if(!$rule_match){ break; } $rule_match = false; // check filters $filters = array( 'acfe/validate/function/' . $function['acfe_validate_function'] . '/key=' . $field['key'], 'acfe/validate/function/' . $function['acfe_validate_function'] . '/name=' . $field['name'], 'acfe/validate/function/' . $function['acfe_validate_function'] . '/type=' . $field['type'], 'acfe/validate/function/' . $function['acfe_validate_function'], ); $filter_call = false; foreach($filters as $filter){ if(has_filter($filter)){ $filter_call = $filter; } } // filter if($filter_call){ $result = apply_filters($filter_call, false, $value, $field); } // class elseif(is_callable(array($this, $function['acfe_validate_function']))){ $result = call_user_func(array($this, $function['acfe_validate_function']), $value); } // function elseif(is_callable($function['acfe_validate_function'])){ $result = call_user_func($function['acfe_validate_function'], $value); } // nothing else{ continue; } // vars $operator = $function['acfe_validate_operator']; $match = acf_maybe_get($function, 'acfe_validate_match'); if($operator === '==' && $result == $match){ $rule_match = true; } elseif($operator === '!=' && $result != $match){ $rule_match = true; } elseif($operator === '>' && $result > $match){ $rule_match = true; } elseif($operator === '>=' && $result >= $match){ $rule_match = true; } elseif($operator === '<' && $result < $match){ $rule_match = true; } elseif($operator === '<=' && $result <= $match){ $rule_match = true; } elseif($operator === 'contains' && stripos($result, $match) !== false){ $rule_match = true; } elseif($operator === '!contains' && stripos($result, $match) === false){ $rule_match = true; } elseif($operator === 'starts' && stripos($result, $match) === 0){ $rule_match = true; } elseif($operator === '!starts' && stripos($result, $match) !== 0){ $rule_match = true; } elseif($operator === 'ends' && acfe_ends_with($result, $match)){ $rule_match = true; } elseif($operator === '!ends' && !acfe_ends_with($result, $match)){ $rule_match = true; } elseif($operator === 'regex' && preg_match('/' . $match . '/u', $result)){ $rule_match = true; } elseif($operator === '!regex' && !preg_match('/' . $match . '/u', $result)){ $rule_match = true; } elseif($operator === 'true' && $result === true){ $rule_match = true; } elseif($operator === '!true' && $result !== true){ $rule_match = true; } elseif($operator === 'false' && $result === false){ $rule_match = true; } elseif($operator === '!false' && $result !== false){ $rule_match = true; } elseif($operator === 'null' && $result === null){ $rule_match = true; } elseif($operator === '!null' && $result !== null){ $rule_match = true; } elseif($operator === 'empty' && empty($result)){ $rule_match = true; } elseif($operator === '!empty' && !empty($result)){ $rule_match = true; } } // rrror $error = $rule['acfe_validate_error']; if($rule_match && !empty($error)){ $valid = $error; } if(!$valid || is_string($valid)){ break; } } return $valid; } /** * get_user_by_id * * @param $value * * @return false|WP_User */ function get_user_by_id($value){ return get_user_by('id', $value); } /** * get_user_by_slug * * @param $value * * @return false|WP_User */ function get_user_by_slug($value){ return get_user_by('slug', $value); } /** * get_user_by_email * * @param $value * * @return false|WP_User */ function get_user_by_email($value){ return get_user_by('email', $value); } /** * get_user_by_login * * @param $value * * @return false|WP_User */ function get_user_by_login($value){ return get_user_by('login', $value); } /** * value * * @param $value * * @return mixed */ function value($value){ return $value; } /** * get_post_by_id * * @param $value * * @return bool */ function get_post_by_id($value){ $get_post = get_post($value); if(!$get_post || is_wp_error($get_post)){ return false; } return true; } /** * get_post_by_slug * * @param $value * * @return bool */ function get_post_by_slug($value){ $get_posts = get_posts(array( 'name' => $value, 'post_type' => 'any', 'post_status' => 'any', 'posts_per_page' => 1 )); if(empty($get_posts)){ return false; } return true; } /** * get_post_by_title * * @param $value * * @return bool */ function get_post_by_title($value){ $get_posts = get_posts(array( 's' => $value, 'post_type' => 'any', 'post_status' => 'any', 'posts_per_page' => 1 )); if(empty($get_posts)){ return false; } return true; } /** * prepare_settings */ function prepare_settings(){ $fields = array('acfe_validate', 'acfe_validate_location', 'acfe_validate_rules_and', 'acfe_validate_function', 'acfe_validate_operator', 'acfe_validate_match', 'acfe_validate_error'); foreach($fields as $name){ add_filter("acf/prepare_field/name={$name}", function($field){ $field['prefix'] = str_replace('row-', '', $field['prefix']); $field['name'] = str_replace('row-', '', $field['name']); return $field; }); } } } // initialize new acfe_field_validation(); endif;