it-swarm.com.de

syntax für remove_filter im übergeordneten Thema mit Klasse

Ich versuche, einen Filter auf dem register_url-Hook zu entfernen, dem ein übergeordnetes Thema hinzugefügt wurde, das eine Klassennomenklatur zu haben scheint, die ich nicht herausfinden kann.

Normalerweise würde ein Filter für diesen Haken leicht wie folgt hinzugefügt werden:

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

Das übergeordnete Thema hat diesem Hook jedoch einen eigenen Filter hinzugefügt, und aufgrund der Ladereihenfolge kann mein untergeordnetes Thema diesen Filter nicht überschreiben (dieses Problem wird hier und demonstriert hier und im Detail Hier ).

Dieser Prozess ist relativ unkompliziert, aber das übergeordnete Thema, an dem ich arbeite, hat diesen Filter und diese Funktion in die objektorientierte Programmierung integriert, die mir das Gehirn schmerzt. WordPress Codex sagt

Wenn ein Filter aus einer Klasse heraus hinzugefügt wurde, z. B. durch ein Plugin, muss auf die Klassenvariable zugegriffen werden, um ihn zu entfernen.

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

Ich kann jedoch nicht die richtige Nomenklatur finden, um auf diese Funktion zuzugreifen. Hier ist ein Ausschnitt aus dem übergeordneten Thema:

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

    . . .

Der Versuch, den Filter zu entfernen, der nur die Funktion (_change_register_url) auflistet, funktioniert nicht:

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

Da ich davon ausgehe, muss ich die verknüpfte Funktion durch den korrekten Klassennamen kennzeichnen.

Kann mir jemand helfen, die richtige Remove-Filter-Syntax für diese Zeile herauszufinden?

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

Es sieht so aus, als ob das Plugin nicht möchte, dass Sie auf die APP_Registration-Instanz zugreifen. Sie können dies also versuchen:

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

    return $url;
}, 11 );

um die Modifikationen des Plugins zu überschreiben, verwenden wir priority > 10.

2
birgire

Filter und Aktionen sollten immer genau statische Methoden sein, damit sie leicht entfernt werden können. Wenn sie nicht statisch sind und das Objekt kein Singleton ist (scheint in Ihrem Fall so zu sein), gibt es keine anderen Möglichkeiten, als alle Haken für diese Aktion/diesen Filter zu entfernen und Ihre hinzuzufügen (die Antwort von @ birgre ist eine Variation dieses Themas). . Obwohl dies alles andere als elegant ist, funktioniert es möglicherweise, wenn Sie das untergeordnete Thema für sich selbst ausführen und daher im Voraus wissen, welche Plugins es gibt und welche Hooks sie verwenden.

Der Grund, warum der remove_filter bei Nicht-Singleton-Objekten nicht funktioniert, ist, dass es eine exakte Übereinstimmung zwischen dem in add_action und remove_action verwendeten Paar (Objekt, Methode) geben muss und dass Sie den Wert des Objekts nicht kennen verurteilt.

3
Mark Kaplun