데브포일 홈
WordPress 자동화
Guest
STAGE 9 · Lv.47

wpdb 클래스와 직접 쿼리

$wpdb 클래스의 주요 메서드(get_results, get_row, get_var, insert, update, delete, prepare)를 배우고, SQL 인젝션 방지와 커스텀 테이블 쿼리를 실습합니다.

$wpdb 클래스 소개

왜 $wpdb를 사용하는가?

WordPress는 데이터베이스 작업을 위한 전용 클래스인 $wpdb를 제공합니다. 이 클래스는 wp-includes/class-wpdb.php에 정의되어 있으며, WordPress의 모든 데이터베이스 작업을 처리합니다.


PHP에서 MySQL을 직접 사용할 수도 있지만(mysqli_* 함수나 PDO), WordPress 개발에서는 반드시 $wpdb를 사용해야 하는 이유가 있습니다:


1. 보안 - $wpdb->prepare() 메서드는 SQL 인젝션 공격을 방지하는 매개변수화된 쿼리를 제공합니다. 직접 SQL 문자열을 조합하는 것보다 훨씬 안전합니다.


2. 호환성 - WordPress는 MySQL과 MariaDB를 모두 지원합니다. $wpdb가 내부적으로 차이를 처리하므로 개발자는 이를 신경 쓸 필요가 없습니다.


3. 테이블 접두사 관리 - $wpdb->prefix를 사용하면 테이블 접두사가 무엇이든 코드가 정상 작동합니다. 하드코딩된 'wp_'는 접두사가 다른 설치에서 실패합니다.


4. 오류 처리 - $wpdb는 쿼리 오류를 일관된 방식으로 처리하고, 디버그 모드에서 유용한 정보를 제공합니다.


5. 캐싱 통합 - WordPress의 객체 캐시와 통합되어 중복 쿼리를 자동으로 방지합니다.

// $wpdb 글로벌 변수 접근
global $wpdb;

// 테이블 접두사 확인
echo $wpdb->prefix;  // 보통 'wp_'

// 주요 테이블명 프로퍼티
echo $wpdb->posts;         // 'wp_posts'
echo $wpdb->postmeta;      // 'wp_postmeta'
echo $wpdb->users;         // 'wp_users'
echo $wpdb->usermeta;      // 'wp_usermeta'
echo $wpdb->options;       // 'wp_options'
echo $wpdb->comments;      // 'wp_comments'
echo $wpdb->commentmeta;   // 'wp_commentmeta'
echo $wpdb->terms;         // 'wp_terms'
echo $wpdb->term_taxonomy; // 'wp_term_taxonomy'
echo $wpdb->term_relationships; // 'wp_term_relationships'
echo $wpdb->termmeta;      // 'wp_termmeta'
echo $wpdb->links;         // 'wp_links'

// 커스텀 테이블 참조 시
$table_name = $wpdb->prefix . 'my_custom_table';
        
🔒
prepare()
SQL 인젝션 방지
📋
7개
주요 조회 메서드
✏️
3개
CRUD 메서드
🛡️
12+
테이블 프로퍼티

SELECT 쿼리 메서드

get_results() - 여러 행 조회

$wpdb->get_results()는 여러 행을 반환하는 SELECT 쿼리에 사용합니다. 가장 자주 사용되는 메서드 중 하나입니다.

global $wpdb;

// 기본 사용법 - 모든 공개 글 조회
$results = $wpdb->get_results(
    "SELECT ID, post_title, post_date
     FROM {$wpdb->posts}
     WHERE post_status = 'publish'
     AND post_type = 'post'
     ORDER BY post_date DESC
     LIMIT 10"
);

// 결과 순회
foreach ($results as $post) {
    echo $post->post_title;  // 객체 프로퍼티로 접근
    echo $post->post_date;
}

// 두 번째 매개변수: 반환 타입 지정
// OBJECT (기본값) - 객체 배열
$results = $wpdb->get_results($query, OBJECT);
// $results[0]->post_title

// OBJECT_K - 첫 번째 컬럼을 키로 사용하는 연관 객체 배열
$results = $wpdb->get_results($query, OBJECT_K);
// $results[42]->post_title  (ID가 42인 행)

// ARRAY_A - 연관 배열의 배열
$results = $wpdb->get_results($query, ARRAY_A);
// $results[0]['post_title']

// ARRAY_N - 숫자 인덱스 배열의 배열
$results = $wpdb->get_results($query, ARRAY_N);
// $results[0][1]  (두 번째 컬럼)

// 결과가 없으면 빈 배열 반환, 오류 시 null 반환
if (empty($results)) {
    echo '결과가 없습니다.';
}
        

get_row() - 단일 행 조회

$wpdb->get_row()는 결과에서 하나의 행만 반환합니다. 특정 레코드를 ID로 조회하거나, LIMIT 1과 함께 사용할 때 적합합니다.

global $wpdb;

// 특정 포스트 조회
$post = $wpdb->get_row(
    $wpdb->prepare(
        "SELECT * FROM {$wpdb->posts} WHERE ID = %d",
        42
    )
);

if ($post) {
    echo $post->post_title;
    echo $post->post_content;
}

// 두 번째 매개변수: 반환 타입
$post = $wpdb->get_row($query, OBJECT);  // 기본값
$post = $wpdb->get_row($query, ARRAY_A); // 연관 배열
$post = $wpdb->get_row($query, ARRAY_N); // 숫자 배열

// 세 번째 매개변수: 행 오프셋 (0부터 시작)
$third_row = $wpdb->get_row($query, OBJECT, 2);

// 결과가 없으면 null 반환
if (null === $post) {
    echo '포스트를 찾을 수 없습니다.';
}
        

get_var() - 단일 값 조회

$wpdb->get_var()는 결과에서 하나의 값만 반환합니다. COUNT, SUM, MAX 같은 집계 함수나 단일 컬럼 값을 가져올 때 유용합니다.

global $wpdb;

// 전체 공개 글 수 조회
$post_count = $wpdb->get_var(
    "SELECT COUNT(*)
     FROM {$wpdb->posts}
     WHERE post_status = 'publish'
     AND post_type = 'post'"
);
echo "총 {$post_count}개의 글이 있습니다.";

// 특정 옵션 값 조회
$site_name = $wpdb->get_var(
    $wpdb->prepare(
        "SELECT option_value FROM {$wpdb->options} WHERE option_name = %s",
        'blogname'
    )
);

// 최신 글의 제목만 가져오기
$latest_title = $wpdb->get_var(
    "SELECT post_title FROM {$wpdb->posts}
     WHERE post_status = 'publish' AND post_type = 'post'
     ORDER BY post_date DESC LIMIT 1"
);

// 두 번째/세 번째 매개변수: 컬럼/행 오프셋
// get_var($query, 열_오프셋, 행_오프셋)
$value = $wpdb->get_var($query, 0, 0); // 첫 번째 열, 첫 번째 행

// 결과가 없으면 null 반환
        

get_col() - 단일 컬럼 조회

$wpdb->get_col()는 하나의 컬럼에 대한 모든 값을 1차원 배열로 반환합니다.

global $wpdb;

// 모든 공개 글의 ID 목록
$post_ids = $wpdb->get_col(
    "SELECT ID FROM {$wpdb->posts}
     WHERE post_status = 'publish' AND post_type = 'post'
     ORDER BY post_date DESC"
);
// 결과: array(42, 38, 35, 31, ...)

// 모든 사용자 이메일
$emails = $wpdb->get_col(
    "SELECT user_email FROM {$wpdb->users}"
);

// IN 절에서 활용
if (!empty($post_ids)) {
    $ids_string = implode(',', array_map('intval', $post_ids));
    $meta = $wpdb->get_results(
        "SELECT * FROM {$wpdb->postmeta}
         WHERE post_id IN ({$ids_string})"
    );
}

// 두 번째 매개변수: 컬럼 오프셋
$titles = $wpdb->get_col($query, 1); // 두 번째 컬럼
        
🔒
여기까지는 미리보기입니다
wpdb 클래스와 직접 쿼리
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)