[WordPress]워드프레스 플러그인 개발(3)




출처 Taehan Lee
원문 http://urlless.com/wordpress-plugin-development/3/

3. 플러그인 프로그래밍하기

플러그인을 프로그래밍하는 방법은, WordPress Plugin Hook을 이용하는 방법Template Tags를 이용하는 방법이 있습니다.

 

3.1 WordPress Plugin Hook을 이용하는 방법

후킹(hooking)은 소프트웨어 공학 용어로, 운영 체제나 응용 소프트웨어 등의 각종 컴퓨터 프로그램에서 소프트웨어 구성 요소 간에 발생하는 기능 호출, 메시지, 이벤트 등을 중간에서 바꾸거나 가로채는 명령, 방법, 기술이나 행위를 말한다.” – 위키피디아

워드프레스 플러그인 훅은 워드프레스가 실행되는 동안 다양한 시점에서 실행됩니다.
워드프레스는 자신이 해야할 기본 행위를 하기전에 그 행위에 플러그인이 등록되어있는지를 먼저 체크합니다. 만약 여기에 등록되어있는 함수가 있다면 이를 먼저 실행합니다. 예를들어, 포스트 제목 앞에 일괄적으로 꽃표를 붙히고자 한다면, ‘필터’라는 훅을 활용해볼 수 있을 것입니다.
아래 코드는 포스트 제목을 출력하는 기능을 하는 the_title 함수(템플릿태그)에 필터를 추가하는 방법을 보여줍니다.(자세한 설명은 Filter에서 설명합니다)

function add_asterisk_on_title($title){
 return '*' . $title;
}
add_filter('the_title', 'add_asterisk_on_title');

워드프레스 플러그인 Hook으로는 Action과 Filter가 있습니다.

 

Actions: Action API를 이용하여, 워드프레스가 실행되는 동안 특정한 포인트에서, 또는 특정한 이벤트가 발생되었을때 후킹할 수 있도록 한다. 플러그인 개발자는 이 포인트에 하나 또는 그 이상의 PHP 함수가 실행되도록 할 수 있다.

 

Filters: Filter API를 이용하여, 텍스트를 데이터베이스에 저장하거나 브라우저에 출력하기 전에 후킹할 수 있도록 한다. 플러그인 개발자는 이 시점에 하나 또는 그 이상의 PHP 함수가 실행되도록 하여 다양한 타입의 텍스트를 수정할 수 있다.

자, 그럼 이 두가지를 차근 차근 예제와 함께 살펴보도록 하겠습니다.

*

3.1.1 Action

액션은 워드프레스에서 발생하는 특정 이벤트에 의해 실행됩니다. 예를들어, 포스트를 퍼블리시한다거나 테마를 바꿀때… 이와같은 이벤트가 발생할 때 여러분이 등록한 PHP 함수가 실행됩니다.

기본 과정은 아래와 같습니다.
i. 이벤트가 발생했을때 실행할 PHP 함수를 정의한다.
ii. add_action으로 워드프레스에 액션 훅을 건다.
iii. 플러그인 파일에 위 내용들을 저장하고, 플러그인을 활성한다.

 

실습: 새로운 포스트를 퍼블리시했을 때, 자동으로 친구에게 이메일 공유하는 플러그인을 만들어봅시다.

 

function email_friends($post_ID)  {
   $friends = 'bob@example.org,susie@example.org';
   mail($friends, "sally's blog updated", 'I just put something on my blog');
   return $post_ID;
}

대부분의 action 함수는 위와 같이 1개의 파라미터를 받도록 작성될 것입니다. (보통 포스트 아이디 또는 덧글의 아이디). 하지만 어떤 action 함수의 경우 1개 이상의 파라미터를 필요로 하는 경우도 있으므로 함수 작성시 action 레퍼런스를 참고하세요.

 

함수를 정의했다면 아래와 같이 액션 훅을 워드프레스에 걸어야 합니다.

add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );

hook_name: 필수(string), 워드프레스가 제공하는 action 훅의 이름. (위 예제의 경우 ‘publish_post’)

your_function_name: 필수(string), hook_name으로 기술된 이벤트가 발생하였을때 실행시킬 함수의 이름 (위 예제의 경우 ‘email_friends’)
priority: 선택(integer, default: 10), action 훅이 여러개 걸려있는 경우 실행 순서를 지정할 수 있습니다. 숫자가 작을수록 먼저 실행됩니다.
accepted_args: 선택(integer, default: 1), 함수가 받을 파라미터의 개수입니다. 어떤 훅의 경우 1개이상의 파라미터를 전달해야하기 때문에 필요한 것입니다.

위 형식에 따라 앞선 예제는 아래와 같이 액션 훅을 걸 수 있을 것입니다.
[php]add_action ( ‘publish_post’, ‘email_friends’ );[/php]
이렇게 걸린 액션 훅은 publish_post 함수 내부의 do_action 함수에 의해 호출될 것입니다.

Actions Functions:
has_action
add_action
do_action
do_action_ref_array
did_action
remove_action
remove_all_actions

*

3.1.2 Filter

필터는 데이터와 밀접한 관계가 있습니다. 워드프레스는 자신의 기본 동작을 실행하기 전에 특정 시점에서 데이터를 가공할 수 있는 기회를 줍니다. 필터가 바로 시점에서 자신의 역할을 하게 됩니다. 필터는 데이터베이스와 브라우저(워드프레스가 만들어내는 페이지), 브라우저와 데이터베이스(워드프레스가 새로운 포스트, 덧글을 데이터베이스에 추가할때) 중간에 있다고 말할 수 있습니다. 워드프레스에서 입/출력되는 대부분 데이터들은 적어도 하나 이상의 필터를 거치는데, 여러분은 여기에 필터 API로 필터를 추가할 수 있습니다.

기본 과정은 아래와 같습니다.
i. 데이터를 필터링하는 PHP 함수를 정의한다.
ii. add_filter로 워드프레스에 필터 훅을 건다.
iii. 플러그인 파일에 위 내용들을 저장하고, 플러그인을 활성한다.

 

실습: 덧글에 저속한 단어들이 있는 경우 이를 필터링({censored}로 대체)하는 플러그인을 만들어봅시다.

function filter_profanity($content) {
 $profanities = array('badword','alsobad','...');
 $content=str_ireplace($profanities,'{censored}',$content);
 return $content;
 }

* 참고: str_ireplace는 대소문자를 구분하면서 문자를 대체하는 PHP 함수입니다. 위 예제의 경우 첫번째 파라미터로 배열을 넘겨주었기 때문에, 내부적으로 순환하면서 문자패턴을 검사합니다.

함수를 정의했다면 필터 훅을 워드프레스에 걸어야 합니다.

add_filter ( 'hook_name', 'your_filter', [priority], [accepted_args] );

hook_name: 필수(string), 워드프레스가 제공하는 filter 훅의 이름. (위 예제의 경우 ‘comment_text’)
your_filter: 필수(string), 필터링에 사용할 일반 PHP 함수 이름. 워드프레스 코어에 있는 함수여도 되고, 여러분이 플러그인 파일에 직접 정의한 함수여도 됩니다. (위 예제의 경우 ‘filter_profanity’)
priority: 선택(integer, default: 10), filter 훅이 여러개 걸려있는 경우 실행 순서를 지정할 수 있습니다. 숫자가 작을수록 먼저 실행됩니다.
accepted_args: 선택(integer, default: 1), 여러분의 함수가 받을 파라미터의 개수입니다. 어떤 훅의 경우 1개이상의 파라미터를 전달해야하기 때문에 필요한 것입니다.

위 형식에 따라 앞선 예제는 아래와 같이 필터 훅을 걸 수 있을 것입니다.
[php]add_filter(‘comment_text’,’filter_profanity’);[/php]
이렇게 걸린 필터 훅은 comment_txt 함수 내부의 apply_filters 함수에 의해 호출될 것입니다.

Filter Functions:
has_filter
add_filter
apply_filters
current_filter
merge_filters
remove_filter
remove_all_filters

*

3.1.3 그 외에 반드시 알아야할 것들

3.1.3.1 플러그할 수 있는 함수들

위와같이 액선과 필터로 훅을 거는 방법 말고도, 워드프레스 기본 제공 함수를 아예 덮어쓰기 함으로써, 워드프레스의 기본 행동을 변경할 수도 있습니다. 덮어쓰기 가능한 함수들의 집합을 Pluggable Functions라고 부르며 wp-includes/pluggable.php에 정의되어있습니다. (메뉴얼에서는 작은 함수 세트라고 말하고 있지만, 사실 매우 유용한 많은 함수들이 들어 있습니다.)
모든 플러그인을 읽어들인 후, 여전히 정의되지않은 플러그인 가능한 함수들만을 읽어들이므로, Pluggable Functions에 정의된 함수 중 필요한 것을 덮어쓰기하여 기본 행동을 변경하면 되는 것입니다. (function_exists 함수로 이미 정의되었는지를 확인함)

 

3.1.3.2. 플러그인 활성/비활성 훅

이 함수들은 플러그인이 활성/비활성될 때 작동합니다. 대부분 이 기능이 필요없을 테지만, 플러그인을 설치할때 기본 옵션값을 변경해야하는 등의 경우에 필요할 것입니다.
register_activation_hook
register_deactivation_hook

 

3.1.3.3 사용가능한 액션과 필터 목록

예제의 ‘publish_post’, ‘comment_text’ 같은… 액션과 필터 목록입니다.
Plugin API/Action Reference
Plugin API/Filter Reference
또는
Adam Brown’s WP Hooks Database

**

3.2 Template Tags를 이용하는 방법

플러그인을 만드는 또 한가지 방법은 사용자정의 Template Tags를 생성하는 것입니다. 원리는 매우 단순합니다. 예를들어, hr 태그를 삽입하는 사용자정의 Template Tag를 플러그인 파일에 정의해두고, 사용자가 자신의 theme의 필요한 부분에서 호출을 하도록 하는 것입니다.

// 플러그인 파일에서...
function insert_hr(){
   // code...
}
// theme에서...
insert_hr();

따라서, 개발자는 아래 그림과 같이 플러그인 홈페이지나 readme.txt, 플러그인 해더 등에서 Template Tags 사용법을 사용자들에게 자세히 알려주어야 합니다. 사용자들은 개발자가 어떤 Template Tag를 정의해두었는지 알 수가 없을테니까요.

 

 

* Template Tags: 블로그 템플릿에 데이터를 출력하려 하거나, 이를 커스터마이즈하고자 할 때 사용되는 함수/메서드.

Comment