Jest więc następujący scenariusz.
Dodaję akcję, aby wyczyścić dzienniki z bazy danych:
add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Teraz chcę okresowo uruchamiać tę akcję:
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );
i wykonaj ręcznie:
do_action( 'myplugin_clean_logs' );
Metoda MyPlugin_Logs::clean_logs
zwraca liczbę dotkniętych wierszy lub fałsz, jeśli coś poszło w innym kierunku.
Teraz chcę wyświetlić liczbę usuniętych wierszy. Wyobrażam sobie coś takiego:
$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';
Ale ponieważ do_action
nie zwróci żadnej wartości, nie mam pojęcia, jak uzyskać wartość zwracaną.
Czy powinienem wykonać metodę bezpośrednio podczas uruchamiania ręcznego, ale użyć tej akcji do zaplanowania zdarzeń?
Odpowiedzi:
Fajne jest to, że filtr jest taki sam jak akcja, tyle że zwraca wartość, więc po prostu ustaw go jako filtr:
add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Następnie coś takiego:
powinien przejść
$affected_rows
doclean_logs()
(i wszelkich innych funkcji, do których można się przyczepićmyplugin_clean_logs
) i przypisać wartość zwracaną z powrotem do$affected_rows
.źródło
do_action()
sprawa jest niczym więcej niż skomplikowanym hackiemapply_filters()
:)do_action()
problem, nie zwracając wartości, a nie jak zaprojektować rozwiązanie zgodne zdo_action()
intencją. Jeśli ktoś jest w stanie zrobić to, o co prosi, ta odpowiedź zasługuje na akceptację. Moją pierwszą myślą byłoby, aby metoda przechwycona (zakładając, że OP używa projektu OOP dla tej wtyczki) upuściła wynik w chronionej właściwości klasy wtyczki, a następnie napisała szybki getter, aby wyciągnąć ją w późniejszym czasie. Ale to tylko dziki pomysł!Nigdy nie korzystałem z tej funkcji i nie testowałem jej, ale czy może ona działać? do_action_ref_array () .
Jeśli to nie zadziała, może po prostu odfiltruj coś, co sugerował Caspar? Chodzi mi o to, że taki jest cel filtra, a w tym przypadku liczba dotkniętych wierszy jest filtrowana. (Tęsknię za starym MortCore. Czy ktoś pamięta, jak obsługiwał zwracane wartości, przekazywanie referencji i argumenty za pomocą tylko jednej funkcji trzech parametrów?)
źródło