web-dev-qa-db-ja.com

より大きいクラスの内部にあるクラスで呼び出されたwp_footerからのアクションの削除

バックグラウンド:

こんにちは、Justified Galleryプラグインを使用しています。必要なリソースは、ギャラリーを使用しているページでのみロードしようとしています.

問題:

プラグインはいくつかのインライン要素とスクリプトをロードしますが、右側のページにない場合はロードできませんでした。

他のクラスをインスタンス化するCoreクラスのコードは次のとおりです。

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

不要なページで削除したいアクションを追加するDGWT_JG_Galleryクラスコンストラクタは次のとおりです。

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

これを私の子供のテーマのfunction.phpに追加しました。

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

ここでの闘争は、関数を保持するクラスにアクセスすることです。

codexに従って、アクションからクラス内の関数を削除するには: https://codex.wordpress.org/Function_Reference/remove_action

プラグインなどによってクラス内からアクションが追加されている場合、それを削除するには、クラスインスタンスを保持する変数を介してクラスにアクセスする必要があります。関数が静的でない限り、その場合はクラスと関数を直接呼び出すことができます。

例:

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

プラグインの構造上の理由から、フック関数が最終的にDGWT_JG_Coreクラスのgalleryプロパティのinstanceプロパティに存在するように見えます。

DGWT_JG_Coreのインスタンスが作成されると、DGWT_JG_Galleryクラスがインスタンス化され、DGWT_JG_Coreインスタンスのgalleryプロパティに追加されます。そのため、プラグインの実行時に作成されたDGWT_JG_Coreのインスタンスのgalleryプロパティからアクションを削除する必要があります。

DGWT_JG_Coreシングルトン なので、DGWT_JG_Coreのインスタンスは1つしかなく、get_instance()メソッドでアクセスできます。私たちにとって役立つプラグインは、このメソッドを呼び出す関数を定義しています。それは最後にそのDGWT_JG()関数です。

アクションを削除できるようにするには、DGWT_JG()を使用してDGWT_JG_Coreのインスタンスを取得し、galleryプロパティを介してDGWT_JG_Galleryクラスにアクセスします。

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

私はこれをシングルフックを実装したクラスの偽バージョンでテストしましたが、うまくいきました。ここに投稿するので、何が起こっているのかを確認できます。

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