따라서 다음 시나리오가 있습니다.
데이터베이스에서 로그를 정리하는 작업을 추가합니다.
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 = '';
$affected_rows = apply_filters( 'myplugin_clean_logs', $affected_rows );
통과해야 $affected_rows
에 clean_logs()
(당신은에 걸려있을 수 있습니다 어떤 다른 기능 myplugin_clean_logs
)과의 리턴 값 등을 지정 $affected_rows
.
답변
이 기능을 사용하지 않았으며 이것을 테스트하지는 않았지만 작동 할 수 있습니까? do_action_ref_array () .
function myplugin_clean_logs_fn() {
$args = array(
'param1' => 'val1',
'param2' => 'val2',
'affected_rows' => 0,
);
do_action_ref_array( 'myplugin_clean_logs', &$args );
return $args['affected_rows'];
}
// CALL IT
$affected_rows = my_plugin_clean_logs();
echo $affected_rows .' entr'. ($args['affected_rows']*1===1?'y':'ies') .' deleted.';
// SCHEDULE IT
add_action('myplugin_clean_logs_call_fn', 'myplugin_clean_logs_fn');
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs_call_fn' );
// A SAMPLE FILTER
add_action('myplugin_clean_logs', function($args) {
// Cleaning process
// For each log affected, increment $args['affected_rows'] accordingly
}, 10, 3);
그래도 작동하지 않으면 Caspar가 제안한 것을 필터링하지 않는 이유는 무엇입니까? 즉, 이것이 필터의 목적이며,이 경우 영향을받는 행의 수가 필터링되는 것입니다. (이전의 MortCore가 그립습니다. 누구나 단 하나의 세 매개 변수 함수로 반환 값, 참조 기준 및 인수를 처리하는 방법을 기억하십니까?)