Portanto, existe o seguinte cenário.
Eu adiciono uma ação para limpar logs do banco de dados:
add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Agora eu quero executar esta ação periodicamente:
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );
e execute-o manualmente:
do_action( 'myplugin_clean_logs' );
O método MyPlugin_Logs::clean_logs
retorna a contagem de linhas afetadas ou false se algo foi na outra direção.
Agora eu quero exibir o número de linhas que foram excluídas. Eu imaginaria algo assim:
$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';
Mas como do_action
não retornará nenhum valor, não tenho idéia de como obter o valor de retorno.
Devo executar o método diretamente em uma execução manual, mas usar a ação em agendar eventos?
Respostas:
O legal é que um filtro é o mesmo que uma ação, mas ele retorna um valor, então configure-o como um filtro:
add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Então algo como:
deve passar
$affected_rows
paraclean_logs()
(e quaisquer outras funções às quais você possa ter se conectadomyplugin_clean_logs
) e atribuir o valor de retorno de volta$affected_rows
.fonte
do_action()
coisa é nada mais do que um truque elaborado deapply_filters()
:)do_action()
não retornando um valor, e não como projetar uma solução em congruência comdo_action()
a intenção de s. Se alguém é capaz de fazer o que está pedindo, essa resposta merece ser a resposta aceita. Meu primeiro pensamento seria ter o método hooked (supondo que o OP esteja usando um design OOP para este plugin) solte o resultado em uma propriedade protegida da classe plugin e, em seguida, escreva um getter rápido para retirá-lo em algum momento posterior. Mas isso é apenas uma idéia selvagem!Nunca usou essa função e não a testou, mas poderia funcionar? do_action_ref_array () .
Se isso não funcionar, por que não filtrar o que Caspar sugeriu? Quero dizer, esse é o objetivo de um filtro e, nesse caso, o número de linhas afetadas é o que está sendo filtrado. (Sinto falta do antigo MortCore. Alguém se lembra de como ele lidava com valores de retorno, passagem por referência e argumentos com apenas uma única função de três parâmetros?)
fonte