필터와 동작 후크의 차이점은 무엇입니까?


51

나는 최근에 플러그인 API를 좀 더 깊이 살펴 보았고 액션과 필터 후크 사이에 어떤 실제 차이점이 있는지 궁금 했다 . 둘 다 데이터를 매개 변수로 수신하는 이벤트이며 둘 다 동일한 작업을 수행 할 수 있습니다.

분명히 작업이 수행 될 때 작업이 호출되고 데이터가 조작 될 때 필터가 호출되는 것을 알지만 의미 론적 이름 차이가있는 것 같습니다.

시맨틱과 그것들이 사용되는 것 외에도 그들 사이에 어떤 실제 차이점이 있습니까?

답변:


58

안녕 @Sruly :

당신은 당신 자신의 질문에 거의 대답했지만, 조금 더 자세히 설명하겠습니다.

액션 훅

작업 후크 는 WordPress 핵심 또는 일부 플러그인 또는 테마가 특정 지점에서 코드를 삽입하고 다음 중 하나 이상을 수행 할 수있는 기회를 제공 할 때 사용하기위한 것입니다.

  1. 일부 HTML 또는 기타 콘텐츠를 응답 버퍼 echo삽입하는 데 사용
  2. 하나 이상의 변수에 대한 전역 변수 상태 수정
  3. 매개 변수 수정 훅 함수에 전달 (후크를 가정하는 것은 의해 호출 된 do_action_ref_array()대신에 do_action(), 후자는 변수를 전달하는 지원하지 않기 때문에 에 의해 참조 .)

필터 후크

필터 후크는 동작 후크 와 매우 유사하게 작동 하지만 의도 된 용도는 값을 받고 수정 된 버전의 값을 반환하는 것입니다. 필터 후크는 또한 후크가 호출 될 때 수행해야하는 것으로 가정하여 전역 변수를 수정하거나 일부 HTML을 생성하기 위해 조치 후크와 같이 사용될 수 있습니다. Action Hooks에 대해 걱정할 필요가없는 Filter Hooks에 대해 매우 중요한 한 가지는 Filter Hook를 사용하는 사람 이 전달 된 첫 번째 매개 변수 (수정 된 버전)를 반환 해야한다는 것입니다. 일반적인 초보자 실수는 그 값을 반환하는 것을 잊는 것입니다!

추가 매개 변수를 사용하여 필터 후크에 컨텍스트 제공

그 외에도 필자는 이전 버전의 WordPress에서는 필터 후크가 하나의 매개 변수 만 수신하기 때문에 혼란스러워한다고 생각했습니다. 즉, 컨텍스트를 제공하기 위해 수정할 값은 있지만 두 번째 또는 세 번째 매개 변수는 없습니다. 그러나 최근에는 긍정적으로 WordPress 핵심 팀이 더 많은 컨텍스트를 발견 할 수 있도록 필터 후크에 추가 매개 변수를 추가 한 것으로 보입니다. 좋은 예는 posts_where후크입니다. 몇 가지 버전은 현재 쿼리의 "where" 클래스 SQL 인 하나의 매개 변수 만 허용 했지만 이제 where 절 WP_Query 후크를 호출하는 클래스 의 현재 인스턴스에 대한 참조를 모두 허용합니다 .

진짜 차이는 무엇입니까?

실제로 Filter Hooks는 Action Hooks의 상위 집합입니다. 전자는 후자가 할 수있는 일을 할 수 있으며 개발자가 필터 후크로 수행하는 액션 후크로 값을 반환 할 책임이 없지만 조금 더 할 수 있습니다.

지도 및 전신 의도 제공

그러나 그것은 아마도 중요한 것이 아닙니다. 중요한 것은 개발자가 액션 훅과 필터 훅을 사용하기로 선택하거나 그 반대로 의도를 전보 하고 따라서 훅을 사용하는 테마 개발자 또는 플러그인 개발자 에게 지침제공 한다는 것입니다. 본질적으로 그들은 "나는 당신을 부르고, 당신이해야 할 일은 무엇이든 할 것입니다" 또는 "나는 당신 에게이 값을 전달하여 수정하지만 다시 전달해야합니다 ."라고 말하고 있습니다 .

궁극적으로 나는 후크 유형의 선택에 의해 제공된 지침이 구별의 진정한 가치라고 생각한다 . 어쨌든 IMO.

도움이 되었기를 바랍니다!


PHP에서는 변수를 반환하는 것이 선택 사항이므로 모든 것에 대해 필터를 사용할 수있는 것처럼 보입니다. 왜 WordPress 개발자가 두 개의 별도 용어를 선택했는지 알고 있습니까? 의미상의 이유로 순수합니까? 기술적으로 필요가 보이지 않습니다.
TheStoryCoder 2016 년

2
@TheStoryCoder "순전히 의미적인 이유입니까?" 5 년 전에 내 대답이 정확히 설명 된 것 같습니다 ...?
MikeSchinkel 2016 년

11

add_action()핵심 함수 의 소스를 보면 함수의 래퍼 일뿐입니다 add_filter()...

do_action()핵심 기능 을 살펴보면 핵심 기능과 매우 유사하지만 apply_filters()한 가지 중요한 차이점이 있습니다. 값을 반환하지 않습니다.

이것이 무엇을 의미합니까? 작업은 값을 반환하지 않으므로 데이터를 수정할 수 없다는 점을 제외하면 필터와 같습니다. 단순히 필터 메커니즘을 복사하고 값을 반환하지 않고 WordPress의 동작 메커니즘을 만드는 것이 간단하다는 것을 보여줍니다. 기본적으로 액션으로 할 수있는 일은 값을 수정하지 않고 단순히 함수를 실행하는 것입니다.


5

간단히 말해서.

액션 은 출력을 실행하는 PHP 함수입니다.

필터 는 출력을 반환하는 PHP 함수입니다.

업데이트 : 코드를 수정하지 않고 액션과 필터를 사용하는 플러그인을 확장 할 수 있습니다. 자체 테마 또는 플러그인에 필터 및 작업을 추가합니다.


사용하는 방법?

동작:

테마 functions.php파일 에서 간단한 예제를 확인하십시오 .

  1. 예 1 : (간단한 PHP 예)
기능 검사() {
     에코 "출력";
}

테스트();

위의 프로그램은 출력을 인쇄합니다 :

산출

[참고 : 여기서 test ()는 단순히 함수를 호출합니다. 콜백 함수 'test'를 실행하십시오.]


  1. 예 2 : (간단한 동작 사용)
함수 test1 () {
     에코 "출력";
}
add_action ( 'test', 'test1');

do_action ( 'test');

위의 프로그램은 출력을 인쇄합니다 :

산출

[참고 : 여기에서 do_action('test')함수 호출과 같은 기능을합니다. 콜백 함수 'test1'을 실행하십시오.]


  1. 예 3 : (다른 동작 사용)
함수 test2 () {
     에코 "테스트 2";
}
add_action ( 'test', 'test2', 1);

함수 test1 () {
     에코 "테스트 1";
}
add_action ( 'test', 'test1', 2);

do_action ( 'test');

위의 프로그램은 출력을 인쇄합니다 :

테스트 2 테스트 1

[참고 : 여기에서 do_action('test')함수 호출과 같은 기능을합니다. 우선 순위에 따라 콜백 함수를 실행하십시오.

콜백 함수 'test1'의 우선 순위는 2이고 'test2'의 우선 순위는 1입니다.]

우선 순위가 1 인 'test1'과 우선 순위 2 인 'test2'와 같이 우선 순위가 변경되면 출력은 다음과 같습니다.

테스트 1 테스트 2

  1. 예 4 : (타사 지원) 아래 코드를 추가하십시오.functions.php
함수 test1 () {
     do_action ( 'test_before');
     에코 "테스트 1";
     do_action ( 'test_after');
}
add_action ( 'test', 'test1');

do_action ( 'test');

위의 프로그램은 출력을 인쇄합니다 :

시험 1

이제 샘플 플러그인을 만들어 타사 개발자의 작동 방식을 확인하십시오.

  1. /wp-content/plugins/디렉토리에 'simple'폴더를 만듭니다 .
  2. 'simple.php'라는 파일을 만들고 아래 코드를 추가하십시오.
/ *
* 플러그인 이름 : 간단한 플러그인
* /
함수 test_callback_function () {
     echo "플러그인에서";
}
add_action ( 'test', 'test_callback_function');

이제 WordPress 관리 대시 보드에서 간단한 플러그인 을 활성화하십시오 .

메뉴 플러그인으로 이동하여 활성화하십시오.

프로그램 위의 플러그인을 활성화 한 후 출력을 인쇄하십시오.

테스트 1 플러그인에서

[참고 : 플러그인 액션의 우선 순위를 1에서 9까지 추가하면 다음과 같이 출력이 인쇄됩니다.

pluginTest 1에서

왜냐하면 WordPress 10 priority by default는 추가 된 모든 동작을 고려하기 때문 입니다.]

필터

아래 예를 확인하십시오.

간단한 PHP 예제 :

$ data = array ( 'one', 'two');
print_r ($ data);

위의 프로그램은 출력을 인쇄합니다 :

배열 ([0] => 하나 [1] => 두)
  1. 예 1 : (단순한 필터 사용)
$ data = apply_filters ( 'my_filter_name', array ( 'one', 'two'));
print_r ($ data);

add_filter ( 'my_filter_name', 함수 ($ old_data) {
     반환 배열 ( 'three', 'four');
});

위의 프로그램은 출력을 인쇄합니다 :

배열 ([0] => three [1] => four)

여기서는 테마 / 플러그인 파일을 변경하지 않고 필터를 추가 my_filter_name하고 기존 출력 array( 'one', 'two' )array( 'three', 'four' )변경했습니다.



이러한 간단한 트릭에 대해 @maheshwaghmare에게 감사드립니다. '필터'에 대해서도 쓰십시오
Adi

"곧"은 무슨 뜻입니까?
랩티

@Rapti 지연해서 죄송합니다. 오늘 밤 필터 관련 답변을 추가하겠습니다. 앞으로 저는 Hooks (Actions & Filters)에 관한 설명 기사를 만들 것입니다.
maheshwaghmare

트윗 담아 가기 : P

좋은 설명, 나는 지금 더 잘 이해합니다
budiantoip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.