Так что есть следующий сценарий.
Я добавляю действие для очистки журналов из базы данных:
add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Теперь я хочу периодически запускать это действие:
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );
и выполнить его вручную:
do_action( 'myplugin_clean_logs' );
Метод MyPlugin_Logs::clean_logs
возвращает количество затронутых строк или false, если что-то пошло в другом направлении.
Теперь я хочу отобразить количество строк, которые были удалены. Я хотел бы представить что-то вроде этого:
$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';
Но так как do_action
не возвращает никакого значения, я понятия не имею, как получить возвращаемое значение.
Должен ли я выполнить метод непосредственно при ручном запуске, но использовать действие с расписанием событий?
Ответы:
Круто то, что фильтр - это то же самое, что и действие, только он возвращает значение, поэтому просто установите его как фильтр:
add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Тогда что-то вроде:
должен пройти
$affected_rows
кclean_logs()
(и любые другие функции , которые вы , возможно, подключили кmyplugin_clean_logs
) и присвоить возвращаемое значение обратно$affected_rows
.источник
do_action()
состоит в двух разных вещах, но если посмотреть на основной код здесь, то все это не более чем сложный взломapply_filters()
:)do_action()
без возврата значения, а не как разработать решение в соответствии сdo_action()
намерением. Если кто-то может сделать то, что он просит, этот ответ заслуживает того, чтобы быть принятым ответом. Моей первой мыслью было бы, чтобы подключенный метод (предполагая, что OP использует дизайн ООП для этого плагина) перенес его результат в защищенное свойство класса плагина, а затем написал быстрый метод получения, чтобы вытащить его в какой-то более поздний момент. Но это просто дикая идея!Никогда не использовал эту функцию и не проверял ее, но может ли она работать? do_action_ref_array () .
Если это не сработает, почему бы просто не отфильтровать то, что предложил Каспар? Я имею в виду, что это цель фильтра, и в этом случае количество затронутых строк - это то, что фильтруется. (Я скучаю по старому MortCore. Кто-нибудь помнит, как он обрабатывал возвращаемые значения, передачу по ссылке и аргументы с помощью только одной трехпараметрической функции?)
источник