Last active
March 4, 2020 01:43
-
-
Save joemcgill/73a062a74af19207435517cc2dd8d836 to your computer and use it in GitHub Desktop.
Remove filters added from class instances on a specific hook.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Test_Class { | |
public function __construct() { | |
add_filter( 'pre_get_posts', [$this, 'test_callback'] ); | |
} | |
public function test_callback() { | |
wp_die( 'Hooked up.' ); | |
} | |
} | |
$test = new Test_Class(); | |
add_action( 'init', function () { | |
remove_class_filter( 'pre_get_posts', 'Test_Class', 'test_callback' ); | |
}, 99 ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Removes a filter added from a class instance from a specified hook. | |
* | |
* @param string $hook The filter hook from which to remove the callback method. | |
* @param string $class_name The name of the class containing the method to remove. | |
* @param string $method_to_remove The name of the method to be removed. | |
* @param integer $priority Optional. The priority of the function. Default 10. | |
* @return bool Whether the function existed before it was removed. | |
*/ | |
function remove_class_filter( $hook, $class_name, $method_to_remove, $priority = 10 ) { | |
global $wp_filter; | |
// Bail early if there are no callbacks on this filter. | |
if ( ! has_filter( $hook ) ) { | |
return false; | |
} | |
$callbacks = &$wp_filter[ $hook ]->callbacks; | |
// Exit if there aren't any callbacks for specified priority | |
if ( ! isset( $callbacks[ $priority ] ) || empty( $callbacks[ $priority ] ) ) { | |
return false; | |
} | |
// Loop through each filter for the specified priority, looking for our class & method | |
foreach ( $callbacks[ $priority ] as $callback ) { | |
// If the callback is not an array, skip it. | |
if ( ! is_array( $callback[ 'function' ] ) ) { | |
continue; | |
} | |
// If the callback matches the class and method we're looking for, remove it. | |
if ( | |
$callback[ 'function' ][0] instanceof $class_name && | |
$callback[ 'function' ][1] === $method_to_remove | |
) { | |
return remove_filter( $hook, array( $callback[ 'function' ][0], $callback[ 'function' ][1] ), $priority ); | |
} | |
} | |
// We only get here if no filter was found. | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is an example of a helper function that can be used to remove a filter that was added by a class instance that is not accessible along with a simplified test case to show how this would apply.