RSS

관리자 메뉴에 플러그인 추가하기

플러그인의 관리자 페이지가 반드시 필요한 건 아니다. 하지만, 메타 데이터가 있을 때는 만드는 게 좋다. 그렇지 아니면 데이터베이스를 직접 갱신해야 하는 경우도 생길 수 있다. 상당히 귀찮다.

관리자 페이지 등록을 위해서는 생성한 플러그인을 워드프레스에 등록하고 활성화하는 작업이 필요하다. 플러그인을 등록하면 아래와 같이 해당 목록이 나타난다. 이를 활성화하면 사이트에서 바로 사용할 수 있다. 여기서는 직접 만든 Howdy Notices 플러그인 “활성화” 메뉴를 이용한다.

[플러그인 관리 페이지] 

p1

HowdyNotices 메뉴가 왼쪽에 추가되었다. 이 플러그인 관련 포스트 및 메타 테이터 설정이 가능하다.

[관리자 페이지에 플러그인 추가]p2

소스코드를 보면 관리 페이지 등록을 위해서는 register_post_type()과 이를 호출할 액션훅이 필요하다는 걸 알 수 있다.

// 플러그인이 활성화 될 때 플러그인을 등록하는 함수를 호출한다.
add_action('init', 'Howdy_create_notices');

Howdy_create_notices()에서 관리자 화면에 보일 메뉴명을 배열로 등록하고 register_post_type()을 호출하면 모든 준비가 끝난다. 나머지 기반 구조(포스트 등록 화면, 변경, 삭제, 메타 데이터 관련 편집화면 …)는 워드프레스에서 기본으로 제공한다. 기존 템플릿 페이지를 호출하기 때문에 별도 등록용 페이지를 만들 필요가 없다.

function Howdy_create_notices() {
    $labels = array(
     'name' => _x( 'HowdyNotices', 'post type general name' ), // Tip: _x('') is used for localization
    'singular_name' => _x( 'HowdyNotice', 'post type singular name' ),
    'add_new' => _x( 'Add New', 'Notice' ),
    'add_new_item' => __( 'Add New Notice' ),
    'edit_item' => __( 'Edit Notice' ),
    'new_item' => __( 'New Notice' ),
    'view_item' => __( 'View Notice' ),
    'search_items' => __( 'Search Notices' ),
    'not_found' => __( 'No Notices found' ),
    'not_found_in_trash' => __( 'No Notices found in Trash' ),
    'parent_item_colon' => ''
    );
    $notice_args = array(
    'labels' => $labels,
    'singular_label' => __('Notice', 'simple-notices'),
    'public' => true,
    'show_ui' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'rewrite' => false,
    'supports' => array('title', 'editor'),
    );
    register_post_type('howdynotices', $notice_args);
}

 

 

[Howdy Notices 관리자 페이지]
p3

 
 

태그: , ,

처음으로 만든 워드프레스 플러그인

초보 프로그래밍의 첫 시작을 알리는 “Hello World!”처럼 아주 단순한 플러그인을 만들어 보았다. 물론, 레퍼런스는 있다.^^ 워드프레스에 기본으로 포함된 Hello Dolly을 참고했다.

주요기능은

  1. 인사말을 랜덤하게 추출
  2. 현재 사용자 추출
  3. 테마 페이지 갱신 시 “인사말” + “현 사용자 이름” 출력 (테마 우측 상단)

사용한 액션훅은 wp_head 이다. 훅 이름을 변경하면 다양한 위치나 상태에서 액션을 취할 수 있다. 만약 wp_footer면 페이지 하단에 뿌려진다.

add_action( 'wp_head', 'hello_there' );

액션훅이 발생하면 hello_there 함수가 호출된다.

function hello_there() {
    global $current_user; 
    $chosen = getGreeting().$current_user->display_name; 
    echo "<p id='greeting'>$chosen</p>";
}

hello_there() 함수는 getGreeting()을 호출하여 인사말 목록을 랜덤으로 선택해 반환하고, 사용자 이름을 붙여서 화면에 출력한다.

function getGreeting() {
    $greetings = "Hello~
    Hi!
    Nice to meet you!
    Thank you!
    Thanks!
    Good Morning!
    Good Afternoon!
    Good Evening!
    Good Night~~";

    $greetings = explode( "\n", $greetings );
    return wptexturize( $greetings[ mt_rand( 0, count( $greetings ) - 1 ) ] );
}

글자를 꾸미기 위해 css 함수와 액션훅을 추가했다.

add_action( 'wp_head', 'greeting_css' );
function greeting_css() {
     // This makes sure that the positioning is also good for right-to-left languages
     $x = is_rtl() ? 'left' : 'right';
    echo "
     <style type='text/css'>
       #greeting {
       float: $x;
       padding-$x: 155px;
       padding-top: 5px;
       margin: 0;
       font-size: 15px;
       color:red;
      }
    </style>
    ";
}

[플러그인 실행 화면] : 우측 상단에 인사말과 사용자 이름 출력

wpplugin2

 
 

태그: ,

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

워드프레스의 기능을 확장하는 데 반드시 필요한 것이 후킹이다. 후킹(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 
) );

 

 

 
 

태그: , ,

워드프레스 데이터베이스 들여다보기.

프로젝트나 새로운 업무를 맡게 되면 업무 분석이 필수적이다. 쉬운 방법으로 소스 디버깅을  선택할 수 있지만, 이 보다는  데이터베이스를 분석하는 게 훨씬 효과적이다. 해당 DB를 이해하지 못한 상황에서 복잡한 비즈니스 로직으로 가득 찬 소스를 디버깅한다는 건 미로 속을 헤매는 것과 별반 다르지 않다.

워드프레스는 간단한 데이터베이스 테이블의 구조와 관계를 가지고 있다. 테이블 명만 봐도 대충 용도를 파악할 수 있을 정도로 테이블 간의 관계가 명료하다. 또한, 테이블마다 기본키(primary key)를 구성하는 친절함도 빼먹지 않았다.

WP3.0-ERD

[워드프레스 ERD]

주요 테이블을 상세히 들여다보자.

  • wp_comments 워드프레스의 모든 댓글을 저장한다. 각 댓글은 post ID를 통해 포스트와 연결된다.
  • wp_commentsmeta 댓글의 모든 메타테이터를 저장한다.
  • wp_links 링크 관리자 기능에서 추가한 모든 링크를 저장한다.
  • wp_options 설정 메뉴에서 저장한 모든 웹사이트 옵션값을 저장한다. 또한, 플러그인 옵션과 지금 쓰고 있는 테마와 플러그인, 기타 정보를 저장한다.,
  • wp_postmeta 포스트의 모든 메타데이터를 저장한다.
  • wp_posts 모든 포스트와 페이지, 미디어 레코드와 수정본을 저장한다. 대부분의 경우 워드프레스 테이블 중에서 가장 크다.
  • wp_terms 웹사이트에서 정의된 모든 택소노미 용어를 저장한다.
  • wp_term_relationships 포스트와 링크 등의 콘텐츠와 텍소노미 용어를 결합한다.
  • wp_term_taxonomy 각 용어에 할당된 택소노미를 정의한다.
  • wp_users 웹사이트에 생성된 모든 사용자 정보를 저장한다. (계정, 비밀번호, 이메일)
  • wp_usermeta 사용자의 메타데이터를 저장한다. (이름, 별명, 등급)

워드프레스에서 이 데이터베이스를 다루기 위한 클래스가 정의되어 있다. wpdb 클래스이고 wp-includes/wp-db.php에 있다. PHP코드에서 워드프레스 데이터베이스를 쿼리 한다는 것은 wpdb 클래스를 사용한다는 뜻이다.

 
 

태그: , ,

워드프레스 루프 총 정리

워드프레스에서 루프를 이용하는 방법은 총 4가지이다.

  • 기본 루프
  • WP_Query를 이용하는 루프
  • query_posts()를 이용하는 루프
  • get_posts()를 이용하는 루프

첫 번째, 기본 루프는 별다른 조작없이 디폴트 쿼리를 실행해 보여준다. (참고 : 워드프레스의 루프는 어떻게 돌아가는가.) 대부분의 테마에서 가장 많이 사용된다. 템플릿 태그를 통해 콘텐츠 정보를 확인할 수 있다.

두 번째, WP_Query를 이용하는 루프는 다수의 인스턴스를 생성해 데이터를 활용하고자 할 때 주로 사용한다. 멀티 루프를 통해 각각의 콘텐츠를 사용자 입맛대로 출력할 때 유용하다. (참고 : 워드프레스 루프 만들기[1])

세 번째, query_posts()를 이용하는 루프는 기본 쿼리 자체를 변경하고자 할 때 사용한다. 주로 Single 루프에 사용된다. (참고 : 워드프레스 루프 만들기[2])

마지막 get_posts()를 이용하는 루프는 쉽고 간편하게 콘텐츠 데이터를 불러올 때 사용한다. 주로 멀티 루프에 사용된다. (참고 : 워드프레스 루프 만들기[3])

 
 

태그: , , ,