<?php if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly if( ! class_exists('acf_validation') ) : class acf_validation { /* * __construct * * This function will setup the class functionality * * @type function * @date 5/03/2014 * @since 5.0.0 * * @param n/a * @return n/a */ function __construct() { // vars $this->errors = array(); // ajax add_action('wp_ajax_acf/validate_save_post', array($this, 'ajax_validate_save_post')); add_action('wp_ajax_nopriv_acf/validate_save_post', array($this, 'ajax_validate_save_post')); add_action('acf/validate_save_post', array($this, 'acf_validate_save_post'), 5); } /* * add_error * * This function will add an error message for a field * * @type function * @date 25/11/2013 * @since 5.0.0 * * @param $input (string) name attribute of DOM elmenet * @param $message (string) error message * @return $post_id (int) */ function add_error( $input, $message ) { // add to array $this->errors[] = array( 'input' => $input, 'message' => $message ); } /* * get_error * * This function will return an error for a given input * * @type function * @date 5/03/2016 * @since 5.3.2 * * @param $input (string) name attribute of DOM elmenet * @return (mixed) */ function get_error( $input ) { // bail early if no errors if( empty($this->errors) ) return false; // loop foreach( $this->errors as $error ) { if( $error['input'] === $input ) return $error; } // return return false; } /* * get_errors * * This function will return validation errors * * @type function * @date 25/11/2013 * @since 5.0.0 * * @param n/a * @return (array|boolean) */ function get_errors() { // bail early if no errors if( empty($this->errors) ) return false; // return return $this->errors; } /* * reset_errors * * This function will remove all errors * * @type function * @date 4/03/2016 * @since 5.3.2 * * @param n/a * @return n/a */ function reset_errors() { $this->errors = array(); } /* * ajax_validate_save_post * * This function will validate the $_POST data via AJAX * * @type function * @date 27/10/2014 * @since 5.0.9 * * @param n/a * @return n/a */ function ajax_validate_save_post() { // validate if( !acf_verify_ajax() ) die(); // vars $json = array( 'valid' => 1, 'errors' => 0 ); // success if( acf_validate_save_post() ) { wp_send_json_success($json); } // update vars $json['valid'] = 0; $json['errors'] = acf_get_validation_errors(); // return wp_send_json_success($json); } /* * acf_validate_save_post * * This function will loop over $_POST data and validate * * @type function * @date 7/09/2016 * @since 5.4.0 * * @param n/a * @return n/a */ function acf_validate_save_post() { // bail early if no $_POST if( empty($_POST['acf']) ) return; // validate acf_validate_values( $_POST['acf'], 'acf' ); } } // initialize acf()->validation = new acf_validation(); endif; // class_exists check /* * Public functions * * alias of acf()->validation->function() * * @type function * @date 6/10/13 * @since 5.0.0 * * @param n/a * @return n/a */ function acf_add_validation_error( $input, $message = '' ) { return acf()->validation->add_error( $input, $message ); } function acf_get_validation_errors() { return acf()->validation->get_errors(); } function acf_get_validation_error() { return acf()->validation->get_error( $input ); } function acf_reset_validation_errors() { return acf()->validation->reset_errors(); } /* * acf_validate_save_post * * This function will validate $_POST data and add errors * * @type function * @date 25/11/2013 * @since 5.0.0 * * @param $show_errors (boolean) if true, errors will be shown via a wp_die screen * @return (boolean) */ function acf_validate_save_post( $show_errors = false ) { // action do_action('acf/validate_save_post'); // vars $errors = acf_get_validation_errors(); // bail ealry if no errors if( !$errors ) return true; // show errors if( $show_errors ) { $message = '<h2>' . __('Validation failed', 'acf') . '</h2>'; $message .= '<ul>'; foreach( $errors as $error ) { $message .= '<li>' . $error['message'] . '</li>'; } $message .= '</ul>'; // die wp_die( $message, __('Validation failed', 'acf') ); } // return return false; } /* * acf_validate_values * * This function will validate an array of field values * * @type function * @date 6/10/13 * @since 5.0.0 * * @param values (array) * @param $input_prefix (string) * @return n/a */ function acf_validate_values( $values, $input_prefix = '' ) { // bail early if empty if( empty($values) ) return; // loop foreach( $values as $key => $value ) { // vars $field = acf_get_field( $key ); $input = $input_prefix . '[' . $key . ']'; // bail early if not found if( !$field ) continue; // validate acf_validate_value( $value, $field, $input ); } } /* * acf_validate_value * * This function will validate a field's value * * @type function * @date 6/10/13 * @since 5.0.0 * * @param n/a * @return n/a */ function acf_validate_value( $value, $field, $input ) { // vars $valid = true; $message = sprintf( __( '%s value is required', 'acf' ), $field['label'] ); // valid if( $field['required'] ) { // valid is set to false if the value is empty, but allow 0 as a valid value if( empty($value) && !is_numeric($value) ) { $valid = false; } } /** * Filters whether the value is valid. * * @date 28/09/13 * @since 5.0.0 * * @param bool $valid The valid status. Return a string to display a custom error message. * @param mixed $value The value. * @param array $field The field array. * @param string $input The input element's name attribute. */ $valid = apply_filters( "acf/validate_value/type={$field['type']}", $valid, $value, $field, $input ); $valid = apply_filters( "acf/validate_value/name={$field['_name']}", $valid, $value, $field, $input ); $valid = apply_filters( "acf/validate_value/key={$field['key']}", $valid, $value, $field, $input ); $valid = apply_filters( "acf/validate_value", $valid, $value, $field, $input ); // allow $valid to be a custom error message if( !empty($valid) && is_string($valid) ) { $message = $valid; $valid = false; } if( !$valid ) { acf_add_validation_error( $input, $message ); return false; } // return return true; }