web-dev-qa-db-de.com

Eine Aktion aus wp_footer entfernen, die in einer Klasse aufgerufen wurde, die sich in einer größeren Klasse befindet

Hintergrund:

Hallo, ich verwende dasJustified Gallery-Pluginund versuche, die erforderlichen Ressourcen nur auf den Seiten zu laden, auf denen ich Galerien verwende.

Das Problem:

Das Plugin lädt einige Inline-Elemente und Skripte, die ich nicht geladen habe, als ich nicht auf der richtigen Seite war.

Hier ist der Code für die Core-Klasse, die die anderen Klassen instanziiert:

<?php
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) {
    exit;
}

 $fspath = dirname(__FILE__) . '/includes/fs/config.php';
if ( file_exists($fspath) ) {
require_once $fspath;
}

if ( !class_exists( 'DGWT_JG_Core' ) ) {

final class DGWT_JG_Core {

    private static $instance;
    private $tnow;
    public $detector;
    public $settings;
    public $gallery;
    public $lightbox;
    public $tilesStyle;

    public static function get_instance() {
        if ( !isset( self::$instance ) && !( self::$instance instanceof DGWT_JG_Core ) ) {
            self::$instance      = new DGWT_JG_Core;
            self::$instance->constants();

            if ( !self::$instance->check_requirements() ) {
                return;
            }

            self::$instance->load_textdomain();

            self::$instance->includes();
            self::$instance->hooks();

            self::$instance->detector = new DGWT_JG_MobileDetect;
            self::$instance->settings    = new DGWT_JG_Settings;
            self::$instance->gallery     = new DGWT_JG_Gallery;
            self::$instance->lightbox    = new DGWT_JG_Lightbox_Loader;
            self::$instance->tilesStyle = new DGWT_TilesStyle_Loader;

        }
        self::$instance->tnow = time();

        return self::$instance;
    }

    /**
     * Constructor Function
     */
    private function __construct() {
        self::$instance = $this;
    }

    /*
     * Check requirements
     * @since 1.2.2
     */

    private function check_requirements() {
        if ( version_compare( PHP_VERSION, '5.3.0' ) < 0 ) {
            add_action( 'admin_notices', array( $this, 'admin_notice_php' ) );

            return false;
        }

        return true;
    }

    /**
     * Setup plugin constants
     */
    private function constants() {

        $this->define( 'DGWT_JG_VERSION', '1.2.3' );
        $this->define( 'DGWT_JG_NAME', 'Justified Gallery' );
        $this->define( 'DGWT_JG_FILE', __FILE__ );
        $this->define( 'DGWT_JG_DIR', plugin_dir_path( __FILE__ ) );
        $this->define( 'DGWT_JG_URL', plugin_dir_url( __FILE__ ) );
        $this->define( 'DGWT_JG_DOMAIN', 'justified-gallery' );

        $this->define( 'DGWT_JG_SETTINGS_KEY', 'dgwt_jg_settings' );

        $this->define( 'DGWT_JG_DEBUG', false );
    }

    /**
     * Define constant if not already set
     * @param  string $name
     * @param  string|bool $value
     */
    private function define( $name, $value ) {
        if ( !defined( $name ) ) {
            define( $name, $value );
        }
    }

    /**
     * Include required core files.
     */
    public function includes() {

        require_once DGWT_JG_DIR . 'includes/Utils/Helpers.php';
        require_once DGWT_JG_DIR . 'includes/Utils/MobileDetect.php';

        require_once DGWT_JG_DIR . 'includes/Install.php';

        require_once DGWT_JG_DIR . 'includes/admin/settings/SettingsApi.php';
        require_once DGWT_JG_DIR . 'includes/admin/settings/Settings.php';

        require_once DGWT_JG_DIR . 'includes/RegisterScripts.php';

        require_once DGWT_JG_DIR . 'includes/admin/admin.php';
        require_once DGWT_JG_DIR . 'includes/admin/Promo/FeedbackNotice.php';

        require_once DGWT_JG_DIR . 'includes/Gallery.php';
        require_once DGWT_JG_DIR . 'includes/TilesStyle/Loader.php';
        require_once DGWT_JG_DIR . 'includes/Lightbox/Loader.php';

    }

    /**
     * Actions and filters
     */
    private function hooks() {

        add_action( 'admin_init', array( $this, 'admin_scripts' ) );
    }

    /*
     * Enqueue admin sripts
     */

    public function admin_scripts() {
        // Register CSS
        wp_register_style( 'dgwt-jg-admin-style', DGWT_JG_URL . 'assets/css/admin-style.css', array(), DGWT_JG_VERSION );



        // Enqueue CSS            
        wp_enqueue_style( array(
            'dgwt-jg-admin-style',
        //'wp-color-picker'
        ) );


        //wp_enqueue_script( 'wp-color-picker' );
    }

    /*
     * Register text domain
     */

    private function load_textdomain() {
        $lang_dir = dirname( plugin_basename( DGWT_JG_FILE ) ) . '/languages/';
        load_plugin_textdomain( DGWT_JG_DOMAIN, false, $lang_dir );
    }

    /*
     * Notice: PHP version less than 5.3
     */

    public function admin_notice_php() {
        ?>
        <div class="error">
            <p>
                <?php
                printf(__( '<b>Justified Gallery Plugin</b>: You need PHP version at least 5.3 to run this plugin. You are currently using PHP version %s. Please upgrade PHP version or uninstall this plugin.', 'justified-gallery' ), PHP_VERSION);
                ?>
            </p>
        </div>
        <?php
    }

}

}

// Init the plugin
function DGWT_JG() {
    return DGWT_JG_Core::get_instance();
}

DGWT_JG();

hier ist der DGWT_JG_Gallery-Klassenkonstruktor, der eine Aktion hinzufügt, die ich auf unnötigen Seiten entfernen möchte:

class DGWT_JG_Gallery {

/**
 * Store array with options
 * @var array
 */
public $options;

function __construct() {

    $this->set_options();

    add_filter( 'post_gallery', array( $this, 'post_gallery' ), 15, 3 );

    add_action( 'wp_footer', array( $this, 'init_gallery' ), 90 );
}

Ich habe dies zur function.php meines Kinderthemas hinzugefügt

function remove_justified_gallery() {
    remove_action( 'wp_footer', array( $gallery, 'init_gallery' ), 90 );
    // remove_action( 'wp_footer', 'include_modal', 90 );
    // remove_action( 'wp_footer', 'gallery_init', 90 );
}
add_action( 'wp_head', 'remove_justified_gallery', 1);

Der Kampf hier ist es, auf die Klasse zuzugreifen, die die Funktion hält

laut codex , um eine Funktion in einer Klasse aus einer Aktion zu entfernen: https://codex.wordpress.org/Function_Reference/remove_action

Wenn eine Aktion aus einer Klasse heraus hinzugefügt wurde, z. B. durch ein Plug-in, muss auf die Klasse über eine Variable zugegriffen werden, die die Klasseninstanz enthält. Wenn die Funktion nicht statisch ist, können Sie die Klasse und die Funktion direkt aufrufen.

beispiel:

add_action( 'wp_head', 'remove_my_class_action' );
function remove_my_class_action(){
    global $my_class;
    remove_action( 'wp_footer', array( $my_class, 'class_function_being_removed' ) );
}
1
Vertigo

Aufgrund der Art und Weise, wie das Plugin aufgebaut ist, scheint die Hook-Funktionletztendlich in der Eigenschaft gallery der Eigenschaft instance der Klasse DGWT_JG_Core zu existieren.

Wenn eine Instanz von DGWT_JG_Core erstellt wird, wird eine DGWT_JG_Gallery-Klasse instanziiert und der Eigenschaft gallery der DGWT_JG_Core-Instanz hinzugefügt. Daher müssen wir die Aktion aus der Eigenschaft gallery der Instanz von DGWT_JG_Core entfernen, die beim Ausführen des Plugins erstellt wurde.

Da DGWT_JG_Core ein Singleton ist, gibt es immer nur eine Instanz von DGWT_JG_Core und wir können mit der Methode get_instance() darauf zugreifen. Das Plugin definiert für uns eine Funktion, die diese Methode für uns aufruft. Es ist die Funktion DGWT_JG() am Ende.

Um die Aktion entfernen zu können, verwenden wir DGWT_JG(), um die Instanz von DGWT_JG_Core abzurufen, und greifen über die Eigenschaft gallery auf die Klasse DGWT_JG_Gallery zu:

function wpse_284486_remove_justified_gallery() {
    $instance = DGWT_JG();

    remove_action( 'wp_footer', array( $instance->gallery, 'init_gallery' ), 90 );
}
add_action( 'wp_head', 'wpse_284486_remove_justified_gallery', 0 );

Ich habe dies an einer gefälschten Version der Klassen getestet, die nur einen einzelnen Hook implementiert haben, und es hat funktioniert. Ich werde es hier posten, damit du vielleicht sehen kannst, was los ist:

class My_Test_Gallery {
    function __construct() {
        add_action( 'wp_footer', array( $this, 'init_gallery' ), 90 );
    }

    function init_gallery() {
        echo 'Hello world!';
    }
}

class My_Test_Plugin {
    private static $instance;

    public static function get_instance() {
        if ( ! isset( self::$instance ) && ! ( self::$instance instanceof My_Test_Plugin ) ) {
            self::$instance = new My_Test_Plugin;
            self::$instance->gallery = new My_Test_Gallery;
        }

        return self::$instance;
    }

    private function __construct() {
        self::$instance = $this;
    }
}

function My_TP() {
    return My_Test_Plugin::get_instance();
}

My_TP();

function wpse_284486_remove_justified_gallery() {
    $instance = My_TP();

    remove_action( 'wp_footer', array( $instance->gallery, 'init_gallery' ), 90 );
}
add_action( 'wp_head', 'wpse_284486_remove_justified_gallery', 0 );
0
Jacob Peattie