WordPress处理钩子的方式有一个问题,即要用OOP回调删除特定钩子,必须访问与添加回调时完全相同的类实例。这通常很容易在您自己的插件/主题中处理。
然而,除非开发人员全球化了类的实例,否则几乎不可能从另一个插件中删除挂钩。如果是这样,那么您可以使用global
关键字,然后像正常情况一样移除挂钩。另一种流行的模式是使用singleton方法只允许类的一个实例。
不幸的是,似乎有很多插件(包括WC)在包含该文件时初始化该类。为了使事情更加复杂,他们在类的构造函数中添加了挂钩。这使得移除挂钩极其困难。
我一直在学习一个类,该类将从$wp_filter
全局变量,如果您知道回调的名称空间\\类和方法。我已经对这个类进行了有限的测试,所以使用它的风险由您自己承担,但它确实对我有用。
希望这将为您指明正确的方向。
<?php
namespace WPSE\\Q_258764;
/**
* Class for interacting with hooks
*/
class hooks {
/**
* @var Namespace of the hook
*
* @access protected
* @since 0.2
*/
protected $namespace;
/**
* Object constructor
*
* @param string $namespace The namespace of the hook. Optional.
*
* @access public
* @since 0.2
*/
public function __construct( $namespace = __NAMESPACE__ ) {
$this->namespace = $namespace;
}
/**
* Remove a hook from the $wp_filter global
*
* @param string $tag The hook which the callback is attached to
* @param callable $callback The callback to remove
* @param int $priority The priority of the callback
*
* @access public
* @since 0.2
*
* @return bool Whether the filter was originally in the $wp_filter global
*/
public function remove_hook( $tag, $callback, $priority = 10 ) {
global $wp_filter;
$tag_hooks = $wp_filter[ $tag ]->callbacks[ $priority ];
foreach ( $tag_hooks as $the_tag => $the_callback ) {
if( $this->parse_callback( $the_callback ) === $callback ) {
return \\remove_filter( $tag, $the_callback[ \'function\' ], $priority );
}
}
return \\remove_filter( $tag, $callback, $priority );
}
/**
* Trim backslash from string
*
* @param string $string
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function trim_backslash( $string ) {
return trim( $string, \'\\\\\' );
}
/**
* Remove the namespace from the string
*
* @param string $string
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function remove_namespace( $string ) {
return str_ireplace( $this->namespace, \'\', $string );
}
/**
* Get the class name of an object
*
* @param object $object
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function get_class( $object ) {
return get_class( $object );
}
/**
* Return the callback object
*
* @param array $callback
*
* @access protected
* @since 0.2
*
* @return object
*/
protected function callback_object( $callback ) {
return $callback[ \'function\' ][ 0 ];
}
/**
* Return the callback method
*
* @param array $callback
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function callback_method( $callback ) {
return $callback[ \'function\' ][ 1 ];
}
/**
* Return the class from the callback
*
* @param array $callback
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function get_class_from_callback( $callback ) {
return $this->get_class( $this->callback_object( $callback ) );
}
/**
* Wrapper for strtolower
*
* @param string $string
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function strtolower( $string ) {
return strtolower( $string );
}
/**
* Parse the callback into an array
*
* @param array $callback
*
* @access protected
* @since 0.2
*
* @return array
*/
protected function parse_callback( $callback ) {
return is_array( $callback[ \'function\' ] ) ?
[ $this->class( $callback ), $this->method( $callback ) ] : false;
}
/**
* Return the class of a callback
*
* @param array $callback
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function class( $callback ) {
$class = $this->get_class_from_callback( $callback );
$class = $this->strtolower( $class );
$class = $this->remove_namespace( $class );
return $this->trim_backslash( $class );
}
/**
* Return the method of a callback
*
* @param array $callback
*
* @access protected
* @since 0.2
*
* @return string
*/
protected function method( $callback ) {
return $callback[ \'function\' ][ 1 ];
}
}
编辑:这仅适用于大于4.7的WP版本。