RSS

태그 보관물: 워드프레스 메타박스

관리자 페이지에 메타박스 만들기

이전에 포스트 타입(register_post_type() 호출)을 이용해 커스텀 포스트를 생성해 보았다. 이번에는 이 포스트의 메타 데이터를 등록/변경할 수 있는 메뉴를 만들어 확장해 보자.

먼저 사용할 메타 데이터를 정의하자. $jhp_meta_box 메타 데이터에 포스트 레벨과 멤버 접근 권한 메뉴를 추가한다. 콤보를 통해 포스트의 상.중.하 중요도를 지정하고 체크박스는 회원/비회원 공개 여부를 결정하게 된다.

$jhp_meta_box = array(
 'id' => 'jhp_meta_box',
 'title' => 'Level Configuration',
 'context' => 'side',
 'priority' => 'low',
 'fields' => array (
 array(
 'name' => 'Level',
 'id' => 'levelselection',
 'type' => 'select',
 'desc' => 'Choose the level of the post',
 'options' => array('High','Medium','Low')
 ),
 array(
 'name' => 'Member Only',
 'id' => 'memberOnly',
 'type' => 'checkbox',
 'desc' => 'Member Only?'
 )
 )
);

메타 박스를 관리자 페이지에 추가하자. add_action의 admin_menu 액션훅을 호출하여 메뉴를 등록한다. 메뉴가 생성되면 jhp_render_meta_box() 함수가 콜백되어 관리자 메타 박스 화면이 만들어진다.

function howdy_add_meta_boxes() {
$hn_meta_box['context'], $hn_meta_box['priority']);
 global $jhp_meta_box;
 add_meta_box($jhp_meta_box['id'],$jhp_meta_box['title'],'jhp_render_meta_box', 'howdynotices',$jhp_meta_box['context'],$jhp_meta_box['priority']);
}

렌더링 페이지 만드는 함수는 다음과 같다. 콤보와 체크박스의 값을 비교해 화면에 나타낸다.

function jhp_render_meta_box() {
 global $jhp_meta_box, $post;
 
 echo '<input type="hidden" name="jhp_meta_box" value="', wp_create_nonce(basename(__FILE__)), '" />';
 echo '<table class="form-table">';
 foreach ($jhp_meta_box['fields'] as $field) {
 $meta = get_post_meta($post->ID, $field['id'], true);
 echo '<tr>';
 echo '<td>', $field['desc'], '</td>';
 echo '<td>';
 switch ($field['type']) {
 case 'select':
 echo '<select name="', $field['id'], '" id="', $field['id'], '">';
 foreach ($field['options'] as $option) {
 echo '<option', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
 }echo '</select>';
 break;
 case 'checkbox' :
 echo '<input type="checkbox" value="1" name="', $field['id'], '" id="', $field['id'], '"', $meta ? ' checked="checked"' : '', ' />';
 break;
 }
 echo '</td>';
 echo '</tr>';
 }
 echo '</table>';
}

메타 박스가 포스트 오른쪽에 나타났다. 메타 데이터의 레벨 및 접근 권한을 변경해 갱신해 보자.

metat1

메타 데이터의 저장 및 변경을 위한 코드도 필요하다. add_action의 save_post 훅을 이용해 메타 박스 저장 함수를 호출한다.

function jhp_save_meta_data($post_id) {
 global $jhp_meta_box;
 
 if (!isset($_POST['jhp_meta_box']) || !wp_verify_nonce($_POST['jhp_meta_box'], basename(__FILE__))) {
 return $post_id; 
 }
 
 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
 return $post_id;
 }
 if ('page' == $_POST['post_type']) {
 if (!current_user_can('edit_page', $post_id)) {
 return $post_id;
 }
 } elseif (!current_user_can('edit_page', $post_id)) {
 return $post_id;
 }
 foreach ($jhp_meta_box['fields'] as $field) {
 if(isset($_POST[$field['id']])) {
 $old = get_post_meta($post_id, $field['id'], true);
 $data = $_POST[$field['id']];
 
 if (($data || $data == 0) && $data != $old) {
 update_post_meta($post_id, $field['id'], $data); 
 } elseif ('' == $data && $old) {
 delete_post_meta($post_id, $field['id'], $old);
 }
 } else {
 delete_post_meta($post_id, $field['id']);
 }
 }
}

메타 데이타는 wp_postmeta테이블에 저장된다. wp_posts 테이블과는 post_id를 키로 연결된다.

meta2

Advertisements
 
 

태그: