如何停止或删除在扩展类的函数中调用的操作


How to stop or remove an action being called inside a function of an extended class

问题

我正在尝试删除一个名为"事件日历"的WordPress插件添加的JSON+ LD块。

我相信它是由调用的函数添加的:Tribe__Events__Template__Single_Event其中名为 google_data_markup 的函数负责我试图阻止/阻止添加到 HTML 中的实际标记。

《守则》

根据我对此的有限理解,我需要删除此操作:

add_action( 'wp_head', array( $this, 'google_data_markup' ) ); .

我相信它在这里被称为,Single_Event.php:

if ( ! class_exists( 'Tribe__Events__Template__Single_Event' ) ) {
    /**
     * Single event template class
     */
    class Tribe__Events__Template__Single_Event extends Tribe__Events__Template_Factory {
        protected $body_class = 'events-single';
        public function hooks() {
            parent::hooks();
            // google data markup
            add_action( 'wp_head', array( $this, 'google_data_markup' ) );
        }
        public function google_data_markup() {
            $event_markup = new Tribe__Events__Google_Data_Markup__Event();
            $html = apply_filters( 'tribe_google_data_markup_json', $event_markup->script_block() );
            echo $html;
        }
        /**
        ...
<小时 />

我尝试过什么

初始尝试

在StackOverflow和WordPress Dev Exchange上找到这个之后,我尝试了:

remove_action( 'wp_head', array( 'Tribe__Events__Template__Single_Event', 'google_data_markup' ) );

global $Tribe__Events__Template__Single_Event;
remove_action( 'wp_head', array( $Tribe__Events__Template__Single_Event, 'google_data_markup' ) );

但它没有奏效。

后续尝试

在变得更加绝望并看到这个细线程之后(该线程中的示例似乎与我的非常相似,但没有答案提供我理解的答案(,并且这个,我也尝试过这个,变量名称前面的&(为什么?

remove_action( 'wp_head', array( &$Tribe__Events__Template__Single_Event, 'google_data_markup' ) );

我也试过这个:

function remove_the_events_calendar_jsonld() {
    remove_action( 'wp_head', array( $Tribe__Events__Template__Single_Event, 'google_data_markup' ) );
}
add_action( 'plugins_loaded', 'remove_the_events_calendar_jsonld', 1 );

以及:

remove_action( 'Tribe__Events__Template__Single_Event', 'google_data_markup' );

请帮忙。 在这一点上,我不知道我是否犯了一个简单的语法或逻辑错误,或者我是否完全困惑和忘记了函数,类和动作是如何工作的。

更新 1

正如安德鲁·汗(Andrew Khan(所建议的那样,我尝试过:

global $Tribe__Events__Template__Single_Event;
remove_action( 'wp_head', array( $Tribe__Events__Template__Single_Event, 'google_data_markup' ), 20 );

remove_action( 'wp_head', array( 'Tribe__Events__Template__Single_Event', 'google_data_markup' ), 20 );

但它仍然增加了ld+json块。

更新 2 -- 解决方案

这有效:

add_filter( 'tribe_google_data_markup_json', '__return_empty_string', 20 );

感谢安德鲁·汗的回答。 他的解释在这里,下面。

上述方法似乎不起作用,但这里有一个解决方案。

add_filter( 'tribe_google_data_markup_json', '__return_empty_string', 20 );

对于所有想知道的人,请查看该操作正在调用的函数 - 它只是回显了一个应用了过滤器的 HTML 字符串。该特定过滤器也没有封装在类中,因此可以在任何地方轻松访问它。我想您使用的那个不是为了改变任何东西而设计的,除了插件。