<?php
if (!defined('ABSPATH')) {
exit;
}
if (!class_exists('acf_validation')) {
class acf_validation
{
function __construct()
{
$this->errors = array();
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);
}
function add_error($input, $message)
{
$this->errors[] = array('input' => $input, 'message' => $message);
}
function get_error($input)
{
if (empty($this->errors)) {
return false;
}
foreach ($this->errors as $error) {
if ($error['input'] === $input) {
return $error;
}
}
return false;
}
function get_errors()
{
if (empty($this->errors)) {
return false;
}
return $this->errors;
}
function reset_errors()
{
$this->errors = array();
}
function ajax_validate_save_post()
{
if (!acf_verify_ajax()) {
die;
}
$json = array('valid' => 1, 'errors' => 0);
if (acf_validate_save_post()) {
wp_send_json_success($json);
}
$json['valid'] = 0;
$json['errors'] = acf_get_validation_errors();
wp_send_json_success($json);
}
function acf_validate_save_post()
{
if (empty($_POST['acf'])) {
return;
}
acf_validate_values($_POST['acf'], 'acf');
}
}
acf()->validation = new acf_validation();
}
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();
}
function acf_validate_save_post($show_errors = false)
{
do_action('acf/validate_save_post');
$errors = acf_get_validation_errors();
if (!$errors) {
return true;
}
if ($show_errors) {
$message = '<h2>' . __('Validation failed', 'acf') . '</h2>';
$message .= '<ul>';
foreach ($errors as $error) {
$message .= '<li>' . $error['message'] . '</li>';
}
$message .= '</ul>';
wp_die($message, __('Validation failed', 'acf'));
}
return false;
}
function acf_validate_values($values, $input_prefix = '')
{
if (empty($values)) {
return;
}
foreach ($values as $key => $value) {
$field = acf_get_field($key);
$input = $input_prefix . '[' . $key . ']';
if (!$field) {
continue;
}
acf_validate_value($value, $field, $input);
}
}
function acf_validate_value($value, $field, $input)
{
$valid = true;
$message = sprintf(__('%s value is required', 'acf'), $field['label']);
if ($field['required']) {
if (empty($value) && !is_numeric($value)) {
$valid = false;
}
}
$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);
if (!empty($valid) && is_string($valid)) {
$message = $valid;
$valid = false;
}
if (!$valid) {
acf_add_validation_error($input, $message);
return false;
}
return true;
}