Question

I am trying to setup a filter which supports more than one parameter:

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);

Then in my plugin I do this:

apply_filters('HOOK_NAME', 'BLOCK_ID', $items);

If I then in for instance the theme using something like this:

add_filter('HOOK_NAME', function ($block_id, array $items) {
  if ($block_id == 'MY_BLOCK') {
    return array(
      'A' => 1,
    );
  }
}, 10, 2);

Then I have a problem where the $block_id is actually the array since I cannot return both parameters from the callback.

Of course I could solve this by using a single parameter like this:

$args = array(
  'block_id' => 'MY_BLOCK',
  'items' => $items,
);

And then modify the callback:

function FILTER_CALLBACK(array $options)
{
  // Here options both contains block_id and items.
  return $options;
}

But not sure if this is the correct way of doing it or if I really should use filters in this case? Perhaps an action or similar would be better? I can also say that I would like to filter the original values of the array depending on the $block_id argument.

Was it helpful?

Solution

The problem is that you use apply_filters incorrectly.

This function takes at least two parameters:

  • $tag (string) (Required) The name of the filter hook
  • $value (mixed) (Required) The value on which the filters hooked to $tag are applied on.

So the first param should be the name of the hook and as second param you should always pass the value of filter. If you want to use any other params, you have to pass them later.

So in your case it should look like this:

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);
Licensed under: CC-BY-SA with attribution
Not affiliated with wordpress.stackexchange
scroll top