do_action을하고 반환 값을 얻는 방법?


10

따라서 다음 시나리오가 있습니다.

데이터베이스에서 로그를 정리하는 작업을 추가합니다.

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어떤 값도 반환하지 않으므로 반환 값을 얻는 방법을 모릅니다.

수동 실행에서 직접 메소드를 실행해야하지만 스케줄 이벤트에 대한 조치를 사용해야합니까?


1
예약 된 이벤트에서 아무것도 에코하지 않으려 고합니다. 그렇습니다. 수동으로 직접 메소드를 실행합니다 (관리자가 이것을 트리거한다고 가정하고 출력을 표시하려고합니다).
Tim Malone

답변:


13

멋진 점은 필터가 액션과 동일하다는 것입니다. 값만 반환하므로 필터로 설정하면됩니다.

add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

그런 다음과 같은 것 :

$affected_rows = '';
$affected_rows = apply_filters( 'myplugin_clean_logs', $affected_rows );

통과해야 $affected_rowsclean_logs()(당신은에 걸려있을 수 있습니다 어떤 다른 기능 myplugin_clean_logs)과의 리턴 값 등을 지정 $affected_rows.


4
이것은 소프트웨어를 개발하는 대신 해킹 코드이기 때문에 하향 투표되었습니다. 액션이 필터의 하위 집합 인 경우 필요하지 않았을 것입니다. 버그 핵심 코드는 : 당신이 그런 shemigans을 수행 할 수 있습니다 경우에도이 필터로 휘는 안 그 때문에 크론 값을 전달할 수 없습니다
마크 Kaplun을

1
요점을 알았어. 나는 그 취득 목적 두 가지 다른 것들, 그러나 여기에서 핵심 코드를보고, 모든 do_action()것은 아무것도의 정교한 해킹보다 더 많은입니다 apply_filters():)
캐스퍼

코어에서 유일하게 나쁜 디자인은 아닙니다. 부분적으로 다음과 같은 질문을 야기하는 혼란을 야기하는 것입니다
Mark Kaplun

1
우리는 우리가 가진 것과 함께 일해야하므로 Mark의 관점을 이해하는 동안 여전히 이것이 합법적 인 대답이라고 생각합니다. 물론 미래에 핵심 이이 접근법을 변경 하지 않는 한 , 이전 버전과의 호환성 문제로 인해 발생하지 않을 것으로 생각합니다 소개합니다.
Tim Malone

3
감사합니다, @TimMalone. @ mark-kaplun의 반대 의견에 감사드립니다. 내 대답은 의도 do_action()에 따라 솔루션을 디자인하는 방법보다는 값을 반환하지 않는 방법을 설명합니다 do_action(). 누군가가 자신이 요구하는 것을 할 수 있다면, 그 대답은 받아 들여질만한 대답이되어야합니다. 내 첫 번째 생각은 후크 된 메소드 (OP 가이 플러그인에 대해 OOP 디자인을 사용한다고 가정)가 플러그인 클래스의 보호 된 속성에 결과를 놓은 다음 나중에 가져 오기 위해 빠른 getter를 작성하는 것입니다. 그러나 그것은 단지 아이디어의 거친 머리카락입니다!
Caspar

-1

이 기능을 사용하지 않았으며 이것을 테스트하지는 않았지만 작동 할 수 있습니까? 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가 그립습니다. 누구나 단 하나의 세 매개 변수 함수로 반환 값, 참조 기준 및 인수를 처리하는 방법을 기억하십니까?)


참조로 값을 전달하고 수정하는 것은 실제로 나쁜 습관이기 때문에 이것은 끔찍한 대답입니다. 솔직히이 답변은 실제로 질문의 맥락에서 가치를 제공하지 않으며 주석으로 제거되거나 변경되어야합니다. 또한 후크와 함께 익명 함수를 사용하는 것도 연결을 해제 할 수 없으므로 좋지 않습니다.
하이브리드 웹 개발자

위에서 언급 한 동일한 이유로이 방법이 권장되는 경로가 아님에 동의합니다. 어떤 이유로 든 액션에서 반환 값을 가져 와서 빠르고 더러운 것이 필요한 경우 Caspars 솔루션을 선호합니다. 라이프 사이클을 앞두고 무언가를 개발하고 있다면 더 강력한 방법을 찾을 것입니다. 관리자 알림은 어떻습니까? developer.wordpress.org/reference/hooks/admin_notices
jgangso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.