web-dev-qa-db-ja.com

クラスを持つ親テーマのremove_filterの構文

私は親テーマが追加されたregister_urlフックのフィルタを削除しようとしています、それは私が理解することができないクラス命名法を持っているようです。

通常、このフック用のフィルタは次のように簡単に追加されます。

    add_filter( 'register_url', 'custom_register_url' );
    function custom_register_url( $register_url )
    {
        $register_url = "YOUR_PAGE_URL";
        return $register_url;
    }

しかしながら、親テーマはこのフックにそれ自身のフィルタを追加しました、そしてロードシーケンスのために、私の子テーマはそのフィルタを上書きすることができません(この問題は here そして実証済み here そして詳細は here )。

そのプロセスは比較的簡単ですが、私が取り組んでいる親のテーマは、このフィルタと機能をオブジェクト指向プログラミングの中に置いたことです。 WordPress Codex と言う

フィルタがクラス内から、たとえばプラグインによって追加されている場合、フィルタを削除するにはクラス変数にアクセスする必要があります。

   global $my_class;
   remove_filter( 'the_content', array($my_class, 'class_filter_function') );

しかし、この機能にアクセスするための正しい命名法を理解することはできません。これが親テーマの抜粋です。

    class APP_Registration extends APP_Login_Base {

        private static $_template;

        private $error;

        function get_action() {
            return 'register';
        }

        function __construct( $template ) {
            self::$_template = $template;
            parent::__construct( $template, __( 'Register', APP_TD ) );

            add_action( 'appthemes_after_registration', 'wp_new_user_notification', 10, 2 );
            add_filter( 'register_url', array( $this, '_change_register_url' ), 10, 1 );
        }

        function _change_register_url( $url ) {
            return self::get_url( 'raw' );
        }

    . . .

関数(_change_register_url)をリストするだけでフィルタを削除しようとしてもうまくいきません。

    function custom_register_url( $register_url )
    {
        $register_url = "YOUR_PAGE_URL";
        return $register_url;
    }
    add_filter( 'register_url', 'custom_register_url' );

    function remove_parent_filters() {
        remove_filter( 'register_url', '_change_register_url' );
        add_filter( 'register_url', 'custom_register_url' );
    }
    add_action( 'after_setup_theme', 'remove_parent_filters' );

想定しているので、正しいクラス名でフックされている関数を指定する必要があります。

誰かが私がこの行のための適切な削除フィルタの構文を理解するのを手伝ってくれる?

        remove_filter( 'register_url', '_change_register_url' );
4
Bob Diego

プラグインはAPP_Registrationインスタンスにアクセスしたくないと思われるので、これを試すことができます。

add_filter( 'register_url', function( $url )
{
    // Adjust this to your needs
    $url = site_url( 'wp-login.php?action=register', 'login' );

    return $url;
}, 11 );

プラグインの変更を上書きするために、 priority > 10を使用します。

2
birgire

フィルタとアクションは、それらを削除しやすくするために、常に静的メソッドにする必要があります。それらが静的でなく、オブジェクトがシングルトンではない場合(あなたの場合はそう思われる)、そのアクション/フィルタのためのすべてのフックを削除してあなたのものを追加する以外に選択肢はない(@ birgreの答えはこのテーマの変形である) 。エレガントではありませんが、自分で子のテーマを設定し、そのために使用されているプラ​​グインや使用されているフックを事前に把握している場合は、これでうまくいく可能性があります。

シングルトンでないオブジェクトの場合にremove_filterが機能しないのは、add_actionremove_actionで使用されている(object、method)のペアが完全に一致している必要があるためです。運命。

3
Mark Kaplun