1

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.

1 Answer 1

2

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);
4
  • 1
    So, what you are saying is that the value returned from the callback should always be the first value when calling apply_filters()? Jul 8, 2019 at 9:18
  • 1
    I’m not the one who’s saying that. Codex is ;) Yes, that’s how filters work - they take first param, filter it and return it (with or without modifications). And if they need some other params to work, then they should be passed after the value. Jul 8, 2019 at 9:21
  • The thing is that I would like to send the block_id parameter from the plugin and I need it to be available in other places where we use this filter as long as they state that it will use more than one parameter e.g add_filter('HOOK_NAME', 'callback', 10, 2); is this possible? I mean the block_id parameter is sent from my plugin and available for others hooking into it. Jul 8, 2019 at 11:12
  • @Cyclonecode I’ve already showed in my answer how to do this... Jul 8, 2019 at 11:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.