워드프레스 플러그인 만들기 연수원

WordPress Plugin Development
이 문서는 워드프레스 플러그인 만드는 방법을 일목요연하게 설명하고 있습니다.

워드프레스 온라인 메뉴얼 원본에 충실하되, 설명이 부족하다고 생각되는 부분은 부가 설명과 참고 이미지를 추가하였습니다.
워드프레스 플러그인을 제대로 개발하기 위해서는 최소한 아래 4개 문서의 내용을 잘 숙지해야합니다만.

참고문서

1. 목차

1 목차
2 소개 / 준비
… 2.1 플러그인 이름과 파일 이름 짓기
… 2.2 플러그인 파일 위치
… 2.3 파일 헤더 작성
… 2.4 Readme 파일 작성
… 2.5 라이센스
3 플러그인 프로그래밍하기
… 3.1 WordPress Plugin Hook을 이용하는 방법
…… 3.1.1 Action
…… 3.1.2 Filters
…… 3.1.3 그 외에 반드시 알아야할 것들
……… 3.1.3.1 플러그할 수 있는 함수들
……… 3.1.3.2. 플러그인 활성/비활성 훅
……… 3.1.3.3 사용가능한 액션과 필터 목록
… 3.2 Template Tags를 이용하는 방법
4 데이터베이스에 플러그인 데이터 저장하기
… 4.1 워드프레스 옵션을 이용하는 방법
…… 4.1.1 새로운 옵션 생성
…… 4.1.2 데이터베이스에서 옵션 값 가져오기
…… 4.1.3 옵션 업데이트
… 4.2 Post Meta(일명 Custom Fields)를 이용하는 방법
… 4.3 새로운 데이터 테이블을 만드는 방법
5. 옵션 관리 메뉴/페이지 만들기
… 5.1 어느 위치에 메뉴를 만들까?
… 5.2 Top-Level 메뉴 만들기
… 5.3 Sub-Level 메뉴 만들기
6. 다국어 지원

2. 소개 / 준비

플러그인이란 응용프로그램을 확장/변경하기 위해 만드는 컴퓨터 프로그램을 말합니다.
워드프레스 역시 간편하게 플러그인을 설치하여 블로그의 기본 기능을 확장/변경할 수 있습니다. 워드프레스 온라인 메뉴얼에서는 워드프레스 플러그인에 대하여 아래와 같이 정의하고 있습니다.

“워드프레스 플러그인은 PHP 스크립트 언어로 작성된 프로그램 또는 함수(집합)로서, 블로그 기능과 서비스를 확장할 수 있다. 워드프레스 플러그인은 플러그인 API가 제공하는 ‘엑세스 포인트’와 ‘메서드’를 통해 블로그와 완벽하게 통합될 수 있다.”

코어 프로그램을 함부로 변경하게되면, 차후 여러가지 문제점에 직면할 가능성이 커집니다. 블로그의 기본 기능을 확장/변경하고자 한다면, 가능한 플러그인에서 답을 찾는 것이 옳습니다.
* 플러그인 정의에 언급한 ‘엑세스 포인트’와 ‘메서드’란… 이후 자세히 설명하게 될 Action과 Filter라는 Hook을 가르킵니다.

현재 워드프레스 웹사이트에 들어가보니 10,231개의 플러그인이 등록되어있네요. 하지만, 내 블로그에 꼭 맞는 플러그인이 없다면, 이 문서가 플러그인 개발에 도움이 될 것입니다.

2.1 플러그인 이름과 파일 이름 짓기

플러그인의 이름과 파일 이름을 지을 때에는 플러그인의 기능을 잘 표현하면서도, 다른 플러그인들의 이름과 중복되지않도록 유니크한 이름을 지어야할 것입니다.
- 플러그인 이름 짓기의 예: My Google Analyticator
- 파일 이름 짓기의 예: my-google-analyticator.php

2.2 플러그인 파일 위치

플러그인 기본 디렉토리인 wp-content/plugins/에 위치시킵니다. 파일이 여러개인 경우(readme.txt, php, image…) 아래 그림과 같이 서브디렉토리를 생성하여 그룹을 만드세요.

예: 위 그림은 “akismet”이라는 플러그인의 위치와 파일들을 보여주고 있다.

2.3 파일 헤더 작성

플러그인 PHP 파일 상단에 플러그인 정보를 반드시 작성해주어야 합니다. 워드프레스는 이 정보를 통해 플러그인의 존재를 인식하기 때문입니다. 파일 헤더는 아래와 같은 주석문으로 작성합니다.

<?php
 /*
 Plugin Name: Name Of The Plugin
 Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
 Description: A brief description of the Plugin.
 Version: The Plugin's Version Number, e.g.: 1.0
 Author: Name Of The Plugin Author
 Author URI: http://URI_Of_The_Plugin_Author
 License: A "Slug" license name e.g. GPL2
 */
 ?>

플러그인 파일에 헤더가 올바르게 작성되어있다면, 플러그인 관리페이지에 아래 그림과 같이 플러그인이 인식되며, 헤더에 작성한 정보들이 출력되고 있는 것을 알 수 있습니다.

2.4 Readme 파일 작성(선택)

플러그인 제작후 배포할 계획이 있다면, Readme 파일을 작성하여 플러그인 파일과 같은 폴더에 위치시켜야 합니다. 아래 그림과 같이 플러그인에 대한 자세한 정보를 사용자들에게 미리 알려주어야하기 때문입니다.

Readme 파일 작성시에는 표준 포멧을 따라야 하므로,
http://wordpress.org/extend/plugins/about/readme.txt를 참고하여 작성하세요.

2.5 라이센스(선택)

일반적으로 파일 헤더 정보에 함께 작성합니다. 대부분의 플러그인은 워드프레스가 사용하는 GPL2 또는 compatible with the GPL2 라이센스를 사용하고 있습니다. GPL2 라이센스를 사용하려 한다면 다음 라인을 플러그인에 포함하세요.

<?php
/* Copyright YEAR PLUGIN_AUTHOR_NAME (email : PLUGIN AUTHOR EMAIL)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2, as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
?>

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: 블로그 템플릿에 데이터를 출력하려 하거나, 이를 커스터마이즈하고자 할 때 사용되는 함수/메서드.

4. 데이터베이스에 플러그인 데이터 저장하기

플러그인 개발시, 대부분의 개발자들은 form 데이터를 데이터베이스에 저장할 필요성을 느낄 것입니다.
예를 들어, 사이드바 위젯에 최근 포스트 제목을 원하는 개수만큼 출력하는 플러그인(이미 존재하지만…)을 만들고자 한다면, 그 개수에 해당하는 데이터가 어디에든 저장되어있어야 할 것입니다.

플러그인에서 사용할 데이터를 데이터베이스에 저장하는 방법 세가지가 있습니다.
i. 워드프레스 옵션을 이용하는 방법
ii. Post Meta(일명 Custom Fields)를 이용하는 방법
iii. 새로운 데이터 테이블을 만드는 방법
그럼 하나하나 자세히 살펴보도록 하겠습니다.

4.1 워드프레스 옵션을 이용하는 방법

각 데이터 마다 고유의 이름이 있고, 소량의 데이터를 저장하는데 적합합니다. — 사이트 소유자가 플러그인을 세팅한 이후에 웬만해서는 바뀔 일이 없을 것으로 기대되는 데이터들입니다.
워드프레스를 설치하면, 데이터베이스에 wp_options (‘wp_’는 접두어)라는 테이블이 생성되어있을 것입니다. 설치과정에서 이미 여기에 수많은 옵션 데이터들이 저장되었을 텐데, 블로그 타이틀, 관리자 이메일, 사이트 주소, 문자셋, 현재 템플릿 등이 바로 옵션 데이터들입니다. 플러그인 제작시 바로 이 테이블을 이용하여 얼마든지 데이터를 추가/변경/삭제할 수 있으며, 이 작업을 손쉽게 할 수 있는 함수들을 제공합니다. (add_option, get_option, update_option, …)

위 그림은 wp_options 일부를 캡처한 것입니다. 옵션 값으로는 저장할 수 있는 데이터 타입은 string, array, PHP object 입니다. (PHP object인 경우, “serialized” 또는 “json_encode”하여 문자열로 바꾸어서 저장해야합니다. 물론 값을 받을때에는 각각 “unserialized”, “json_decode” 해야하고…)

4.1.1 새로운 옵션 생성

add_option($name, $value, $deprecated, $autoload);

* 이미 같은 이름의 옵션이 존재하면 이 명령은 무시됩니다.
name: 필수(string). 옵션의 이름
value: 선택(mixed, 디폴트는 공백문자) 옵션의 값
deprecated: 선택(string, 디폴트는 공백문자), 워드프레스에서 더이상 사용되지 않음. $autoload 파라미터를 사용하려면 공백문자나 null을 입력.
autoload: 선택 (‘yes’ 또는 ‘no’, 디폴트는 ‘yes’) ‘yes’로 세팅되어있다면, wp_load_alloptions 함수 호출시 데이터베이스에서 읽어들이는 옵션의 리스트에 포함됨.

4.1.2 데이터베이스에서 옵션 값 가져오기:

[php]get_option($option);[/php]
option: 필수(string) 가져오려는 옵션의 이름. 워드프레스 디폴트 옵션 목록은 Option Reference 에서 볼 수있습니다.

4.1.3 옵션 업데이트

update_option($option_name, $newvalue);

* 업데이트하려는 옵션이 없는 경우, 새로운 옵션을 생성합니다. 따라서 $deprecated 또는 $autoload 파라미터를 사용하지 않는다면, add_option대신 update_option을 사용해도 되는 것입니다.
option_name: 필수(string), 옵션의 이름
newvalue: 필수(string|array|object) 옵션의 값

4.2 Post Meta(일명 Custom Fields)를 이용하는 방법

개개의 posts, pages, attachments와 관계하는 데이터로서 적합합니다. posts, pages, attachments와 같은 데이터들은 각각 제목, 내용, 저자 아이디, 등록일, 수정일 등 다양한 데이터들을 가지고 있지만, 그 외에 특별한 사용자정의 데이터를 덧붙이고 싶다면, Post Meta를 이용할 수 있습니다.
다음 예제는 각 포스트 마다 mood와 listening_to라는 사용자정의 데이터를 입력/수정/삭제하는 플러그인의 예를 보여줍니다.
post_meta Function Examples
이 예제를 통해 posts, pages, attachments의 메타데이터를 이용한 플러그인을 제작할 수 있을 것입니다. 또한 post meta는 포스트 에디터 하단에 있는 Custom Fields 패널에서도 손쉽게 추가할 수 있습니다.(아래 그림)

4.3 새로운 데이터 테이블을 만드는 방법

개개의 posts, pages, attachments, comments와 관계하되, 특히 시간이 지남에 따라 계속 데이터가 늘어나고, 각각의 데이터들에게 고유한 이름이 필요없을 때 적합합니다. 이 방법은 Creating Tables with Plugins 에서 자세히 알 수 있지만, 워드프레스 데이터베이스 시스템을 미리 이해하고 있어야합니다. (이 부분에 대해서도 조만간 한글 메뉴얼을 만들어볼까 합니다.)

5. 옵션 관리 메뉴/페이지 만들기

데이터베이스에 옵션 데이터를 저장하고 관리해야하는 플러그인인 경우(4.1과 같이), 아래 그림처럼 이를 관리할 수 있는 메뉴와 페이지가 필요할 것입니다.

관리 메뉴/페이지를 만드는 절차는 다음과 같습니다.
i. 메뉴를 만들어내는 코드를 포함하는 함수를 만든다.
ii. 이 함수를 “admin_menu” 액션 훅으로 등록한다.
iii. ii 단계에서 만든 관리메뉴를 클릭했을때 나올 HTML 페이지(스크린)를 만든다.
* 종종 개발자들은 ii 단계를 건너뛰고 직접 add_options_page를 실행시키곤하는데, 이렇게하면 에러를 발생시키므로, 반드시 위 과정을 따라야합니다.

5.1 어느 위치에 메뉴를 만들까?

메뉴는 top-level에 만들 수도 있고, sub-level에 만들 수도 있습니다.
top-level로 만드는 경우는 매우 드물지만, 워드프레스의 어드민 메뉴 구분/카테고리와 컨셉이 완전히 다르거나, 너무 많은 서브메뉴들을 가지고 있을 경우에는 top-level로 만드는 것이 적절할 것입니다.
sub-level로 메뉴를 추가하려 한다면, 여러분의 메뉴가 위치하게 될 top-level 메뉴를 결정해야할 것입니다. 워드프레스의 기본 top-level 메뉴는 아래와 같습니다.
Dashboard, Posts, Media, Links, Pages, Comments, Appearance, Plugins, Users, Tools, Settings

5.2 Top-Level 메뉴 만들기

* Top-Level로 메뉴를 만드는 일은 매우 드뭅니다. 필요없다고 생각되면, Sub-Level 메뉴 만들기로 넘어가셔도 됩니다.

<?php add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function,
$icon_url, $position ); ?>

page_title: 필수, 메뉴를 클릭했을때 나오는 페이지의 타이틀
menu_title: 필수, 메뉴의 타이틀
capability: 필수, 메뉴와 페이지 접근 권한(User levels)
menu_slug: 메뉴 페이지의 고유 슬러그.
function: 메뉴의 페이지를 디스플레이하는 함수 이름.
icon_url: 선택, 메뉴 아이콘 url
position: 선택, 메뉴가 나타날 위치. 이 값을 생략하면 메뉴 최하단에 나타남.

실습: 위 이미지와 같이 Top-Level 메뉴와 페이지를 만들어봅시다.

add_action('admin_menu', 'my_top_menu');
function my_top_menu() {
   add_menu_page('my top menu title', 'my top menu', 9, 'my-top-menu', 'my_top_menu_page');
}
function my_top_menu_page() {
   if (!current_user_can('manage_options'))
      wp_die( __('You do not have sufficient permissions to access this page.') );
?>
   <div class='wrap'>
      <h2>My Top Menu Page</h2>
      <p>My Top Menu Page Test.</p>
   </div>
<? } ?>

*

5.3 Sub-Level 메뉴 만들기

<?php add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function); ?>

page_slug: top-level의 슬러그 또는 파일 이름. 사용자정의 top-level인 경우 슬러그를, 그렇지않은 기본 워드프레스 top-level 메뉴인 경우 파일 이름을 입력.

* Top-Level 메뉴별 page_slug:
 Dashboard - 'index.php'
 Posts - 'edit.php'
 Media - 'upload.php'
 Links - 'link-manager.php'
 Pages - 'edit.php?post_type=page'
 Comments - 'edit-comments.php'
 Appearance - 'themes.php'
 Plugins - 'plugins.php'
 Users - 'users.php'
 Tools - 'tools.php'
 Settings - 'options-general.php'
//example
<?php add_submenu_page('index.php',...); ?>

page_title: 필수, 메뉴를 클릭했을때 나오는 페이지의 타이틀
menu_title: 필수, 메뉴의 타이틀
capability: 필수, 메뉴와 페이지 접근 권한(User levels)
menu_slug: 메뉴 페이지의 고유 슬러그
function: 메뉴의 페이지를 디스플레이하는 함수 이름.

Sub-Level 메뉴 생성할 때, 아래와 같은 Wrapper Function을 간편하게 사용할 수도 있습니다.

* Top-Level 메뉴별 Sub-Level 메뉴 생성 Wrapper Function:
 Dashboard - add_dashboard_page
 Posts - add_posts_page
 Media - add_media_page
 Links - add_links_page
 Pages - add_pages_page
 Comments - add_comments_page
 Appearance - add_theme_page
 Plugins - add_plugins_page
 Users - add_users_page
 Tools - add_management_page
 Settings - add_options_page
//example:
<?php add_dashboard_page($page_title, $menu_title, $capability, $menu_slug, $function);?>

*

실습1: 아래 이미지와 같이 Setting 메뉴에 메뉴 아이템 하나를 추가하고, 추가된 메뉴를 클릭하면 페이지가 출력되도록 해봅시다.

<?php
add_action('admin_menu', 'my_plugin_menu');
function my_plugin_menu() {
   add_options_page('My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options');
}
function my_plugin_options() {
   if (!current_user_can('manage_options'))
     wp_die( __('You do not have sufficient permissions to access this page.') );
?>
   <div class='wrap'>
   <h2>My Plugin Options</h2>
   <p>Here is where the form would go if I actually had options.</p>
   </div>
<? } ?>

*

실습2: 아래 이미지와 같이 사용자정의 Top-Level 메뉴를 만들고, 그 메뉴에 Sub-Level 메뉴를 추가해봅시다.

add_action('admin_menu', 'my_top_menu');
function my_top_menu() {
 add_menu_page('my top menu title', 'my top menu', 9, 'my-top-menu', 'my_top_menu_page');
 add_submenu_page('my-top-menu', 'My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options');
 }
function my_top_menu_page() {
 if (!current_user_can('manage_options'))
     wp_die( __('You do not have sufficient permissions to access this page.') );
 ?>
 <div class='wrap'>
 <h2>My Top Menu Page</h2>
 <p>My Top Menu Page Test.</p>
 </div>
 <?
 }
function my_plugin_options() {
 if (!current_user_can('manage_options'))
     wp_die( __('You do not have sufficient permissions to access this page.') );
 ?>
 <div class='wrap'>
 <h2>My Plugin Options</h2>
 <p>Here is where the form would go if I actually had options.</p>
 </div>
 <? } ?>

*

실습 3: 플러그인 옵션 데이터를 데이터베이스에 저장해봅시다.

add_action('admin_menu', 'mt_add_pages');
// 훅에 대한 액션 함수
 function mt_add_pages() {
 // Settings 메뉴에 서브메뉴를 만듬.
 add_options_page('Test Settings', 'Test Settings', 'manage_options', 'testsettings', 'mt_settings_page');
 }
function mt_settings_page() {
 // 유저 접근 권한 체크
 if (!current_user_can('manage_options'))
     wp_die( __('You do not have sufficient permissions to access this page.') );
// 필드와 옵션 이름으로 사용할 변수
 $opt_name = 'mt_favorite_color';
 $hidden_field_name = 'mt_submit_hidden';
 $data_field_name = 'mt_favorite_color';
// 현재 데이터베이스에 저장된 옵션 값 가져오기
 $opt_val = get_option( $opt_name );
// Form을 Submit 했다면...
 if( isset($_POST[ $hidden_field_name ]) && $_POST[ $hidden_field_name ] == 'Y' ) {
 $opt_val = $_POST[ $data_field_name ];
// 포스트값을 데이터베이스에 저장
 update_option( $opt_name, $opt_val );
// 화면에 업데이트했다는 메세지를 표시
 echo '<div><p><strong>settings saved</p></strong></div>';
 }
 // 옵션 설정 화면을 표시
 ?>
 <div class='wrap'>
 <h2>Menu Test Plugin Settings</h2>
 <form method="post" action="">
 <input value="Y">
 <p>Favorite Color: <input value="<?=$opt_val?>"></p>
 <p><input value="Save Changes" /></p>
 </form>
 </div>
 <?php } ?>

* 옵션 페이지 만드는 방법은 위 예제에서 크게 벗어나지 않습니다. 자세한 내용은 Creating Options Pages를 참조하세요.

6. 다국어 지원(선택)

워드프레스가 전세계에서 사용되고 있는 만큼. 플러그인을 배포할 계획이 있다면, 다국어 지원에도 신경쓰면 좋겠지요?
플러그인은 언어파일을 자동으로 로드하지 않으므로, 아래와 같이 파일을 로드해야합니다.

load_plugin_textdomain('your-unique-name','/wp-content/plugins/plugin-name/location-of-mo-po-files/');

플러그인 파일 등에서 흔히 볼 수 있는 __ 함수와 _e 함수는 아래와 같은 구문 형식을 갖습니다.

__('String name','your-unique-name');
 _e('String name','your-unique-name');

__ 함수는 번역된 텍스트를 return하고, _e 함수는 echo하는 차이가 있습니다.

자세한 내용은 I18n for WordPress Developers를 참고하세요.

끝.


WordPress Plugin Development | 워드프레스 플러그인 만들기 | 2010.7.13 | 이태한

Leave Comments

댓글 쓰기 권한이 없습니다. 회원 가입후에 사용 가능합니다