web-dev-qa-db-fra.com

syntaxe pour remove_filter dans le thème parent avec la classe

J'essaie de supprimer un filtre sur le crochet register_url auquel a été ajouté un thème parent, qui semble avoir une nomenclature de classe que je n'arrive pas à comprendre.

D'habitude, un filtre pour ce crochet serait facilement ajouté comme ceci:

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

Cependant, le thème parent a ajouté son propre filtre à ce hook et, en raison de la séquence de chargement, mon thème enfant ne peut pas écraser ce filtre (ce problème est examiné ici et démontré ici et en détail ici ).

Ce processus est relativement simple, mais le thème parent sur lequel je travaille a placé ce filtre et fonctionne dans la programmation orientée objet, ce qui me fait mal au cerveau. WordPress Codex dit

Si un filtre a été ajouté à partir d'une classe, par exemple à l'aide d'un plugin, sa suppression nécessitera l'accès à la variable de classe.

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

Mais je ne peux pas trouver la nomenclature correcte pour accéder à cette fonction. Voici un extrait du thème parent:

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

    . . .

Essayer de supprimer le filtre énumérant simplement la fonction (_change_register_url) ne fonctionne pas:

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

Parce que je suppose, je dois indiquer la fonction accrochée par son nom de classe correct.

Quelqu'un peut-il m'aider à comprendre la syntaxe de suppression appropriée pour cette ligne?

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

Il semblerait que le plugin ne veuille pas que vous accédiez à l'instance APP_Registration. Vous pouvez donc essayer ceci:

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

    return $url;
}, 11 );

pour écraser les modifications du plugin, où nous utilisons un priority > 10.

2
birgire

Les filtres et les actions doivent toujours être des méthodes statiques pour pouvoir les supprimer facilement. S'ils ne sont pas statiques et que l'objet n'est pas un singleton (cela semble être le cas dans votre cas), il n'y a pas d'autre option que de supprimer tous les points d'ancrage de cette action/filtre et d'ajouter le vôtre (la réponse de @ birgre est une variation de ce thème) . Bien que loin d’être élégant, cela pourrait fonctionner si vous réalisiez le thème de l’enfant pour vous-même et par conséquent, vous savez à l’avance quels plugins existent et quels points d’accès ils utilisent.

La raison pour laquelle remove_filter ne fonctionne pas dans le cas d'un objet non singleton est qu'il doit exister une correspondance exacte entre la paire (objet, méthode) utilisée dans add_action et remove_action et si vous ne connaissez pas la valeur de l'objet, vous êtes condamné.

3
Mark Kaplun