从多个功能中提取筛选器

时间:2016-10-15 作者:Abhik

我需要将数组从多个函数传递给一个函数。我正在使用apply_filters_ref_array() 为此。问题是它只接受从最高优先级callbak传递的数组。以下是场景:

//First Callbak
function first_callback() {

    $html[\'abc\'] = \'xyz\';

    return $html;

}
add_filter( \'process_args\', \'first_callback\' );


//Second Callbak
function second_callback() {

    $html[\'def\'] = \'uvw\';

    return $html;

}
add_filter( \'process_args\', \'second_callback\' );


//Third Callbak
function third_callback() {

    $html[\'ghi\'] = \'rst\';

    return $html;

}
add_filter( \'process_args\', \'third_callback\' );


//Callbak that processes $args
function process_args( $args ) {

    $args = apply_filters_ref_array( \'process_args\', $args );

    print_r( $args );
}
现在print_r( $args ); 打印上一个函数传递的数组。

Array ( 
    [ghi] => rst
)
我需要将其打印为:

Array (
    [abc] => xyz
    [def] => uvw
    [ghi] => rst
)
我该怎么做?

谢谢

EDIT:
我正在使用的当前代码

function pwpus_input_field_text( $field, $inputs, $html=array() ) {

    $html[\'text\'] = \'<input id="\'.$field[\'id\'].\'" type="text" class="pwpus-text-input pwpus-input-size-\'.$field[\'size\'].\'" name="\'.$field[\'name\'].\'" value="\'.$field[\'default\'].\'">\';

    return $html;

}
add_filter( \'pwpus_input_fields\', \'pwpus_input_field_text\' );

function pwpus_input_field_tel( $field, $inputs, $html=array() ) {

    $html[\'tel\'] = \'<input id="\'.$field[\'id\'].\'" type="tel" class="pwpus-text-input pwpus-input-size-\'.$field[\'size\'].\'" name="\'.$field[\'name\'].\'" value="\'.$field[\'default\'].\'">\';

    return $html;

}
add_filter( \'pwpus_input_fields\', \'pwpus_input_field_tel\' );

function pwpus_input_field_email( $field, $inputs, $html=array() ) {

    $html[\'email\'] = \'<input id="\'.$field[\'id\'].\'" type="email" class="pwpus-text-input pwpus-input-size-\'.$field[\'size\'].\'" name="\'.$field[\'name\'].\'" value="\'.$field[\'default\'].\'">\';

    return $html;

}
add_filter( \'pwpus_input_fields\', \'pwpus_input_field_email\' );


function pwpus_shortcode_form( $fields, $inputs=array() ) {

    $inputs = apply_filters_ref_array( \'pwpus_input_fields\', $inputs );
    //$inputs = do_action( \'pwpus_input_fields\' );


    if ( array_key_exists( \'class\', $fields ) && $fields[\'class\'] != \'\' ) {
        $class = \' \' . $fields[\'class\'];
    } else {
        $class = \'\';
    }

    if ( array_key_exists( \'callback\', $fields ) && $fields[\'callback\'] != \'\' ) {
        $callback = $fields[\'callback\'];
    } else {
        $callback = \'pwusp_nocallback\';
    }

    $html = \'<form id="pwpus-shortcode-form" class="pwpus-shortcode-form\' . $class . \'" action="pwpus_parse_scform">\';
        $html .= \'<table class="pwpus-shortcode-form-table">\';

        if ( array_key_exists( \'fields\', $fields ) && is_array($fields[\'fields\']) ) {

            foreach ( $fields[\'fields\'] as $field ) {

                //$html .= pwpus_fields( $field );

                $html .= \'<tr id="field-\'. $field[\'id\'] .\'"><td><label for="\'. $field[\'name\'] .\'">\'. $field[\'label\'] .\'</label></td><td>:</td><td>\' . $inputs[ $field[\'type\'] ]. \'<span class="pwpus-field-desc">\'. $field[\'desc\'] .\'</span></td></tr>\';

            }

        }

        $html .= \'<input type="hidden" name="callback" value="\'. $callback .\'">\';
        $html .= wp_nonce_field( \'pwpus-shortcode-nonce\', \'pwpus-shortcode-nonce\', false );
        $html .= \'</table>\';
        $html .= \'<div class="pwpus-form-buttons"><button type="submit" id="pwpus-scform-submit" class="pwpus-scform-submit">\' . __( \'Generate Shortcode\', \'purewp\' ) . \'</button><button type="reset" id="pwpus-scform-reset" class="pwpus-scform-reset">\' . __( \'Reset\', \'purewp\' ) . \'</button></div>\';
    $html .= \'</form>\';

    //return $html;

    print_r( $inputs );

}

2 个回复
SO网友:birgire

您忘记传递过滤器回调的输入参数,如:

function first_callback( $html = [] ) {

    $html[\'abc\'] = \'xyz\';

    return $html;

}
add_filter( \'process_args\', \'first_callback\' );
我们更换的地方=> 对于=.

否则,每次只需替换筛选值!

Update:

我在你的更新代码中看到你有,例如。

function pwpus_input_field_email( $field, $inputs, $html=array() ) {

    $html[\'email\'] = \'<input 
        id="\'.$field[\'id\'].\'" 
        type="email" 
        class="pwpus-text-input pwpus-input-size-\'.$field[\'size\'].\'" 
        name="\'.$field[\'name\'].\'" 
        value="\'.$field[\'default\'].\'">\';

    return $html;

}
add_filter( \'pwpus_input_fields\', \'pwpus_input_field_email\' );
这里出现的问题很少:

一般来说,还有其他方法可以实现这一点吗first 过滤器回调中的输入参数$html 不需要变量$inputs 而不是$html 然后改用它$inputs 具有apply_filters_ref_array 在过滤器回调中apply_filters 而不是apply_filters_ref_array 避免这种混淆apply_filters, 然后,我们必须使用正确的优先级和输入参数数量注册过滤器回调esc_attr() 构造输入标记的属性时$field 应调用$fields 检查位置,例如非空$fields[\'email\'][\'id\'] 在使用之前,请等希望对您有所帮助!

SO网友:Benoti

您可以返回$html[\'abc\',并将$html作为参数添加到每个函数和过滤器中。函数示例:

function second_callback($html){
     $html[\'def\']= \'uvw\';

     return $html[\'def\'];
}

相关推荐

如何通过函数.php使applyFilters函数返回FALSE

因此,插件中有以下代码:if( window.wp.hooks.applyFilters( \'filtername\', true, $(this) ) ) { //do something } 在不编辑插件文件但使用函数的情况下,如何使上述语句始终为false。改为php?我不确定我是否正确理解applyfilters,但我尝试过:function filtername() { return false; } add_filter( \'fil