Wie viele Filter- / Aktionshaken sind gesund?


8

Mein Plugin erweiterbar zu machen, ist der nächste Weg, um die Probleme der meisten Leute zu lösen. Und ich weiß, dass ich hier und da viele Filter- und Action-Hooks platzieren kann, um die Dinge dynamischer zu gestalten. Aber für mich ist es zu chaotisch.

Kürzlich hat ein Benutzer meines Plugins gebeten, den Text des QuickInfos zu ändern, und in diesem Fall ist dies kein so schlechter Grund. Auf dieser Seite befinden sich 6-8 QuickInfos. Ich weiß, dass ich Filterhaken für jeden von ihnen platzieren kann. Aber soll ich?

Gibt es einen Nachteil, Leistungsprobleme beim Platzieren vieler Haken?



@toscho eine Art. Aber die Antworten hier sind gut genug, um nicht als doppelt markiert zu werden, weil sie auch auf etwas Gutes verweisen. Übrigens danke für das Kraftpaket. Wird mir sehr helfen, mein Problem zu lösen.
Mayeenul Islam

Antworten:


7

Solange an Hooks nichts gebunden ist, sind sie No-Ops, das heißt fast nichts und haben keinen wesentlichen Einfluss auf die Laufzeit. Es wird ganz anders , wenn die Dinge sind süchtig und es gibt eine Menge von Anrufen.

Da Sie über das Anpassen von Zeichenfolgen sprechen, wäre das gute Beispiel gettextHook-in-Core. Jeder lokalisierte String durchläuft ihn.

Also in der Theorie ist dies ein sehr flexible Haken, der fast überall Filtertext ermöglicht. In der Praxis kann es tausende Male ausgelöst werden, und wenn Sie sich nur vorbehaltlos daran anschließen, wird die komplexe Site schnell zum Stillstand gebracht.

Sie behandeln Ihren Anwendungsfall nicht detailliert genug, um eine bestimmte Implementierung zu empfehlen. Im Allgemeinen haben Sie mehrere Möglichkeiten, wie Sie dies organisieren können:

  • apply_filters( 'prefix_tooltip', $text ) Im Grundfall müsste der Filter herausfinden, ob der Text genau übereinstimmt, um den Kontext zu bestimmen, und somit zerbrechlich.
  • apply_filters( 'prefix_tooltip', $text, 'type/location' )Mit einem zusätzlichen Argument können Sie den Typ der QuickInfo angeben, auf die der Filter abzielen kann. Selbst wenn sich der Text ändert, wird er vom Typ identifiziert.
  • apply_filters( 'prefix_tooltip_' . $type, $text )dynamischer Hook-Name, der sich mit dem variablen Wert ändert; Dies ist sehr flexibel für Fälle mit vielen / generierten Typen. Das Problem besteht hauptsächlich darin, dass dynamische Hooks im Code schwerer zu erkennen sind und sich viel schlechter selbst dokumentieren lassen.
  • apply_filters( 'prefix_tooltips', $texts_array )Einzelfilter für den vollständigen Satz der verwendeten Tooltips.

Bei einer Anzahl von 6 bis 8 Einträgen gibt es keinen wirklich bedeutenden Leistungsunterschied zwischen diesen.

Für Sie ist es wichtig zu lernen, welche Ansätze es gibt und dass Sie sorgfältig den für jeden Fall am besten geeigneten auswählen müssen, damit er für Sie und nachgeschaltete Entwickler sinnvoll und bequem ist.


3

Hier gibt es wirklich zwei Fragen: 1. Wie wirkt sich ein Haken aus? und 2. Sollten Sie einfach überall Haken spreizen

  1. Die Auswirkung ist nahe Null. Wenn nichts an der Aktion / dem Filter do_action/apply_filtershängt, werden die Anrufe fast sofort zurückgegeben, sodass Personen, die den Hook nicht verwenden, keine spürbaren Auswirkungen haben. Daher ist es technisch nicht schlecht, sie hinzuzufügen (wenn Sie dies tun) Geben Sie einen halbwegs vernünftigen Grund für das Hinzufügen von Hooks zum Kern an. Dies wird höchstwahrscheinlich durch das Kernthema hinzugefügt.

  2. Aber ist es als Softwareentwicklungspraxis klug? Nein. Hooks sind APIs, und APIs bedeuten, dass Sie sich verpflichten, sie langfristig zu warten. Daher sollten Sie wie bei jeder "offiziellen" API, die Sie erstellen, denken, dass dies auf lange Sicht für Ihr Plugin sinnvoll ist, und Sie tun dies nicht nur, um einen Plugin-Benutzer glücklich zu machen.

Wenn Sie Ihrer Beschreibung nach der Meinung sind, dass ein Text angepasst werden muss, sollten Sie möglicherweise in Betracht ziehen, dafür einen Einstellungsbildschirm zu verwenden. Dies ist natürlich auch eine Art API, die jedoch für Endbenutzer sichtbarer ist.


Vielleicht sollten Sie in Betracht ziehen, dafür einen Einstellungsbildschirm zu verwenden. Sorry Mark, das wäre viel zu chaotisch für eine Situation wie die, die ich beschrieben habe. Denn dadurch wird auch eine Datenbankabfrage generiert, bei der keine zusätzliche Last hinzugefügt werden muss (dh Tooltip-Text).
Mayeenul Islam

1. Benutzer dazu zu zwingen, Code zu schreiben, um eine Änderung an einem Text vorzunehmen, ist viel chaotischer als eine Einstellung. Wenn Sie nicht der Meinung sind, dass der Benutzer genug Wert hat, um den Text zu ändern, warum halten Sie es dann für eine gute Idee, Ihren Code mit Funktionen aufzublähen, die Benutzer nicht verwenden werden? 2. Wenn Ihr Plugin nicht sehr trivial ist, ist es unwahrscheinlich, dass Sie eine weitere DB-Abfrage benötigen, da alle Optionen der Site mit einer Abfrage geladen werden. @MayeenulIslam
Mark Kaplun

Vielen Dank, Mark, aber ich finde keinen Grund, die Einstellungs-API für eine einfache Änderung des Tooltips zu verwenden. BTW Settings API ist ein dynamischer Weg, das ist offensichtlich, ich stimme zu.
Mayeenul Islam

3

Anpassung ist immer ein Stein des Stolperns (schmerzhafter Prozess). Von einer Seite haben wir echte Anfragen (Probleme) von Benutzern, die immer wichtig sind. Auf der anderen Seite können all diese zusätzlichen Optionen Ihr schönes Thema, Plugin oder ein abstraktes Produkt zur Hölle machen. Was können wir als Entwickler tun?

Als erstes. Schreiben Sie erweiterbaren Code mit der Möglichkeit, einige Teile Ihres Codes zu ändern - wiederverwendbaren Code. Klassen, Schnittstellen, Merkmale und nur das Aufteilen von falschem Code in kleine Methoden (Funktionen). Einige Benutzer können sie problemlos verwenden, ohne Änderungen an Ihrem Produkt vorzunehmen. Zum Beispiel kann jemand ein Widget mit seinen eigenen Bedürfnissen erstellen und die interne Plugin-Funktion verwenden please_echo_the_plugin_awesome_stuff().

Das Hinzufügen der neuen Filter und Aktionen ist keine schlechte Idee . Viele beliebte Plugins wie Jetpack oder bbPress enthalten Hunderte von Filtern im Code. Manchmal sogar übermäßig. Jeder neue Filter (oder jede neue Aktion) ohne Handler verursacht normalerweise keinen großen Overhead. Es ist eine Mikrosekunde.

10 ^ −3 s Millisekunde ms 10 ^ −6 s Mikrosekunde µs

Viel wichtiger ist, was Sie bei dieser Aktion tun, indem Sie neue Handler über add_action()oder hinzufügen add_filter(). Zum Beispiel Anfragen an den Datenbankserver (manchmal nicht offensichtlich, wie das Abrufen der Option "Nicht automatisch laden" get_option()). Und du kannst es messen. Das einfachste Beispiel:

$start = microtime(true);
// Do some stuff here
$end = microtime(true);
echo $start, PHP_EOL, $end, PHP_EOL, $end - $start, PHP_EOL,

Es ist eine sehr einfache und manchmal am besten geeignete Technik, um Ihren Code zu profilieren. Übrigens hat WordPress interne "Stoppuhr", Kasse timer_start()und timer_stop().

Oder Sie können XDebug verwenden. Die Konfiguration scheint sehr komplex zu sein. Sie können jedoch VVV oder einen anderen einsatzbereiten Server verwenden. Alle haben Xdebug bereits richtig konfiguriert und Sie können es einfach verwenden - klingt großartig, nicht wahr?. Wenn Sie VVV verwenden, drücken Sie einfach einige Befehle:

vagrant ssh
xdebung_on

Das ist alles! Wechseln Sie zu Ihrer IDE und profilieren Sie Ihren Code. Oder verwenden Sie interne VVV-Dienste wie WebGrind. Weitere Informationen zu diesen Techniken finden Sie im Code Debugging Wiki . Es sollte beachtet werden, dass die Verwendung von Xdebug die Leistung beeinträchtigt, Sie jedoch langsamen Code finden können (Engpass).

Und drittens. Das letzte Ding. Die WordPress-Philosophie ist Entscheidungen, nicht Optionen .


Danke für die tolle Antwort. Ich wünschte, ich könnte mehrere Antworten gleichzeitig akzeptieren. Aber ich habe gelernt, das einzig Akzeptabelste zu akzeptieren. Deiner ist zu gut, aber er darf auch nicht aufgegeben werden. Gute Ratschläge. Ich danke dir sehr.
Mayeenul Islam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.