Il y a donc le scénario suivant.
J'ajoute une action pour nettoyer les journaux de la base de données:
add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Maintenant, je veux exécuter cette action périodiquement:
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );
et l'exécuter manuellement:
do_action( 'myplugin_clean_logs' );
La méthode MyPlugin_Logs::clean_logs
renvoie le nombre de lignes affectées ou false si quelque chose va dans l'autre sens.
Maintenant, je veux afficher le nombre de lignes qui ont été supprimées. J'imagine quelque chose comme ça:
$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';
Mais comme do_action
je ne retournerai aucune valeur, je ne sais pas comment obtenir la valeur de retour.
Dois-je exécuter la méthode directement sur une exécution manuelle, mais utiliser l'action sur les événements planifiés?
Réponses:
Ce qui est cool, c'est qu'un filtre est identique à une action, seulement il renvoie une valeur, alors configurez-le simplement comme un filtre à la place:
add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Ensuite, quelque chose comme:
doit passer
$affected_rows
àclean_logs()
(et quelles que soient les autres fonctions auxquelles vous avez pu vous connectermyplugin_clean_logs
) et attribuer la valeur de retour à$affected_rows
.la source
do_action()
n'est rien de plus qu'un hack élaboré deapply_filters()
:)do_action()
problème sans renvoyer une valeur plutôt que comment concevoir une solution en accord avec l'do_action()
intention de s. Si quelqu'un est capable de faire ce qu'il demande, cette réponse mérite d'être la réponse acceptée. Ma première pensée serait d'avoir la méthode hookée (en supposant que l'OP utilise une conception OOP pour ce plugin) déposer son résultat dans une propriété protégée de la classe du plugin, puis écrire un getter rapide pour le retirer ultérieurement. Mais ce n'est qu'une chevelure sauvage d'une idée!Je n'ai jamais utilisé cette fonction et je ne l'ai pas testée, mais pourrait-elle fonctionner? do_action_ref_array () .
Si cela ne fonctionne pas, pourquoi ne pas simplement filtrer la chose comme l'a suggéré Caspar? Je veux dire, c'est le but d'un filtre, et dans ce cas, le nombre de lignes affectées est la chose filtrée. (L'ancien MortCore me manque. Quelqu'un se souvient-il de la façon dont il a géré les valeurs de retour, le passage par référence et les arguments avec une seule fonction à trois paramètres?)
la source