Make WordPress Core

Opened 14 years ago

Closed 12 years ago

#20920 closed defect (bug) (fixed)

Removing all hooks too aggressive if a priority number is given

Reported by: GeertDD Owned by: boonebgorges
Priority: normal Milestone: 4.2
Component: Plugins Version: 3.3.2
Severity: normal Keywords: has-patch
Cc: Focuses:

Description

When you call remove_all_filters() or remove_all_actions() with a priority number (second parameter), all hooks get removed if none is found with the given priority.

Example:

<?php
global $wp_filter;

add_action('my_action', 'callback_foo');
add_action('my_action', 'callback_bar', 20);
var_dump($wp_filter['my_action']);

// At this point only callback_foo is left. Fine.
remove_all_actions('my_action', 20);
var_dump($wp_filter['my_action']);

// Exactly the same function call as above,
// but now all hooks bound to my_action are removed!
remove_all_actions('my_action', 20);
var_dump($wp_filter['my_action']);

Calling remove_all_filters() or remove_all_actions() with a priority should never remove hooks with another priority.

Attachments (3)

remove_all_filters.diff​ (549 bytes ) - added by GeertDD 14 years ago.
20920.diff​ (1.3 KB ) - added by valendesigns 12 years ago.
20920.2.diff​ (1.4 KB ) - added by boonebgorges 12 years ago.

Download all attachments as: .zip

Change History (10)

#1 @SergeyBiryukov
14 years ago

  • Component General → Plugins
  • Milestone Awaiting Review → Future Release

#2 @mordauk
13 years ago

Seems sane to me.

#3 @nacin
13 years ago

  • Keywords needs-unit-tests added

@valendesigns
12 years ago

#4 @valendesigns
12 years ago

  • Keywords dev-feedback added; needs-unit-tests removed

The 20920.diff​ patch fixes the issue and includes supporting unit tests.

Cheers,
Derek

#5 @boonebgorges
12 years ago

  • Keywords dev-feedback removed
  • Milestone Future Release → 4.2

20920.2.diff​ reverses the if statement to make it a bit easier to read, and gives the unit test a more accurate name.

#6 @nacin
12 years ago

Looks good.

#7 @boonebgorges
12 years ago

  • Owner set to boonebgorges
  • Resolution → fixed
  • Status new → closed

In 31014:

In remove_all_filters(), only remove callbacks that match the $priority parameter.

Props GeertDD, valendesigns.
Fixes #20920.

Note: See TracTickets for help on using tickets.