in web/wp-content/plugins/acf-extended/includes/acfe-wp-functions.php [84:206]
function acfe_remove_filter($tag = '', $function = '', $priority = 10){
// string
if(is_string($function)){
return remove_filter($tag, $function, $priority);
}
// validate array($class, 'method')
if(!is_array($function) || !isset($function[0]) || !isset($function[1])){
return false;
}
// already class instance
if(is_object($function[0])){
return remove_filter($tag, $function, $priority);
}
// vars
$class = $function[0];
$method = $function[1];
// check acf instance
global $acf_instances;
if(isset($acf_instances[ $class ])){
return remove_filter($tag, array($acf_instances[ $class ], $method), $priority);
}
// check acf field types
$field_type = acf_get_field_type($class);
if($field_type){
return remove_filter($tag, array($field_type, $method), $priority);
}
// remove filter
// based on: https://gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
global $wp_filter;
// Check that filter actually exists first
if(!isset($wp_filter[ $tag ])){
return false;
}
/**
* If filter config is an object, means we're using WordPress 4.7+ and the config is no longer
* a simple array, rather it is an object that implements the ArrayAccess interface.
*
* To be backwards compatible, we set $callbacks equal to the correct array as a reference (so $wp_filter is updated)
*
* @see https://make.wordpress.org/core/2016/09/08/wp_hook-next-generation-actions-and-filters/
*/
if(is_object($wp_filter[ $tag ]) && isset($wp_filter[ $tag ]->callbacks)){
// Create $fob object from filter tag, to use below
$fob = $wp_filter[ $tag ];
$callbacks = &$wp_filter[ $tag ]->callbacks;
}else{
$callbacks = &$wp_filter[ $tag ];
}
// 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((array) $callbacks[ $priority ] as $filter_id => $filter){
// Filter should always be an array - array($this, 'method'), if not goto next
if(!isset($filter['function']) || !is_array($filter['function'])){
continue;
}
// If first value in array is not an object, it can't be a class
if(!is_object($filter['function'][0])){
continue;
}
// Method doesn't match the one we're looking for, goto next
if($filter['function'][1] !== $method){
continue;
}
// Method matched, now let's check the Class
if(get_class($filter['function'][0]) === $class){
// WordPress 4.7+ use core remove_filter() since we found the class object
if(isset($fob)){
// Handles removing filter, reseting callback priority keys mid-iteration, etc.
$fob->remove_filter($tag, $filter['function'], $priority);
}else{
// Use legacy removal process (pre 4.7)
unset($callbacks[ $priority ][ $filter_id ]);
// and if it was the only filter in that priority, unset that priority
if(empty($callbacks[ $priority ])){
unset($callbacks[ $priority ]);
}
// and if the only filter for that tag, set the tag to an empty array
if(empty($callbacks)){
$callbacks = array();
}
// Remove this filter from merged_filters, which specifies if filters have been sorted
unset($GLOBALS['merged_filters'][ $tag ]);
}
return true;
}
}
return false;
}