RSS

카테고리 보관물: 워드프레스 올라타기

워드프레스 기초 및 코어 엔진을 알아보자.

워드프레스 위젯 만들기

워드프레스는 다양한 위젯을 제공하며 사용자가 직접 생성도 가능하다. 사이드바에 기능별로 묶여 있는 위젯을 쉽게 볼 수 있는데, “최근글”, “카테고리”,”방문자 카운트”, “달력” 등이 모두 위젯이다. 하나의 위젯은 하나의 클래스이기 때문에 사이드바에 같은 위젯을 여러 개 올려도 무방하다.

위젯의 구성은 매우 간단하다. 먼저 WP_Widget를 상속한 클래스를 생성한다. 다음으로 정해진 네 개의 기능별 function을 만들어 필요한 기능을 구현하면 된다.

class My_Widget extends WP_Widget {

	public function __construct() {
		// 생성자, 위젯이 실행되면 가장 먼저 처리된다. 
	}

 	public function form( $instance ) {
		// 관리자 페이지에 나타날 위젯 폼이다. 
	}

	public function update( $new_instance, $old_instance ) {
		// 위젯 옵션을 저장할 때 처리한다. 
	}

	public function widget( $args, $instance ) {
		// 위젯의 실제 출력될 모습. 
	}

}

위젯을 만들었으면 초기화할 훅을 선택해야 한다. 위젯 초기화 훅은 widgets_init이며 기본 워드프레스 위젯이 등록되는 순간 실행된다.

add_action('widgets_init', 'my_register_widgets');

초기화가 완료되면 사용자가 정의한 함수를 콜백하여 본격적으로 위젯을 이용할 수 있다.

function my_register_widgets() {
     register_widget('My_Widget');
}

register_widget()을 이용해 사용자가 만든 위젯, My_Widget 클래스를 호출한다. 생성자(__construct)가 자동 호출되어 사용자 위젯 정보를 등록하고 관리자 페이지 위젯 메뉴에 추가된다. 

class My_Widget extends WP_Widget {
function __construct(){
 $widget_ops = array(' ' => 'My_Widget',
 'description'=> 'A widget that displays a admin\'s notice.');
 $this->WP_Widget('my_widget_notice','Notice Widget',$widget_ops);
 }
...

위젯초기등록

위젯을 사이드바에 추가하려면 드래그해서 원하는 위치에 놓으면 된다.

위젯폼추가1

관리자 페이지에서 위젯을 변경할 때는 form(), update() 함수를 호출한다. form()은 위젯 관리자 페이지로 “저장하기” 버튼을 누르면 update()가 호출되어 DB에 등록된다. 위젯의 “삭제”,”닫기”,”저장하기”는 위젯의 기본 기능으로 별도 구현할 필요가 없다. 메타 데이터의 wp_optoins 테이블에 저장된다. 

사용자위젯추가

class My_Widget extends WP_Widget {
  ...
 function form($instance){ 
 $defaults = array('title'=> 'My Notice', 'name'=> '', 'notice' => '');
 $instance = wp_parse_args((array)$instance, $defaults);
 $title = strip_tags($instance['title']);
 $name = strip_tags($instance['name']);
 $notice = strip_tags($instance['notice']);
 ?>
 <p><?php _e('Title')?>:
 <input class="widefat" name="<?php echo $this->get_field_name('title');?>" 
 type="text" value="<?php echo esc_attr($title)?>" /></p>
 <p><?php _e('Notice')?>:
 <textarea class="widefat" name="<?php echo $this->get_field_name('notice');?>">
 <?php echo esc_attr($notice);?></textarea></p>

 <?php 
 }

 function update($new_instance, $old_instance){
 $instance = $old_instance;
 $instance['title'] = strip_tags($new_instance['title']);
 $instance['notice'] = strip_tags($new_instance['notice']); 
 return $instance;
 }
  ...

}

블러그의 사이드 바에 위젯이 제대로 생성되었는지 확인해보자. 이 때  widget()함수가 호출된다.

사이드바위젯

class My_Widget extends WP_Widget {
...
function widget($args, $instance){
 extract($args);
 $title = apply_filters('widget_title', $instance['title']);
 $notice = empty($instance['notice']) ? '&nbsp' :
 apply_filters('widget_notice', $instance['notice']);
if ( !empty($title)) {
 echo $before_title . $title . $after_title;
 }
 echo $before_widget;
 echo '<p>' . '==>' . ': ' . $notice . '</p>';
 echo $after_widget;
 }
 }

 

Advertisements
 
 

태그: ,

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

이전에 포스트 타입(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

 
 

태그:

최상위 메뉴 생성하기

사용자가 직접 만든 관리자 메뉴를 추가해 보자.

add_menu_page() 함수를 호출하면 간단하게 탑 메뉴가 생성된다. 기본 제공되는 워드프레스 메뉴와 같은 레벨로 등록된다. 위치를 지정하지 않으면 제일 아래쪽에 붙고, 위치값을 주면 원하는 곳에 생성할 수 있다.

    add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );

$function 인자에 콜백 함수를 지정해서 세부 설정 페이지를 구성할 수 있따. 메뉴가 호출되면서 콜백함수가 호출되는 식이다. $position으로 탑 메뉴 위치를 조정한다. 기존 설정된 것과 중복되지 않도록 주의해야 하는데, 가능하면 정수형보다는 소수점을 주면 중복을 최소화 할 수 있다. 예를 들어 Posts와 Media 사이에 추가하고 싶으면 6.3 값을 준다. 정수가 아닌 decimal형태로 주는 게 좋다.

 2 Dashboard
 4 Separator
 5 Posts
 10 Media
 15 Links
 20 Pages
 25 Comments
 59 Separator
 60 Appearance
 65 Plugins
 70 Users
 75 Tools
 80 Settings
 99 Separator

탑 메뉴에 하위 메뉴를 추가하려면 add_submenu_page()를 호출한다. 상위 메뉴와의 연관성을 위해 부모명을 입력해 주면 된다. 서브메뉴의 설정 페이지 역시 $function에 정의하여 콜백 처리하면 된다.

    add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function );

관리자메뉴

 

 
 

태그: ,

관리자 메뉴 생성 총정리

워드프레스는 편리하고 유연한 관리자 메뉴를 제공한다. 유연하다는 표현은 사용자가 관리자 메뉴를 간단하게 추가할 수 있기 때문이다. 보통 플러그인을 하나 추가할 때마다 관리자 메뉴가 추가된다.

관리자 메뉴를 추가하는 방법은 크게 세 가지다. 일반적으로 최상위 또는 기존 메뉴의 하위메뉴 형태로 생성한다. 그리고 기존 포스트 타입을 이용하는 방법이 있다. 포스트 타입을 이용할 때는 정해진 템플릿의 값을 정의해야 한다. 메뉴의 순서는 함수의 인자값을 통해 바꿀 수 있다.

  • 최상위 레벨에 메뉴 추가 : add_menu_page() 호출
  • 기존 메뉴의 하위에 추가 : add_submenu_page() 호출
  • 포스트 타입 이용 : register_post_type() 호출

관리 메뉴를 클릭했을 때 나타나는 설정 페이지도 세 가지 형태다. 완전하게 새로운 페이지를 생성하거나 워드프레스에서 기본 제공한 관리자 페이지에 섹션을 구성하거나 포스트 타입이 제공하는 템플릿을 이용하는 것이다.

  • 새로운 설정 페이지 생성 : add_menu_page() / add_submenu_page()의 콜백 함수를 정의
  • 기존 설정 페이지에 추가 : add_settings_section() 이용
  • 포스트 타입 템플릿 이용 : register_post_type() 인자로 정의된 레이블과 템플릿 이용

사용자 메뉴가 생성되었으면 그 설정페이지를 구성해야 한다. 거기에 사용되는 사용자 필드의 값을 저장하거나 불러올 수 있어야 한다.

  • 별도의 옵션으로 등록하여 사용 : add_option(), update_option(), get_option(), delete_option()
  • 기존 설정 페이지 옵션값으로 등록하여 사용 : add_settings_field(), register_setting()
 
 

태그: , , ,

워드프레스 후킹에 대해 알아보자(액션훅과 필터훅)

워드프레스의 기능을 확장하는 데 반드시 필요한 것이 후킹이다. 후킹(hooking)이란 운영체제나 애플리케이션 등에서 발생하는 함수 호출, 메시지, 이벤트 등을 중간에 바꾸거나 가로채는 명령, 방법, 기술이나 행위를 말한다.

워드프레스에서 후킹은 프로그래밍의 이벤트 처리와 비슷하다. 어떤 이벤트에 대해 미리 정의된 함수를 호출하듯, 워드프레스의 액션에 대해 임의의 함수를 호출하여 요건을 처리한다.

후킹에는 액션훅과 필터훅이 있다. 차이점은 실행 시점과 용도에 있다. 액션훅은 워드프레스 내부의 이벤트가 발생할 때 실행된다. 예를 들면 새글이 등록되거나 댓글이 달릴 때 이를 후킹 하여 임의의 함수를 호출한다. 반면에 필터훅은 DB에 저장하거나 화면에 출력하기 전에 콘텐츠 내용을 변경할 때 사용된다. 포스트나 페이지 내용을 가져와서 화면 출력 전에 콘텐츠를 변경할 수 있다.

  • 액션훅 : 워드프레스 이벤트 발생 시
  • 필터훅 : 매체에 저장하거나 화면 출력하기 전 콘텐츠 변경

[ 액션훅 예제  ]

function new_email_comment() {
    wp_mail('me@example.net', 'The subject', '<p>The <em>HTML</em> message</p>');
}

add_action('comment_post','new_email_comment');

댓글이 달리면 new_email_comment() 함수를 호출하여 메일을 발송한다. 자주 사용하는 액션훅은 다음과 같다.

  • publish_post : 새로운 포스트가 발행될 때
  • create_category : 새로운 카테고리가 생성될 때
  • switch_theme : 테마를 변경할 때

더 자세한 정보는 codex 사이트를 참조해야 한다. 너무 많다.

 

[ 필터훅 예제 ]

function replace_content($content) {
    $content = str_ireplace('ABC','CBA',$content);
    return $content
}
add_filter('the_content','replace_content');

콘텐츠가 화면에 출력되기 전, 더 정확히 the_post() 함수를 처리하는 중에 호출되어 문자열을 변경한다. 원천 데이터(DB)는 변경하지 않으며 화면 출력만 바뀐다.

자주 사용되는 필터훅은

  • the_content 포스트나 페이지의 콘텐츠가 출력될 때
  • the_title 포스트나 페이지의 제목이 출력될 때
  • comment_text 댓글이 출력될 때
  • wp_title 페이지 제목이 출력될 때

더 자세한 정보는 역시 codex 사이트를 참조한다.

 

 
 

태그: ,

워드프레스 플러그인 활성화/비활성화 하려면

플러그인을 생성할 때 register_activation_hook를 사용한다. 이 함수는 워드프레스 플러그인 메뉴에서 플러그인을 활성화할 때 실행된다. 두 개의 파라메터를 받는데 첫 번째는 메인 플러그인 파일 경로이고, 두 번째는 플러그인 활성활 할 때 실행되는 함수명이다.

register_activation_hook( __FILE__, 'myplugin_activate' );
function myplugin_activate() { 
 global $wp_version;
 If(version_compare ($wp_version, "2.9","<")) {
    deactivate_plugins(basename(__FILE__));
    wp_die("이 플러그인을 실행하려면 워드프레스 2.9이상 버전을 설치하세요.");
 }
}

register_activation_hook은 myplugin_activate 함수를 호출하면 버전이 낮을 경우 deactivate_plugins 함수를 호출하여 플러그인을 비활성화 시킨다.

플러그인이 비활성화되면 register_deactivation_hook가 자동 실행된다. 이 때 플러그인 비활성화 관련 처리를 해주면 된다.

    register_deactivation_hook(__FILE__, 'myplugin_deactivate')

    function myplugin_deactivate() {

       // 작업 코드

    }

deactivate_plugins

 
 

태그:

워드프레스 DB 쿼리 사용법 총정리

데이터베이스에서 원하는 데이터를 다루기 위해서 쿼리를 사용한다. $wpdb에서 이를 지원하는 다양한 메소드를 제공한다. 주로 데이터의 조회(Select), 등록(Insert), 갱신(Update), 삭제(Delete) 작업이 그것이다. 메소드 사용법을 알아보자.

[$wpdb DB 메소드]

  • 단일 행, 단일 열의 값을 가져올 때 : get_var()
  • 단일 행, 다중 열의 값을 가져올 때 : get_row()
  • 다중 행, 다중 열의 값을 가져올 때 : get_results()
  • 데이터의 등록 : insert()
  • 데이터의 갱신 : update()
  • 데이터의 등록/갱신/삭제 : query()

 

1. 단일 행, 단일 열의 값을 가져올 때 : get_var()

  • 반환되는 레코드의 카운트나 합계 등 단일 값을 가져올 때 사용한다.
<?php
$user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
echo "<p>User count is {$user_count}</p>";
?>

2. 단일 행, 다중 열의 값을 가져올 때 : get_row()

  • 하나의 레코드만 반환되는 경우 사용하며, 세 가지 형태로 결과값을 이용할 수 있다.

(1) 오브젝트 필드명으로 가져오기

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10");

echo $mylink->link_id; // prints "10"

(2) 연관 배열로 가져오기(필드명)

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A);

echo $mylink['link_id']; // prints "10"

(3) 수치 배열로 가져오기(인덱스 번호)

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_N);

echo $mylink[1]; // prints "10"

3. 다중 행, 다중 열의 값을 가져올 때 : get_results()

  • 일반적으로 가장 많이 사용될 쿼리이다. 다중 행과 다중 열을 루프를 이용해 가져와서 사용한다.
$fivesdrafts = $wpdb->get_results( 
	"
	SELECT ID, post_title 
	FROM $wpdb->posts
	WHERE post_status = 'draft' 
		AND post_author = 5
	"
);

foreach ( $fivesdrafts as $fivesdraft ) 
{
	echo $fivesdraft->post_title;
}

4. 데이터의 등록 : insert()

  • insert 문을 직접 작성하지 않고 테이블명, 칼럼 변수/값을 직접 지정한다. 내부적으로 prepare 함수를 호출한다.
$wpdb->insert( 
	'table', 
	array( 
		'column1' => 'value1', 
		'column2' => 123 
	), 
	array( 
		'%s', 
		'%d' 
	) 
);

5. 데이터의 갱신 : update()

  • update 문을 직접 작성하지 않고 테이블명, 칼럼 변수/값을 직접 지정한다. 내부적으로 prepare 함수를 호출한다.
$wpdb->update( 
	'table', 
	array( 
		'column1' => 'value1',	// string
		'column2' => 'value2'	// integer (number) 
	), 
	array( 'ID' => 1 ), 
	array( 
		'%s',	// value1
		'%d'	// value2
	), 
	array( '%d' ) 
);

6. 데이터의 등록/갱신/삭제 : query()

  • 모든 실행쿼리를 실행할 수 있다. 주로 Insert, Update, Delete에 사용된다.
$metakey	= "Harriet's Adages";
$metavalue	= "WordPress' database interface is like Sunday Morning: Easy.";

$wpdb->query( $wpdb->prepare( 
	"
		INSERT INTO $wpdb->postmeta
		( post_id, meta_key, meta_value )
		VALUES ( %d, %s, %s )
	", 
        10, 
	$metakey, 
	$metavalue 
) );

 

 

 
 

태그: , ,