Ich aktualisiere eines meiner Plugins und bin ein wenig mit veralteten Funktionen beschäftigt.
Ursprünglich hatte mein Plugin eine globale Variable und die Hauptklasse des Plugins wurde instanziiert und in der globalen Variablen gespeichert. Auf diese Weise können Benutzer die globale Funktion verwenden, um auf Funktionen in der Plugin-Klasse zuzugreifen.
$GLOBALS['my_custom_plugin'] = new my_custom_plugin();
Dann hatte ich zum Beispiel in meinen FAQ Code, der zeigte, wie man eine der Funktionen meiner Klasse aus einem bestimmten Hook entfernt und zu einem anderen Hook hinzufügt:
function move_input(){
global $my_custom_plugin;
remove_action( 'before_main_content', array( $my_custom_plugin, 'display_input') );
add_action( 'after_main_content', array( $my_custom_plugin, 'display_input' ) );
}
add_action( 'wp_head' , 'move_input' );
In meinem Update wurde die display_input()
Funktion in eine andere Klasse verschoben und ich möchte die Leute wissen lassen, wie sie darauf zugreifen können. Ich habe versucht, die ursprüngliche Funktion (in der Haupt-Plugin-Klasse) durch den folgenden Verfallshinweis zu ersetzen:
public function display_input() {
_deprecated_function( 'display_price', '2.0', 'my_custom_plugin()->display->display_input' );
return $this->display->display_input();
}
Die Funktionen add_action
und remove_action
scheinen jedoch nicht den Verfallshinweis auszulösen. Seltsamerweise verursacht das vollständige Entfernen der Funktion auch keinen Fehler, obwohl er array( $my_custom_plugin, 'display_input')
nicht vorhanden ist.
Wenn jemand versucht, direkt auf die Funktion zuzugreifen:
$my_custom_plugin->display_input();
Dann sehe ich die Debug-Hinweise. Ist das das erwartete Ergebnis für _deprecated_function()
? oder fehlt mir etwas Ist es möglich, einen Debug-Hinweis anzuzeigen, wenn jemand versucht, eine Aktion mithilfe einer veralteten Funktion zu entfernen oder hinzuzufügen?
Aktualisieren
Mir wurde klar, dass ich die Debug-Meldung für das einfach nicht sah, add_action
da ich sie ziemlich tief auf der Seite hinzufügte. #facepalm! Ich sehe jedoch immer noch keinen Debug-Hinweis für die remove_action
.
quelle
call_user_func(function(){trigger_error('hello?');});
funktioniert, aber es schlägt in einem Rückruf fehl, der pro add_action registriert wurde.add_action()
war tatsächlich da.remove_action()
kann nicht so gehandhabt werden.Antworten:
Nicht vorhandene Rückrufe
Eines der schönen Dinge ist, dass weder
do_action()
nochapply_filters()
ein Fehler ausgelöst wird, wenn kein Rückruf vorhanden ist. Dies bedeutet, dass dies der sicherste Weg ist, Plugin-Daten in Vorlagen einzufügen: Wenn ein Plugin deaktiviert ist unddo_action()
/apply_filters()
oder der Rückruf nicht im globalen$wp_filters
Array gefunden wird, geschieht nichts.Fehlerausgabe
Wenn Sie jetzt
remove_filter()
die Funktion / Methode aufrufen , die den Rückruf ursprünglich verknüpft hat, wird der Rückruf einfach aus dem globalen Array entfernt, was bedeutet, dass der Rückruf nie ausgeführt wird, da er nicht mehr registriert ist.Die Lösung ist einfach: Entfernen Sie den Rückruf, nachdem er ausgelöst wurde, indem Sie ihn aus dem Rückruf selbst entfernen.
Rückrufe entfernen
Wir alle wissen, dass das WPs-Plugin "API" beim Entfernen ein Problem darstellt. Das Problem ist hauptsächlich das seltsame Konstrukt, Schlüssel im
global $wp_filter;
Array mit "eindeutigen" Namen zu versehen . Eine sehr einfache Lösung besteht darin, nur__METHOD__
Filter zu verwenden und aufzurufen, die Sie im statischen Kontext entfernen möchten:Das ist zwar nicht schön, aber für einige Anwendungsfälle eine Art Lösung . Aber denken Sie nicht einmal daran, einen Verschluss zu entfernen.
Oben entfernt nur den Rückruf, führt ihn trotzdem aus. Trotzdem können Sie weiter gehen und
remove_all_actions()
(oderremove_all_filters()
) verwenden.Sie können vielleicht sogar noch weiter gehen, den Rückruf aus dem globalen Filterarray extrahieren und ihn erneut an den neuen Hook / Filter anhängen (sofern diese kompatibel sind).
quelle