处理过滤器中的多个参数

时间:2019-07-08 作者:Cyclonecode

我正在尝试设置一个支持多个参数的过滤器:

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 论点

1 个回复
最合适的回答,由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);

相关推荐

为内置钩子调用do_action和Apply_Filters是否安全?

我正在开发一个插件,它需要复制一些内置的WordPress逻辑。(此逻辑不能用任何内置方法调用,也不能独立连接到。)在这个动作序列中,WordPress的正常行为是调用动作挂钩(do_action(\'wp_login\', ...)) 和过滤器挂钩(apply_filters(\'login_redirect\', ...)).如果在对应于在Core中调用它们的时间点调用它们,那么直接从我的插件调用这些内置钩子是否安全(并且是可以接受的做法)?或者,其他与此相关的开发人员期望在非常特定的时间执行操作的风