PHP에서 필터와 후크가 실제로 작동하는 방법


21

WordPress에서 필터와 후크는 실제로 어떻게 작동합니까?

나는 뭔가 진보 된 것을 요구하고 있습니다. PHP에서 어떻게 구현됩니까? 예를 들어 다른 플러그인에서 모든 후크를 수집하여 코어 후크 등에 "연결"하는 방법은 무엇입니까?


2
내가 아는 한 php에 '후크'또는 '필터'가 없다면 함수가 있습니다. Wordpress에는 실행 전에 다른 함수의 콜백을 사용하는 특수 함수가 있습니다.
Ofir Baruch


3
@OfirBaruch, OP가 WordPress에서의 구현을 언급하고 있다고 확신하며, PHP의 네이티브 구현이 제안되지 않았습니다.
Tom Auger

답변:


33

개요

기본적으로 필터 및 후크를 소환 하는 " 플러그인 API "는 다음 기능으로 구성됩니다.

  1. apply_filters()- 실행
  2. do_action- 실행
  3. apply_filters_ref_array()- 실행
  4. do_action_ref_array()- 실행
  5. add_filter()- 스택에 추가
  6. add_action()- 스택에 추가

기본 내부

전반적으로 몇 가지 글로벌 (워드 프레스 세계의 다른 것)이 있습니다.

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

첫 번째 는 모든 필터 이름을 하위 배열로 보유 $wp_filter하는 전역 Array입니다. 그런 다음 각 하위 배열에는 우선 순위 배열에서 소환되는 콜백 인 훨씬 더 많은 하위 배열이 있습니다.

간략한 심층

따라서 실행 기능이 호출되면 WordPress는 해당 전역 배열에서 해당 이름의 키를 검색합니다. 그런 다음 첨부 된 콜백이 우선 순위 후에 우선 순위를 갖습니다. 앞에서 발생하는 유일한 것은 all필터에 연결된 콜백 입니다.

당신이 사용하는 콜백을 추가 할 때 add_action또는 add_filter다음, 워드 프레스 첫번째 계산 덮어 이미 부착되지 콜백에 "독특한"ID를.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

그런 다음 global $wp_filter스택에 콜백을 추가합니다 .

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

주 서브 배열은 $tag(또는 액션 / 필터 이름)이며, 우선 순위에 따라 모든 것이 소환되고 "고유 한"콜백 / ID 문자열이 키로 사용됩니다.

나중에 $tag/ action- / filter-name 으로 필터가 호출 되면 배열이 검색되고 콜백이 호출됩니다. 그것이 call_user_func_array사용됨에 따라 얼마나 많은 인수가 첨부되는지는 중요하지 않습니다. 워드 프레스는이를 스스로 해결합니다.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}

3
콜백을 진행할 때 add_action () 및 apply_filters ()로 설정되고 기본값은 10으로 설정된 "priority"를 사용하여 동일한 후크에서 여러 콜백을 실행하도록 명령합니다.
Tom Auger

1
@TomAuger 답변에 추가 메모 및 수정 사항을 추가하십시오.
카이저

5

후크 는 WordPress 핵심 파일과 일부 상위 테마 파일에 모두 포함되어 있습니다. 파일의 특정 위치에 컨텐츠를 연결할 수 있습니다.

WordPress의 wp_head 훅이 그 예입니다. 자녀 테마에서이 후크를 사용하여 해당 위치에 콘텐츠를 추가 할 수 있습니다. '

예:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

일부 프리미엄 테마에는 하위 테마에서 동일한 작업을 수행하는 데 사용할 수있는 동작 후크 도 포함 되어 있습니다. 다음 은 모든 액션 후크와 이들이 창세기 테마 프레임 워크에서 컨텐츠를 출력 한 위치를 포함 하는 시각적 맵 입니다.

예:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Genesis 테마 프레임 워크에서 header.php 파일을 열었을 때의 훅 모양은 다음과 같습니다.

do_action( 'genesis_header' );

여기의 워드 프레스 후크의 목록 은 여러 가지 방법으로 사용할 수는.

필터를 사용하면 기존 기능의 출력을 수정할 수 있으며 WordPress 코어 파일과 Genesis와 같은 일부 상위 테마 프레임 워크에 모두 포함됩니다.

Genesis Design Framework와 함께 사용할 수 있는 필터 목록은 다음과 같습니다.

다음 은 WordPress에 포함 된 필터 목록입니다.

다음은 Genesis와 같은 테마 프레임 워크에서 필터를 사용하는 방법에 대한 예입니다.

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

위의 코드는 자식 테마에서 작성자가 주석의 텍스트를 수정하는 데 사용될 수 있습니다. 모든 테마에서 작동합니다.

발췌 길이를 50 단어로 사용자 정의하는 또 다른 예는 다음과 같습니다.

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

wp-includes / post-template.php 파일 에서 the_excerpt () 함수를 찾을 수 있습니다.

그 모습은 다음과 같습니다.

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

플러그인에서 후크와 필터를 사용하여 정확히 동일한 작업을 수행 할 수 있으며 부모 테마 또는 WordPress를 업데이트 할 때 코드가 손실되지 않습니다.

기본적으로 후크 및 필터를 사용하면 핵심 WordPress 파일 또는 부모 테마 파일을 편집하지 않고도 WordPress와 부모 테마를 모두 사용자 지정하고 수정할 수 있습니다.

부모 테마 프레임 워크에 후크 및 필터가 포함되어 있으면 부모 테마 템플릿 파일을 편집 할 필요가 없으므로 자식 테마를 사용자 정의하는 것이 훨씬 쉽습니다. 이렇게하면 테마를 안전하게 변경할 수 있습니다.


2
이것은 후크와 필터에 대한 일반적인 개요이지만 후크의 작동 방식과 WordPress에서 후크를 만들고 저장하고 처리하는 방법에 대한 OP의 질문을 완전히 놓친 것 같습니다. 큰 대답; WP 사이트의 자습서에 연결해야합니다.
Tom Auger

알겠습니다. 삭제하겠습니다. 내가 질문을 더 잘 읽었어야했던 나의 나쁜 점은 초보자가 기본을 먼저 알고 있다면 이미 해답을 이해하는 것이 더 쉬울 것이라고 생각했다.
Brad Dalton

2
브래드, 나는 그 정보를 여기에있는 것이 유용 할 것이라고 생각하여 삭제를 취소했습니다. 동의하지 않는 경우 여기에서 나를 언급 / 핑하면 다시 제거하겠습니다.
카이저
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.