Es gibt also das folgende Szenario.
Ich füge eine Aktion hinzu, um Protokolle aus der Datenbank zu bereinigen:
add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Jetzt möchte ich diese Aktion regelmäßig ausführen:
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );
und führen Sie es manuell aus:
do_action( 'myplugin_clean_logs' );
Die Methode MyPlugin_Logs::clean_logs
gibt die Anzahl der betroffenen Zeilen oder false zurück, wenn etwas in die andere Richtung gegangen ist.
Jetzt möchte ich die Anzahl der gelöschten Zeilen anzeigen. Ich würde mir so etwas vorstellen:
$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';
Da do_action
jedoch kein Wert zurückgegeben wird, habe ich keine Ahnung, wie der Rückgabewert ermittelt werden soll.
Sollte ich die Methode direkt in einem manuellen Lauf ausführen, aber die Aktion für geplante Ereignisse verwenden?
Antworten:
Das Coole daran ist, dass ein Filter mit einer Aktion identisch ist, nur dass er einen Wert zurückgibt. Richten Sie ihn stattdessen als Filter ein:
add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Dann so etwas wie:
sollte
$affected_rows
anclean_logs()
(und an alle anderen Funktionen, an die Sie sich angeschlossen habenmyplugin_clean_logs
) übergeben werden und den Rückgabewert zurück anweisen$affected_rows
.quelle
do_action()
nichts weiter als ein aufwändiger Hack vonapply_filters()
:)do_action()
ohne einen Wert zurückzugeben, anstatt eine Lösung zu entwerfen, die mit derdo_action()
Absicht übereinstimmt . Wenn jemand in der Lage ist, das zu tun, was er verlangt, verdient diese Antwort die akzeptierte Antwort. Mein erster Gedanke wäre, die Hooked-Methode (vorausgesetzt, das OP verwendet ein OOP-Design für dieses Plugin) das Ergebnis in eine geschützte Eigenschaft der Plugin-Klasse zu legen und dann einen Quick Getter zu schreiben, um es zu einem späteren Zeitpunkt herauszuholen. Aber das ist nur ein wildes Haar einer Idee!Ich habe diese Funktion noch nie benutzt und noch nicht getestet, aber könnte sie funktionieren? do_action_ref_array () .
Wenn das nicht funktioniert, warum nicht einfach das filtern, was Caspar vorgeschlagen hat? Ich meine, das ist der Zweck eines Filters, und in diesem Fall wird die Anzahl der betroffenen Zeilen gefiltert. (Ich vermisse den alten MortCore. Kann sich jemand daran erinnern, wie er Rückgabewerte, Referenzübergabe und Argumente mit nur einer einzigen Drei-Parameter-Funktion behandelt hat?)
quelle