In meiner functions.php
Datei möchte ich den folgenden Filter entfernen, aber ich bin mir nicht sicher, wie ich das machen soll, da es in einer Klasse ist. Wie soll das remove_filter()
aussehen?
add_filter('comments_array',array( &$this, 'FbComments' ));
Es ist auf der Linie 88 hier .
&
von Ihrem&$this
, es ist ein PHP 4 SacheAntworten:
Das ist eine sehr gute Frage. Es geht um das dunkle Herz der Plugin-API und die besten Programmiermethoden.
Für die folgende Antwort habe ich ein einfaches Plugin erstellt, um das Problem mit einfach zu lesendem Code zu veranschaulichen.
Jetzt sehen wir Folgendes:
WordPress benötigt einen Namen für den Filter. Wir haben keine bereitgestellt, also ruft WordPress an
_wp_filter_build_unique_id()
und erstellt eine. Dieser Name ist nicht vorhersehbar, da er verwendet wirdspl_object_hash()
.Wenn wir ein Lauf
var_export()
auf$GLOBALS['wp_filter'][ 'wp_footer' ]
bekommen wir so etwas wie dies jetzt:Um unsere böse Aktion zu finden und zu entfernen, müssen wir die zugehörigen Filter für den Hook durchgehen (eine Aktion ist nur ein sehr einfacher Filter), prüfen, ob es sich um ein Array handelt und ob das Objekt eine Instanz der Klasse ist. Dann nehmen wir die Priorität und entfernen den Filter, ohne jemals die reale Kennung zu sehen .
Okay, lassen Sie uns das in eine Funktion umwandeln:
Wann rufen wir diese Funktion auf? Es ist nicht sicher, wann das ursprüngliche Objekt erstellt wird. Vielleicht schon mal
'plugins_loaded'
? Vielleicht später?Wir verwenden genau den Haken, dem das Objekt zugeordnet ist, und springen sehr früh mit Priorität ein
0
. Das ist der einzige Weg, um wirklich sicher zu sein. So würden wir die Methode entfernenprint_message_3()
:Ergebnis:
Und das sollte die Aktion aus Ihrer Frage entfernen (nicht getestet):
Fazit
'plugins_loaded'
. Nicht nur, wenn Ihr Plugin von WordPress aufgerufen wird.quelle
plugins_loaded
aufgerufen werdenplugins_loaded
. Natürlich muss die Klasseninstanz weiterhin zugänglich sein, möglicherweise über ein Singleton-Muster.remove_action()
Ich bin nicht sicher, aber Sie können versuchen, einen Singleton zu verwenden.
Sie müssen den Objektverweis in einer statischen Eigenschaft Ihrer Klasse speichern und dann diese statische Variable von einer statischen Methode zurückgeben. Etwas wie das:
quelle
Solange Sie das Objekt kennen (und PHP 5.2 oder höher verwenden - die aktuelle stabile PHP-Version ist 5.5, 5.4 wird weiterhin unterstützt, 5.3 ist das Lebensende), können Sie es einfach mit der
remove_filter()
Methode entfernen . Alles, was Sie sich merken müssen, ist das Objekt, der Methodenname und die Priorität (falls verwendet):Sie machen jedoch einen kleinen Fehler in Ihrem Code.
$this
Setzen Sie kein kaufmännisches Und voran&
, das in PHP 4 (!) Benötigt wurde, und es ist seit langem überfällig. Dies kann den Umgang mit Ihren Hooks problematisch machen. Lassen Sie es einfach aus dem Weg:Und das ist es.
quelle
$this
von außen (ein anderes Plugin / Theme).