如何使用Add_Filter将一些额外的验证插入到主题选项的验证函数中?

时间:2012-12-04 作者:Andrew

我正在使用underscores (_s) WP主题作为我自己的主题选项的基础。如果我想将验证从底部函数插入到顶部函数的$输出数组中,该如何做?

目前,我似乎正在用验证替换整个阵列,而不是添加到其中。

// the default validation function looks like this
function theme_options_validate( $input ) {
    $output = array();

    // standard validation goes here. I would like to add the validation in the bottom function into here

    return apply_filters( \'theme_options_validate\', $output, $input );
}


// I want this function to make use of the apply_filters above so I can add to the validation without editing the top one
function add_validation( $input ) {

    $output[] = array(); // not sure about this, I thought I could add onto array using []

    // here I want to add some validation for a simple field named \'example\'
    if ( isset( $input[\'example\'] ) && !empty( $input[\'example\'] ) )
        $output[\'example\'] = wp_filter_nohtml_kses( $input[\'example\'] );

    // pretty sure I have to return $output
    return $output;
}
add_filter( \'theme_options_validate\', \'add_validation\' );

2 个回复
SO网友:s_ha_dum

您希望操作并返回与进入函数相同的输入。对你来说就是$input. 这就是过滤器的工作原理。

function add_validation( $input ) {
    // here I want to add some validation for a simple field named \'example\'
    if ( isset( $input[\'example\'] ) && !empty( $input[\'example\'] ) )
        $input[\'example\'] = wp_filter_nohtml_kses( $input[\'example\'] );
    return $input;
}
add_filter( \'theme_options_validate\', \'add_validation\' );
如果您返回的内容与开始的内容不同,那么您将覆盖过滤器之前的所有内容。如果你愿意,你可以这样做,只是要知道它可能会破坏东西。

SO网友:Andrew

从下划线开始apply_filters() 电话:

return apply_filters( \'theme_options_validate\', $output, $input );
这说明:

筛选器名称为theme_options_validate$output 内容$input 传递到验证函数的内容也可以传递到回调,因此,它的工作原理如下:

WordPress通行证$input, 基本上包含$_POST 数据从设置窗体发送到验证回调$input, 要对其进行清理/验证,验证回调将存储$input$output$output 通过theme_options_validate 筛选验证回调返回的筛选结果$output因此,当您编写回调以应用于theme_options_validate 过滤器,该回调接收并应返回$output. 也就是说:您正在返回对已处理数据的处理:

function example_filter_theme_options_validate( $output ) {
    // Do stuff to $output
    // return $output
    return $output;
}
add_filter( \'theme_options_validate\', \'example_filter_theme_options_validate\' );
如果你想对已经被操纵的数据进行更改,那就太好了;但是,如果要添加数据,则不能仅使用$output. 例如,如果您通过子主题添加了一个主题选项,则该选项将无法在默认验证回调中生存,因为该选项不会在回调中被列入白名单。该选项将位于$input, 但它不会出现$output.

在步骤中apply_filters() 电话:

return apply_filters( \'theme_options_validate\', $output, $input );
通过添加$input 作为一个附加参数,下划线可以有效地传递$input 任何想要使用它的回调。因此,与此相反:

function example_filter_theme_options_validate( $output ) {
    // Do stuff;
    // return $output
    return $output;
}
您的函数声明如下所示:

function example_filter_theme_options_validate( $output, $input ) {
    // Do stuff;
    // return $output
    return $output;
}
现在,您的函数可以访问这两个$output $input, 然后,您可以从$input, 然后将其添加到$output, 从而将其列入白名单。

请注意,必须通过修改add_filter() 电话:

add_filter( $filter, $callback, $priority, $parameters );
因为现在要传递两个变量,所以必须设置$parameters2 (默认值为1):

add_filter( \'theme_options_validate\', \'example_filter_theme_options_validate\', 10, 2 );
总而言之:

// this works

function add_validation( $output, $input ) {
    if ( isset( $input[\'example\'] ) && !empty( $input[\'example\'] ) )
        $output[\'example\'] = wp_filter_nohtml_kses( $input[\'example\'] );
        return $output;
    }
add_filter( \'theme_options_validate\', \'add_validation\', 10, 2 );

结束

相关推荐

Add_Filters()和Apply_Filter()有什么作用?

我有点困惑,为什么这不起作用-尽管必须说,我不太确定是什么apply_filters() 和add_filter 正在做,所以任何一般性的提示都会很好!我想要一个查询,在一个帖子页面上显示之前的五篇帖子。我正在发送当前帖子的日期,并希望应用一个过滤器,过滤出早于此的帖子。function sw_filter_posts_before( $where = \'\', $date) { $where .= \" AND post_date < \'\" . $date . \"