Расширенная Проверка Пользовательских Полей


Есть ли способ использовать пользовательскую проверку в расширенном пользовательском поле? Например, я мог бы не хотеть, чтобы текстовое поле имело значение, начинающееся с определенного префикса, или я мог бы хотеть, чтобы числовое поле имело значение больше, чем "x". Я также мог бы захотеть запустить регулярное выражение для значения и вернуть ошибку, если оно не совпадает.

Author: user1750, 2012-09-26

4 answers

Теперь есть, я только что опубликовал плагин, который я написал, чтобы выполнить проверку расширенных пользовательских полей в репозитории Wordpress. Это позволяет выполнять проверку на стороне сервера с использованием PHP-кода или регулярного выражения, замаскированных входных данных jQuery, а также уникальных настроек значений.

Http://wordpress.org/extend/plugins/validated-field-for-acf/

 3
Author: doublesharp, 2012-09-27 03:58:24

Я сделал это, подключившись к acf/pre_save_post. Используя это, вы можете проверить данные $_POST. И если вам что-то не нравится, вы можете изменить $post_id на "ошибка", когда вернете его. Это предотвратит обработку формы, так как post_id неверен. Вы также можете подключиться к acf/save_post, чтобы отключить "возврат" или обновить сообщения из формы.

Все это немного сложно, но я постараюсь привести упрощенный пример того, что я использовал.

$submitted_fields = '';
$validation_errors = '';

add_filter( 'acf/pre_save_post', 'custom_validation' );
function custom_validation( $post_id )
{
    // Load the fields from $_POST
    if ( empty($_POST['fields']) || ! is_array($_POST['fields']) )
    {
        $validation_errors['empty'] = "One or more fields below are required";
    }
    else
    {
        foreach( $_POST['fields'] as $k => $v )
        {
            // get field
            $f = apply_filters('acf/load_field', false, $k );
            $f['value'] = $v;
            $submitted_fields[$f['name']] = $f;
        }
    }

    // Test stuff...
    if ( empty($submitted_fields['foo']) || 'bar' != $submitted_fields['foo'] )
    {
        $validation_errors['foo'] = "Foo did not equal bar";
    }

    // If there are errors, output them, keep the form from processing, and remove any redirect
    if ( $validation_errors )
    {
        // Output the messges area on the form
        add_filter( 'acf/get_post_id', array(__CLASS__, 'add_error') );
        // Turn the post_id into an error
        $post_id = 'error';
        // Add submitted values to fields
        add_action('acf/create_fields', array(__CLASS__, 'acf_create_fields'), 10, 2 );
    }
    else
    {
        // Do something... do nothing... ?
    }

    // return the new ID
    return $post_id;
}

    function acf_create_fields( $fields, $post_id )
    {
        foreach ( $fields as &$field )
        {
            if ( array_key_exists($field['name'], $submitted_fields) )
                $field['value'] = $submitted_fields[$field['name']];
        }
        return $fields;
    }

    function add_error()
    {
        echo '<div id="message" class="error">';
        foreach ( $validation_errors as $key => $error )
        {
            echo '<p class="' . $key . '">' . $error . '</p>';
        }
        echo '</div>';
    }

add_action('acf/save_post', 'custom_handle_error', 1);
function custom_handle_error( $post_id )
{
    if ( 'error' == $post_id )
    {
        unset($_POST['return']);
    }
}

Это не позволяет выделите поля, которые вернули ошибку, но на самом деле вы могли бы сделать это довольно легко с помощью javascript, используя классы из ошибок в #message div.

 7
Author: Jake, 2013-08-27 01:15:58

Начиная с версии 5.0, вы можете использовать фильтр acf/validate_value - см. Официальную документацию .

 0
Author: That Brazilian Guy, 2018-07-09 20:17:17

Вы можете использовать этот код

add_filter('acf/validate_value/name=validate_this_image', 'my_acf_validate_value', 10, 4);

function my_acf_validate_value( $valid, $value, $field, $input ){

// bail early if value is already invalid
if( !$valid ) {

    return $valid;

}


// load image data
$data = wp_get_attachment_image_src( $value, 'full' );
$width = $data[1];
$height = $data[2];

if( $width < 960 ) {

    $valid = 'Image must be at least 960px wide';

}


// return
return $valid;


}

Результат enter image description here Документация

 0
Author: Wael Mahmoud, 2019-08-29 17:56:50