Validate an option array

时间:2012-06-21 作者:Ünsal Korkmaz

我们使用默认的WordPressregister_setting() 函数验证主题选项。此调用,例如:

register_setting( \'options-group\', \'option1\', \'intval\' );
将验证是否$option1 是一个整数。

我可以使用什么传递选项数组来验证数组的每个成员?

例如:

$options = array(
    \'options1\' => 4,              // intval
    \'options2\' => \'127.0.0.1\',    // IP address
    \'options3\' => \'[email protected]\' // Email address
);

2 个回复
最合适的回答,由SO网友:EAMann 整理而成

您需要做的是构建自己的数据验证功能。Ozh写道a great tutorial 关于这件事,我想说的是。。。

假设调用了选项数组$my_options 它包含三个字段,\'text\', \'age\', 和\'isauthorized\'.

您仍然可以使用相同的方式进行注册:

register_setting( \'my_setting\', \'my_options\', \'my_validation_function\' );
但是您看到我们如何为第三个参数使用自定义回调了吗?现在我们只需要定义自定义函数:

function my_validation_function( $input ) {
    // Validate age as an integer
    $input[\'age\'] = intval( $input[\'age\'] );

    // Strip HTML tags from text to make it safe
    $input[\'text\'] = wp_filter_nohtml_kses( $input[\'text\'] );

    // Make sure isauthorized is only true or false (0 or 1)
    $input[\'isauthorized\'] = ( $input[\'isauthorized\'] == 1 ? 1 : 0 );

    return $input;
}
<小时>

Alternatively

如果您想使验证功能更灵活一些,可以使用WordPress的内置过滤器,以避免重复代码。您仍然以相同的方式注册验证:

register_setting( \'my_setting\', \'my_options\', \'my_validation_function\' );
但不是检查验证函数中数组的每个元素,而是遍历数组并委托给过滤器:

function my_validation_function( $input ) {
    foreach( $input as $key => $value ) {
        $input[$key] = apply_filters( \'my_validation_\' . $key, $value );
    }

    return $input
}
现在,您可以挂接所需的任何验证逻辑:

add_filter( \'my_validation_age\', \'validate_numeric\' );
function validate_numeric( $numeric ) {
    return intval( $numeric );
}

add_filter( \'my_validation_text\', \'validate_text\' );
function validate_text( $text ) {
    return wp_filter_nohtml_kses( $text );
}

add_filter( \'my_validation_isauthorized\', \'validate_bool\' );
function validate_bool( $bool ) {
    return $bool == 1 ? 1 : 0;
}
如果未为某个选项添加筛选器,则该选项的值将保持不变。过滤器也是您希望使用返回内容的函数的方式,您可以添加任意数量的内容。。。或将筛选器附加到任何字段。

假设数组中有两个数字字段-agenumberChildren. 而不是创建一个额外的验证函数来处理numberChildren 字段,您只需将其添加到过滤器:

add_filter( \'my_validation_numberChildren\', \'validate_numeric\' );

SO网友:Ünsal Korkmaz

似乎“数组中每个选项的函数用法不同”的解决方案与我的梦想不同,但我认为这应该可行:

register_setting( \'my_setting\', \'my_options\', \'my_validation_function\' );

function my_validation_function( $input ) {
    foreach ($input as $option=>$value){
        do_action(\'my_validation_\'.$option, $option, $value);
    }
    return $input;
}
然后我可以对每个选项验证使用自定义函数,如下所示:

add_action(\'my_validation_age\', \'my_validation_function_for_age\', 10, 2);
function my_validation_function_for_age($option, $value) {
    $input[$option] = intval( $value );
}

add_action(\'my_validation_text\', \'my_validation_function_for_text\', 10, 2);
function my_validation_function_for_text($option, $value) {
    $input[$option] = wp_filter_nohtml_kses( $value );
}

add_action(\'my_validation_isauthorized\', \'my_validation_function_for_isauthorized\', 10, 2);
function my_validation_function_for_isauthorized($option, $value) {
    $input[$option] = ( $value == 1 ? 1 : 0 );
}
在这里为未来的访客写作。接受埃曼的解决方案。

结束

相关推荐

Comment form validation

如何设置注释字段的验证规则?我更改了评论者姓名/电子邮件/主页onmouseover和onblur的值(我使用它而不是标签-因此如果字段为空,它会显示“您的电子邮件”、“您的主页”等)。问题是,在提交时,它会在主页字段中提交此文本(因为它没有验证,而不像电子邮件字段,如果您输入了除[email protected]).如何验证主页字段?