Расширенная Проверка Пользовательских Полей
Есть ли способ использовать пользовательскую проверку в расширенном пользовательском поле? Например, я мог бы не хотеть, чтобы текстовое поле имело значение, начинающееся с определенного префикса, или я мог бы хотеть, чтобы числовое поле имело значение больше, чем "x". Я также мог бы захотеть запустить регулярное выражение для значения и вернуть ошибку, если оно не совпадает.
4 answers
Теперь есть, я только что опубликовал плагин, который я написал, чтобы выполнить проверку расширенных пользовательских полей в репозитории Wordpress. Это позволяет выполнять проверку на стороне сервера с использованием PHP-кода или регулярного выражения, замаскированных входных данных jQuery, а также уникальных настроек значений.
Http://wordpress.org/extend/plugins/validated-field-for-acf/
Я сделал это, подключившись к 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.
Вы можете использовать этот код
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;
}
Результат Документация