向可调用的Add_Filter传递其他参数

时间:2018-01-03 作者:Ynhockey

我有一个add_filter 的函数auth_cookie_expiration 钩此挂钩接受三个参数。然而,我对传递更多参数感兴趣。例如:

add_filter( \'auth_cookie_expiration\', \'get_expiration\', 10, 5 );
这可能与apply_filter, 但是add_filter 函数被调用一次,这会导致抛出错误:

PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function get_expiration(), 3 passed in ... and exactly 5 expected
我使用闭包解决了这个问题,但这似乎是一种完全荒谬的方法:

add_filter( \'auth_cookie_expiration\', function() use ($param1, $param2) { return get_expiration(null, null, null, $param1, $param2); } , 10, 3 );
有没有合适/更优雅的方法让它接受其他参数(更好的是,我想要的参数代替默认参数)?我是不是误解了add_filter 应该有用吗?

为了举例说明,假设get_expiration 如下所示:

function get_expiration( $length, $user_id, $remember, $param1, $param2 )
{
    return $param1 + $param2;
}

3 个回复
SO网友:Ryszard Jędraszyk

中的第二个参数add_filter 是具有的函数accepted arguments, 未返回值。

这是一个如何传递自定义数组的示例$args 更改现有阵列的步骤$filter_args:

add_filter( \'woocommerce_dropdown_variation_attribute_options_args\', function( $filter_args ) use ( $args ) {
        return eswc_var_dropdown_args( $filter_args, $args );
    }
);

function eswc_var_dropdown_args( $filter_args, $args ) {
    $filter_args[\'show_option_none\'] = $args[\'var_select_text\'];
    return $filter_args;
}

SO网友:Frank P. Walentynowicz

我是否误解了add\\u过滤器的工作原理?

是的,你是。

函数的第二个参数中由名称指定的函数(也称为回调函数)add_filter(), NEVER 通行证ANY 参数。它接受传递的参数apply_filters(). 这些参数的数量及其含义由apply_filters(). 回调函数MUST 至少接受第一个参数,超过挂钩名称。信息技术MUST, 另外,返回第一个参数的修改(或不修改)值。

SO网友:Ynhockey

在使用了一段时间我最初的“解决方案”之后,我又回到了这个问题上,花了更多的时间来弄清楚WordPress的实际功能。

首先需要注意的是,要将参数直接传递给add_filter 功能,唯一合理的方法是我原来的问题中的方法。

然而,通常情况下,通过将参数传递给函数调用,可以更好地解决更大的问题apply_filters 在WordPress或您尝试连接的插件中。

例如apply_filters( \'auth_cookie_expiration\' ), 在WordPress内部调用wp_set_auth_cookie, 它接受相同的参数($user_id, $remember ), 这么说吧wp_set_auth_cookie() (对于任何会话操作都可能执行)允许最终将参数传递给add_filter. 例如:

add_filter( \'auth_cookie_expiration\', array( \'get_session_expiration\' ), 10, 3 );

// ...

wp_set_auth_cookie( $user_id, $is_remember_me );

// ...

function get_session_expiration( $expiration, $user_id, $remember ) {
    // ...
    return $some_calculated_expiration;
}
这在我发现的过滤器挂钩可用的多个情况下都有效。

结束

相关推荐

添加到数组并通过do_action/Apply_Filters传递它

作为练习,我正在使用PHPclass to add meta boxes 我在GitHub上找到了。我只是复制了代码,现在我正在玩它来理解它。其工作原理如下:包含该类的文件包含在init中。在该文件内部,但在类外部,有一个空数组$meta_boxes 已初始化之后,使用apply_filters. 我猜是apply_filters 使用而不是do_action 因为后者不返回任何内容——$meta_boxes = apply_filters( \'cmb_meta_boxes\', $meta_boxes