我正在尝试设置一个支持多个参数的过滤器:
function FILTER_CALLBACK($block_id, array $items)
{
// How can I pass both parameters to the next hook?
return $items;
}
add_filter(\'HOOK_NAME\', \'FILTER_CALLBACK\', 10, 2);
然后在我的插件中执行以下操作:
apply_filters(\'HOOK_NAME\', \'BLOCK_ID\', $items);
例如,如果我在主题中使用以下内容:
add_filter(\'HOOK_NAME\', function ($block_id, array $items) {
if ($block_id == \'MY_BLOCK\') {
return array(
\'A\' => 1,
);
}
}, 10, 2);
那么我有个问题
$block_id
实际上是数组,因为我无法从回调返回这两个参数。
当然,我可以通过使用这样一个参数来解决这个问题:
$args = array(
\'block_id\' => \'MY_BLOCK\',
\'items\' => $items,
);
然后修改回调:
function FILTER_CALLBACK(array $options)
{
// Here options both contains block_id and items.
return $options;
}
但不确定这是正确的方法,还是我真的应该在这种情况下使用过滤器?也许采取行动或类似行动会更好?我还可以说,我想根据
$block_id
论点
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成
问题是您使用apply_filters
不正确。
此函数至少采用两个参数:
- $tag(字符串)(必填)过滤器挂钩的名称$value(混合)(必需)应用挂接到$标记的筛选器的值
因此,第一个参数应该是钩子的名称,而作为第二个参数,您应该始终传递filter的值。如果要使用任何其他参数,必须稍后传递它们。
因此,在您的情况下,应该如下所示:
function FILTER_HOOK(array $items, $block_id)
{
// How can I pass both parameters to the next hook?
return $items;
}
add_filter(\'HOOK_NAME\', \'FILTER_HOOK\', 10, 2);
apply_filters(\'HOOK_NAME\', $items, \'BLOCK_ID\');
add_filter(\'HOOK_NAME\', function (array $items, $block_id) {
if ($block_id == \'MY_BLOCK\') {
return array(
\'A\' => 1,
);
}
return $items; // filter should always return some value
}, 10, 2);