mardi 16 février 2016

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

The Problem

I am trying to remove an JSON+LD block being added by a WordPress plugin called The Events Calendar.

I believe it is being added by the function called: Tribe__Events__Template__Single_Event within which the function named google_data_markup is responsible for the actual markup which I am trying to stop/prevent from being added to the HTML.

The Code

From my limited understanding of this, I need to remove this action:

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

I believe it is being called here, in 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;
        }

        /**
        ...


What I've tried

Initial Attempts

After finding this on StackOverflow, and this on WordPress Dev Exchange, I tried:

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

and

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

But it did not work.

Subsequent Attempts

After getting even more desperate and seeing this slim thread I've also tried this, with the & before the variable name (why?):

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

I've also tried this:

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 );

as well as:

remove_action( 'Tribe__Events__Template__Single_Event', 'google_data_markup' );

Please help. At this point I have no idea if I am making a simple syntax or logic error of sorts, or if I am completely confused and oblivious to how functions, classes and actions work.



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire