Ver2.0 워드프레스 커스텀 포스트 타입과 분류법 완전정복: 웹사이트를 더 강력하게 만드는 비밀 무기 🚀

워드프레스 커스텀 포스트 타입과 분류법 완전정복: 웹사이트를 더 강력하게 만드는 비밀 무기 🚀
안녕, 친구! 오늘은 워드프레스의 숨겨진 보물 같은 기능인 커스텀 포스트 타입과 분류법에 대해 함께 알아볼 거야. 2025년 현재 워드프레스는 계속해서 진화하고 있고, 이 강력한 기능들을 제대로 활용하면 너의 웹사이트가 한층 더 프로페셔널해질 거야! 😎 특히 재능넷 같은 다양한 콘텐츠를 다루는 플랫폼을 운영한다면 더욱 유용할 거야!
📚 목차
- 워드프레스 커스텀 포스트 타입이란?
- 커스텀 포스트 타입을 만드는 방법
- 분류법(Taxonomy) 이해하기
- 커스텀 분류법 만들기
- 고급 활용 테크닉
- 실전 예제: 포트폴리오 사이트 구축하기
- 성능 최적화 팁
- 자주 묻는 질문(FAQ)
1. 워드프레스 커스텀 포스트 타입이란? 🤔
워드프레스를 처음 접했을 때, 기본적으로 '포스트'와 '페이지'라는 두 가지 콘텐츠 유형만 봤을 거야. 근데 이게 전부라고 생각했다면 큰 오산이지! 커스텀 포스트 타입(Custom Post Type, CPT)은 워드프레스에서 네가 원하는 대로 콘텐츠 유형을 만들 수 있게 해주는 초강력 기능이야.
예를 들어, 너가 요리 블로그를 운영한다고 생각해봐. 일반 포스트로도 레시피를 올릴 수 있지만, '레시피'라는 커스텀 포스트 타입을 만들면 조리 시간, 난이도, 재료 목록 등 레시피에 특화된 정보를 체계적으로 관리할 수 있어!
1.1 기본 포스트 타입 vs 커스텀 포스트 타입
기본 포스트 타입:
- 포스트(Post): 블로그 글, 뉴스 등 시간 순서가 중요한 콘텐츠
- 페이지(Page): 정적인 콘텐츠(예: 소개, 연락처 페이지)
- 첨부파일(Attachment): 미디어 파일
- 리비전(Revision): 콘텐츠 수정 내역
- 메뉴(Navigation Menu): 사이트 메뉴
- 사용자 정의 CSS(Custom CSS): 테마 커스터마이징
커스텀 포스트 타입 예시:
- 제품(Products)
- 포트폴리오(Portfolio)
- 이벤트(Events)
- 팀 멤버(Team Members)
- 부동산 매물(Real Estate Listings)
- 재능 서비스(Services) - 재능넷 같은 플랫폼에 완벽해! 🌟
1.2 커스텀 포스트 타입의 장점
🔍 콘텐츠 구조화: 각 콘텐츠 유형에 맞는 필드와 정보를 체계적으로 관리할 수 있어.
🧩 관리 용이성: 관리자 대시보드에서 콘텐츠 유형별로 분리되어 관리가 편리해져.
🚀 SEO 최적화: 콘텐츠 유형에 맞는 URL 구조와 메타데이터 설정으로 검색 엔진 최적화에 유리해.
🎯 사용자 경험 향상: 콘텐츠 유형별 맞춤 템플릿으로 사용자에게 더 나은 경험 제공 가능.
⚙️ 확장성: 사이트가 성장해도 콘텐츠를 체계적으로 관리할 수 있어.
참고: 2025년 현재, 워드프레스 6.5 이상 버전에서는 커스텀 포스트 타입 생성과 관리가 더욱 직관적으로 개선되었어. 특히 풀 사이트 에디팅(FSE)과의 통합으로 블록 에디터에서 커스텀 포스트 타입을 더 쉽게 다룰 수 있게 되었지!
2. 커스텀 포스트 타입을 만드는 방법 🛠️
이제 본격적으로 커스텀 포스트 타입을 만드는 방법을 알아볼게. 크게 두 가지 방법이 있어: 코드로 직접 만들기와 플러그인 사용하기. 각각의 장단점이 있으니 너의 상황에 맞는 방법을 선택하면 돼!
2.1 코드로 직접 만들기
코드로 직접 만드는 방법은 더 많은 제어와 커스터마이징이 가능해. 테마의 functions.php 파일이나 별도의 플러그인 파일에 다음 코드를 추가하면 돼.
// 커스텀 포스트 타입 등록하기
function create_portfolio_post_type() {
register_post_type('portfolio',
array(
'labels' => array(
'name' => __('포트폴리오'),
'singular_name' => __('포트폴리오 항목'),
'add_new' => __('새 항목 추가'),
'add_new_item' => __('새 포트폴리오 항목 추가'),
'edit_item' => __('포트폴리오 항목 편집'),
'view_item' => __('포트폴리오 항목 보기'),
'search_items' => __('포트폴리오 검색'),
'not_found' => __('포트폴리오를 찾을 수 없습니다'),
'not_found_in_trash' => __('휴지통에서 포트폴리오를 찾을 수 없습니다')
),
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-portfolio',
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'rewrite' => array('slug' => 'portfolio'),
'show_in_rest' => true, // 구텐베르크 에디터 지원
)
);
}
add_action('init', 'create_portfolio_post_type');
주요 매개변수 설명:
labels: 관리자 대시보드에 표시될 다양한 레이블
public: 공개 여부 (true/false)
has_archive: 아카이브 페이지 생성 여부
menu_icon: 대시보드 메뉴에 표시될 아이콘
menu_position: 관리자 메뉴에서의 위치
supports: 지원할 기능들 (제목, 에디터, 썸네일 등)
rewrite: URL 구조 설정
show_in_rest: REST API 및 블록 에디터 지원 여부
꿀팁: 코드를 functions.php에 직접 넣는 것보다 사이트 플러그인(site-specific plugin)을 만들어 넣는 것이 좋아. 테마를 변경해도 커스텀 포스트 타입이 유지되거든!
2.2 플러그인으로 만들기
코딩에 익숙하지 않다면, 플러그인을 사용하는 것이 더 쉬운 방법이야. 2025년 현재 가장 인기 있는 플러그인들을 소개할게:
1. Custom Post Type UI (CPT UI)
가장 인기 있는 플러그인 중 하나로, 직관적인 인터페이스로 커스텀 포스트 타입과 분류법을 쉽게 만들 수 있어. 2025년 최신 버전에서는 블록 에디터와의 통합이 더욱 강화되었지!
2. Pods Framework
단순한 커스텀 포스트 타입 생성을 넘어, 복잡한 데이터 구조와 관계를 설정할 수 있는 강력한 도구야. 데이터베이스 수준의 커스터마이징이 가능해!
3. Toolset
종합적인 솔루션으로, 커스텀 포스트 타입, 필드, 분류법뿐만 아니라 프론트엔드 제출 폼, 템플릿 등 다양한 기능을 제공해. 특히 재능넷 같은 복잡한 플랫폼에 적합해!
4. Advanced Custom Fields (ACF)
커스텀 필드 관리에 특화된 플러그인으로, 커스텀 포스트 타입과 함께 사용하면 더욱 강력해져. 2025년 버전에서는 AI 지원 필드 생성 기능이 추가되었어!
2.3 커스텀 포스트 타입 설정 시 고려사항
🔄 퍼머링크 구조: 커스텀 포스트 타입을 만든 후에는 설정 > 퍼머링크에서 퍼머링크를 다시 저장해야 해. 이렇게 하면 새로운 URL 구조가 제대로 적용돼.
🔍 검색 결과 포함: 기본적으로 커스텀 포스트 타입은 워드프레스 검색 결과에 포함되지만, 'exclude_from_search' 매개변수로 이를 제어할 수 있어.
📱 REST API 지원: 모던 워드프레스 개발에서는 REST API 지원이 중요해. 'show_in_rest' 매개변수를 true로 설정하면 블록 에디터와 API 호출에서 커스텀 포스트 타입을 사용할 수 있어.
🎭 역할과 권한: 커스텀 포스트 타입에 대한 접근 권한을 설정하려면 'capability_type'과 'capabilities' 매개변수를 사용해. 이를 통해 관리자, 편집자, 작성자 등 각 역할에 맞는 권한을 부여할 수 있어.
주의: 커스텀 포스트 타입의 이름은 한 번 정하면 바꾸기 어려워. 나중에 이름을 변경하면 기존 콘텐츠의 URL이 바뀌어 404 오류가 발생할 수 있어. 처음부터 신중하게 이름을 정하는 것이 중요해!
3. 분류법(Taxonomy) 이해하기 🏷️
커스텀 포스트 타입을 만들었다면, 이제 그것을 더 체계적으로 분류할 방법이 필요해. 여기서 분류법(Taxonomy)이 등장하지! 분류법은 콘텐츠를 그룹화하고 구조화하는 방법이야.
3.1 워드프레스 기본 분류법
워드프레스에는 기본적으로 두 가지 분류법이 있어:
카테고리(Categories)
계층적 구조를 가진 분류법으로, 부모-자식 관계를 설정할 수 있어. 예를 들어, '음식' 카테고리 아래 '한식', '양식', '중식' 등의 하위 카테고리를 만들 수 있지.
태그(Tags)
비계층적 구조로, 키워드처럼 사용돼. 관련 콘텐츠를 연결하는 데 유용해. 예를 들어, '여름 레시피', '간단 요리', '다이어트' 같은 태그로 다양한 레시피를 연결할 수 있어.
3.2 분류법의 중요성
🧠 콘텐츠 구조화: 사용자가 원하는 정보를 쉽게 찾을 수 있도록 도와줘.
🔍 검색 최적화: 잘 구성된 분류법은 검색 엔진이 콘텐츠를 더 잘 이해하고 색인화하는 데 도움을 줘.
🧩 관련 콘텐츠 연결: 사용자에게 관련 콘텐츠를 추천하여 체류 시간을 늘리고 이탈률을 줄여줘.
📊 데이터 분석: 어떤 주제의 콘텐츠가 인기 있는지 분석하는 데 유용해.
🌐 사이트 네비게이션: 분류법을 기반으로 메뉴와 사이드바를 구성하여 사용자 경험을 향상시킬 수 있어.
예시: 재능넷 같은 서비스 마켓플레이스에서는 '서비스 유형', '난이도', '가격대', '소요 시간' 등의 분류법을 만들어 사용자가 원하는 서비스를 쉽게 찾을 수 있게 할 수 있어. 이런 체계적인 분류는 사용자 경험을 크게 향상시키지!
3.3 분류법 vs 커스텀 필드
콘텐츠를 구조화하는 방법으로 분류법 외에도 커스텀 필드가 있어. 언제 어떤 것을 사용해야 할까?
꿀팁: 분류법과 커스텀 필드를 함께 사용하면 더 강력한 콘텐츠 구조를 만들 수 있어! 예를 들어, '요리 레시피' 커스텀 포스트 타입에 '요리 종류'(분류법)와 '조리 시간'(커스텀 필드)을 함께 사용하면 완벽한 레시피 데이터베이스를 구축할 수 있지.
4. 커스텀 분류법 만들기 🏷️
이제 커스텀 분류법을 만드는 방법을 알아볼게. 커스텀 포스트 타입과 마찬가지로 코드로 직접 만들거나 플러그인을 사용할 수 있어.
4.1 코드로 커스텀 분류법 만들기
다음 코드를 테마의 functions.php 파일이나 별도의 플러그인 파일에 추가하면 돼:
// 커스텀 분류법 등록하기
function create_project_type_taxonomy() {
register_taxonomy(
'project_type', // 분류법 이름
'portfolio', // 적용할 포스트 타입
array(
'labels' => array(
'name' => __('프로젝트 유형'),
'singular_name' => __('프로젝트 유형'),
'search_items' => __('프로젝트 유형 검색'),
'all_items' => __('모든 프로젝트 유형'),
'parent_item' => __('상위 프로젝트 유형'),
'parent_item_colon' => __('상위 프로젝트 유형:'),
'edit_item' => __('프로젝트 유형 편집'),
'update_item' => __('프로젝트 유형 업데이트'),
'add_new_item' => __('새 프로젝트 유형 추가'),
'new_item_name' => __('새 프로젝트 유형 이름'),
'menu_name' => __('프로젝트 유형'),
),
'hierarchical' => true, // true = 카테고리 형태, false = 태그 형태
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'project-type'),
'show_in_rest' => true, // 구텐베르크 에디터 지원
)
);
}
add_action('init', 'create_project_type_taxonomy');
주요 매개변수 설명:
hierarchical: true면 카테고리처럼 계층 구조를 가지고, false면 태그처럼 평면 구조를 가져.
show_ui: 관리자 인터페이스에 표시 여부
show_admin_column: 포스트 목록에 분류법 열 표시 여부
query_var: URL 쿼리 변수 사용 여부
rewrite: URL 구조 설정
show_in_rest: REST API 및 블록 에디터 지원 여부
4.2 플러그인으로 커스텀 분류법 만들기
앞서 소개한 커스텀 포스트 타입 플러그인들(CPT UI, Pods, Toolset, ACF)은 모두 커스텀 분류법 생성 기능도 제공해. 여기서는 가장 인기 있는 CPT UI를 사용한 방법을 알아볼게.
- 워드프레스 관리자 대시보드에서 'CPT UI' > 'Add/Edit Taxonomies'로 이동해.
- 'Taxonomy Slug'에 고유한 식별자를 입력해(예: 'project_type').
- 'Plural Label'과 'Singular Label'에 표시될 이름을 입력해(예: '프로젝트 유형들', '프로젝트 유형').
- 'Attach to Post Type'에서 이 분류법을 적용할 포스트 타입을 선택해(예: 'portfolio').
- 'Hierarchical'에서 계층 구조 여부를 선택해(카테고리 형태면 Yes, 태그 형태면 No).
- 필요에 따라 다른 설정을 조정하고 'Add Taxonomy' 버튼을 클릭해.
4.3 커스텀 분류법 활용 전략
1. 계층적 vs 비계층적 분류법
계층적 분류법(hierarchical = true)은 카테고리처럼 부모-자식 관계를 가질 수 있어. 넓은 주제에서 세부 주제로 좁혀가는 구조에 적합해. 반면, 비계층적 분류법(hierarchical = false)은 태그처럼 평면적 구조를 가지며, 키워드나 특성을 나타내는 데 적합해.
2. 여러 포스트 타입에 분류법 적용하기
하나의 분류법을 여러 포스트 타입에 적용할 수 있어. 예를 들어, '스킬' 분류법을 '포트폴리오', '팀 멤버', '서비스' 등 여러 포스트 타입에 적용하면 사이트 전체에서 일관된 스킬 분류를 유지할 수 있어.
register_taxonomy(
'skill',
array('portfolio', 'team', 'service'), // 여러 포스트 타입에 적용
array(
// 설정...
)
);
3. 기본 용어(Terms) 자동 추가하기
분류법을 등록한 후 기본 용어를 자동으로 추가하려면 다음과 같은 코드를 사용할 수 있어:
function add_default_project_types() {
wp_insert_term('웹 디자인', 'project_type');
wp_insert_term('모바일 앱', 'project_type');
wp_insert_term('브랜딩', 'project_type');
wp_insert_term('일러스트레이션', 'project_type');
}
add_action('init', 'add_default_project_types');
4. 분류법 템플릿 만들기
커스텀 분류법의 아카이브 페이지를 커스터마이징하려면 테마 폴더에 다음과 같은 템플릿 파일을 만들 수 있어:
- taxonomy-{taxonomy}.php - 특정 분류법의 모든 용어에 대한 템플릿
- taxonomy-{taxonomy}-{term}.php - 특정 분류법의 특정 용어에 대한 템플릿
예를 들어, 'project_type' 분류법의 '웹 디자인' 용어에 대한 템플릿은 'taxonomy-project_type-web-design.php'가 돼.
주의: 너무 많은 분류법을 만들면 관리가 복잡해질 수 있어. 필요한 분류법만 만들고, 가능하면 기존 분류법을 재활용하는 것이 좋아. 또한, 분류법 이름은 한 번 정하면 바꾸기 어려우니 신중하게 결정해야 해!
5. 고급 활용 테크닉 🚀
이제 커스텀 포스트 타입과 분류법의 기본을 알았으니, 더 고급 테크닉으로 넘어가볼게. 이 기술들을 마스터하면 워드프레스의 진정한 파워 유저가 될 수 있어!
5.1 커스텀 포스트 타입과 분류법 연결하기
커스텀 포스트 타입과 분류법을 연결하는 방법은 두 가지가 있어:
1. 분류법 등록 시 연결
분류법을 등록할 때 'object_type' 매개변수에 포스트 타입을 지정해:
register_taxonomy('project_type', 'portfolio', array(
// 설정...
));
2. 기존 분류법에 포스트 타입 연결
이미 등록된 분류법에 새 포스트 타입을 연결하려면:
function connect_post_type_to_taxonomy() {
register_taxonomy_for_object_type('category', 'portfolio'); // 기본 카테고리를 포트폴리오에 연결
register_taxonomy_for_object_type('post_tag', 'portfolio'); // 기본 태그를 포트폴리오에 연결
}
add_action('init', 'connect_post_type_to_taxonomy');
꿀팁: 기본 카테고리와 태그를 커스텀 포스트 타입에 연결하면 기존 분류 체계를 활용할 수 있어 관리가 편리해져. 하지만 콘텐츠 구조가 복잡해지면 전용 분류법을 만드는 것이 더 나을 수 있어.
5.2 커스텀 포스트 타입 쿼리하기
WP_Query를 사용하여 커스텀 포스트 타입과 분류법을 기반으로 콘텐츠를 쿼리할 수 있어:
$args = array(
'post_type' => 'portfolio', // 커스텀 포스트 타입
'posts_per_page' => 6, // 표시할 포스트 수
'tax_query' => array( // 분류법 쿼리
array(
'taxonomy' => 'project_type', // 분류법 이름
'field' => 'slug', // 필드 유형 (slug, term_id, name)
'terms' => 'web-design', // 용어 값
),
),
'meta_query' => array( // 메타 필드 쿼리
array(
'key' => 'project_year', // 메타 필드 키
'value' => '2025', // 메타 필드 값
'compare' => '=', // 비교 연산자
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
// 포스트 표시 코드
endwhile;
wp_reset_postdata();
endif;
5.3 커스텀 메타 박스 추가하기
커스텀 포스트 타입에 추가 정보를 입력할 수 있는 메타 박스를 추가할 수 있어:
// 메타 박스 추가
function add_portfolio_meta_box() {
add_meta_box(
'portfolio_details', // 메타 박스 ID
'포트폴리오 세부 정보', // 메타 박스 제목
'portfolio_meta_box_callback', // 콜백 함수
'portfolio', // 포스트 타입
'normal', // 위치 (normal, side, advanced)
'high' // 우선순위
);
}
add_action('add_meta_boxes', 'add_portfolio_meta_box');
// 메타 박스 콜백 함수
function portfolio_meta_box_callback($post) {
// 보안을 위한 nonce 필드
wp_nonce_field('portfolio_meta_box', 'portfolio_meta_box_nonce');
// 저장된 값 가져오기
$client = get_post_meta($post->ID, '_portfolio_client', true);
$year = get_post_meta($post->ID, '_portfolio_year', true);
$url = get_post_meta($post->ID, '_portfolio_url', true);
// 입력 필드 출력
echo '<p><label for="portfolio_client">클라이언트:</label>';
echo '<input type="text" id="portfolio_client" name="portfolio_client" value="' . esc_attr($client) . '" style="width:100%"></p>';
echo '<p><label for="portfolio_year">프로젝트 연도:</label>';
echo '<input type="text" id="portfolio_year" name="portfolio_year" value="' . esc_attr($year) . '" style="width:100%"></p>';
echo '<p><label for="portfolio_url">프로젝트 URL:</label>';
echo '<input type="url" id="portfolio_url" name="portfolio_url" value="' . esc_url($url) . '" style="width:100%"></p>';
}
// 메타 데이터 저장
function save_portfolio_meta($post_id) {
// 보안 체크
if (!isset($_POST['portfolio_meta_box_nonce']) || !wp_verify_nonce($_POST['portfolio_meta_box_nonce'], 'portfolio_meta_box')) {
return;
}
// 자동 저장 스킵
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// 권한 체크
if (!current_user_can('edit_post', $post_id)) {
return;
}
// 데이터 저장
if (isset($_POST['portfolio_client'])) {
update_post_meta($post_id, '_portfolio_client', sanitize_text_field($_POST['portfolio_client']));
}
if (isset($_POST['portfolio_year'])) {
update_post_meta($post_id, '_portfolio_year', sanitize_text_field($_POST['portfolio_year']));
}
if (isset($_POST['portfolio_url'])) {
update_post_meta($post_id, '_portfolio_url', esc_url_raw($_POST['portfolio_url']));
}
}
add_action('save_post_portfolio', 'save_portfolio_meta');
참고: 2025년 현재, 워드프레스는 블록 에디터(구텐베르크)를 기본으로 사용해. 메타 박스 대신 커스텀 블록이나 블록 패턴을 만드는 것이 더 현대적인 접근 방식이야. Advanced Custom Fields(ACF)나 Meta Box 같은 플러그인은 블록 에디터와 통합된 솔루션을 제공해.
5.4 REST API 활용하기
워드프레스 REST API를 통해 커스텀 포스트 타입과 분류법 데이터에 접근할 수 있어. 이는 헤드리스 워드프레스나 JavaScript 프레임워크와의 통합에 유용해.
// 커스텀 REST API 엔드포인트 등록
function register_portfolio_rest_fields() {
// 포트폴리오 메타 데이터 노출
register_rest_field('portfolio', 'portfolio_meta', array(
'get_callback' => 'get_portfolio_meta_for_api',
'schema' => null,
));
}
add_action('rest_api_init', 'register_portfolio_rest_fields');
// 메타 데이터 가져오는 콜백 함수
function get_portfolio_meta_for_api($post) {
return array(
'client' => get_post_meta($post['id'], '_portfolio_client', true),
'year' => get_post_meta($post['id'], '_portfolio_year', true),
'url' => get_post_meta($post['id'], '_portfolio_url', true),
);
}
이제 다음 URL로 포트폴리오 데이터에 접근할 수 있어:
https://your-site.com/wp-json/wp/v2/portfolio
5.5 커스텀 관리자 열 추가하기
관리자 대시보드의 포스트 목록에 커스텀 열을 추가하여 중요 정보를 한눈에 볼 수 있게 할 수 있어:
// 관리자 열 추가
function add_portfolio_admin_columns($columns) {
$new_columns = array();
// 체크박스와 제목 열은 유지
$new_columns['cb'] = $columns['cb'];
$new_columns['title'] = $columns['title'];
// 커스텀 열 추가
$new_columns['client'] = '클라이언트';
$new_columns['year'] = '연도';
$new_columns['project_type'] = '프로젝트 유형';
// 날짜 열 유지
$new_columns['date'] = $columns['date'];
return $new_columns;
}
add_filter('manage_portfolio_posts_columns', 'add_portfolio_admin_columns');
// 열 내용 표시
function display_portfolio_admin_columns($column, $post_id) {
switch ($column) {
case 'client':
echo get_post_meta($post_id, '_portfolio_client', true);
break;
case 'year':
echo get_post_meta($post_id, '_portfolio_year', true);
break;
case 'project_type':
$terms = get_the_terms($post_id, 'project_type');
if ($terms && !is_wp_error($terms)) {
$project_types = array();
foreach ($terms as $term) {
$project_types[] = $term->name;
}
echo implode(', ', $project_types);
}
break;
}
}
add_action('manage_portfolio_posts_custom_column', 'display_portfolio_admin_columns', 10, 2);
// 열 정렬 가능하게 하기
function make_portfolio_admin_columns_sortable($columns) {
$columns['client'] = 'client';
$columns['year'] = 'year';
return $columns;
}
add_filter('manage_edit-portfolio_sortable_columns', 'make_portfolio_admin_columns_sortable');
6. 실전 예제: 포트폴리오 사이트 구축하기 🎨
지금까지 배운 내용을 바탕으로 실제 포트폴리오 사이트를 구축하는 예제를 살펴볼게. 이 예제는 디자이너, 개발자, 프리랜서 등 자신의 작업물을 전시하고 싶은 모든 사람에게 유용해!
6.1 프로젝트 계획
우리가 만들 포트폴리오 사이트에는 다음과 같은 요소가 포함될 거야:
- 커스텀 포스트 타입: 'Portfolio' - 포트폴리오 작업물을 관리
- 커스텀 분류법:
- 'Project Type' (계층적) - 웹 디자인, 그래픽 디자인, 모바일 앱 등
- 'Skills' (비계층적) - HTML, CSS, JavaScript, Photoshop 등
- 커스텀 필드:
- 클라이언트 이름
- 프로젝트 완료일
- 프로젝트 URL
- 갤러리 이미지
- 템플릿:
- 포트폴리오 아카이브 페이지
- 포트폴리오 단일 페이지
- 프로젝트 타입별 아카이브 페이지
6.2 코드 구현
이 모든 기능을 구현하기 위해 사이트별 플러그인을 만들어 볼게. 플러그인 파일 구조는 다음과 같아:
portfolio-plugin/
├── portfolio-plugin.php // 메인 플러그인 파일
├── includes/
│ ├── post-types.php // 커스텀 포스트 타입 등록
│ ├── taxonomies.php // 커스텀 분류법 등록
│ ├── meta-boxes.php // 커스텀 메타 박스 추가
│ └── admin-columns.php // 관리자 열 커스터마이징
└── templates/
├── archive-portfolio.php // 포트폴리오 아카이브 템플릿
├── single-portfolio.php // 포트폴리오 단일 템플릿
└── taxonomy-project_type.php // 프로젝트 타입 분류법 템플릿
메인 플러그인 파일(portfolio-plugin.php)의 내용은 다음과 같아:
<?php
/**
* Plugin Name: Portfolio System
* Description: 포트폴리오 관리를 위한 커스텀 포스트 타입과 분류법
* Version: 1.0
* Author: Your Name
*/
// 직접 접근 방지
if (!defined('ABSPATH')) {
exit;
}
// 파일 포함
require_once plugin_dir_path(__FILE__) . 'includes/post-types.php';
require_once plugin_dir_path(__FILE__) . 'includes/taxonomies.php';
require_once plugin_dir_path(__FILE__) . 'includes/meta-boxes.php';
require_once plugin_dir_path(__FILE__) . 'includes/admin-columns.php';
// 템플릿 로딩
function portfolio_load_templates($template) {
if (is_post_type_archive('portfolio')) {
$theme_file = locate_template(array('archive-portfolio.php'));
if (!$theme_file) {
$plugin_file = plugin_dir_path(__FILE__) . 'templates/archive-portfolio.php';
if (file_exists($plugin_file)) {
return $plugin_file;
}
}
}
if (is_singular('portfolio')) {
$theme_file = locate_template(array('single-portfolio.php'));
if (!$theme_file) {
$plugin_file = plugin_dir_path(__FILE__) . 'templates/single-portfolio.php';
if (file_exists($plugin_file)) {
return $plugin_file;
}
}
}
if (is_tax('project_type')) {
$theme_file = locate_template(array('taxonomy-project_type.php'));
if (!$theme_file) {
$plugin_file = plugin_dir_path(__FILE__) . 'templates/taxonomy-project_type.php';
if (file_exists($plugin_file)) {
return $plugin_file;
}
}
}
return $template;
}
add_filter('template_include', 'portfolio_load_templates');
// 플러그인 활성화 시 실행
function portfolio_plugin_activation() {
// 커스텀 포스트 타입과 분류법 등록
require_once plugin_dir_path(__FILE__) . 'includes/post-types.php';
require_once plugin_dir_path(__FILE__) . 'includes/taxonomies.php';
// 퍼머링크 재설정
flush_rewrite_rules();
}
register_activation_hook(__FILE__, 'portfolio_plugin_activation');
// 플러그인 비활성화 시 실행
function portfolio_plugin_deactivation() {
// 퍼머링크 재설정
flush_rewrite_rules();
}
register_deactivation_hook(__FILE__, 'portfolio_plugin_deactivation');
6.3 프론트엔드 구현
포트폴리오 아카이브 페이지(archive-portfolio.php)는 다음과 같이 구현할 수 있어:
<?php get_header(); ?>
<div class="portfolio-container">
<h1 class="page-title">포트폴리오</h1>
<div class="portfolio-filters">
<h2>프로젝트 유형</h2>
<?php
$project_types = get_terms(array(
'taxonomy' => 'project_type',
'hide_empty' => true,
));
if (!empty($project_types) && !is_wp_error($project_types)) {
echo '<ul class="filter-list">';
echo '<li><a href="' . get_post_type_archive_link('portfolio') . '" class="active">전체</a></li>';
foreach ($project_types as $type) {
echo '<li><a href="' . get_term_link($type) . '">' . $type->name . '</a></li>';
}
echo '</ul>';
}
?>
</div>
<div class="portfolio-grid">
<?php
if (have_posts()) :
while (have_posts()) : the_post();
?>
<div class="portfolio-item">
<a href="<?php the_permalink(); ?>">
<?php
if (has_post_thumbnail()) {
the_post_thumbnail('medium');
} else {
echo '<div class="no-thumbnail">No Image</div>';
}
?>
<h3><?php the_title(); ?></h3>
<?php
$project_types = get_the_terms(get_the_ID(), 'project_type');
if (!empty($project_types) && !is_wp_error($project_types)) {
echo '<div class="project-type">';
$type_names = array();
foreach ($project_types as $type) {
$type_names[] = $type->name;
}
echo implode(', ', $type_names);
echo '</div>';
}
?>
</a>
</div>
<?php
endwhile;
the_posts_pagination();
else :
echo '<p>포트폴리오 항목이 없습니다.</p>';
endif;
?>
</div>
</div>
<?php get_footer(); ?>
6.4 결과 및 확장 가능성
이 예제를 구현하면 다음과 같은 결과를 얻을 수 있어:
- 관리자 대시보드에서 포트폴리오 항목을 쉽게 추가, 편집, 관리할 수 있어.
- 프로젝트 유형과 스킬로 포트폴리오 항목을 분류할 수 있어.
- 각 포트폴리오 항목에 클라이언트, 날짜, URL 등의 추가 정보를 포함할 수 있어.
- 사용자는 프로젝트 유형별로 포트폴리오를 필터링하여 볼 수 있어.
- 각 포트폴리오 항목의 상세 페이지에서 갤러리 이미지와 세부 정보를 볼 수 있어.
이 기본 구조를 바탕으로 다음과 같은 확장이 가능해:
- AJAX 필터링으로 페이지 새로고침 없이 포트폴리오 항목 필터링
- 프론트엔드 제출 폼으로 관리자 대시보드 없이 포트폴리오 항목 추가
- 소셜 미디어 공유 기능 추가
- 관련 포트폴리오 항목 표시
- 포트폴리오 항목 평점 및 리뷰 시스템 추가
꿀팁: 이 예제는 재능넷 같은 서비스 마켓플레이스에도 응용할 수 있어! '포트폴리오' 대신 '서비스'라는 커스텀 포스트 타입을 만들고, '서비스 카테고리', '스킬', '난이도' 등의 분류법을 추가하면 돼. 각 서비스에 가격, 소요 시간, 수정 횟수 등의 커스텀 필드를 추가하면 완벽한 서비스 마켓플레이스가 완성돼!
7. 성능 최적화 팁 ⚡
커스텀 포스트 타입과 분류법을 사용할 때는 성능 최적화도 중요해. 특히 데이터가 많아질수록 최적화의 중요성이 커지지. 여기 몇 가지 성능 최적화 팁을 소개할게!
7.1 데이터베이스 쿼리 최적화
1. 불필요한 쿼리 줄이기
get_posts()나 WP_Query를 사용할 때 필요한 데이터만 가져오도록 매개변수를 설정해:
$args = array(
'post_type' => 'portfolio',
'posts_per_page' => 10,
'no_found_rows' => true, // 페이지네이션이 필요 없을 때 성능 향상
'update_post_meta_cache' => false, // 메타 데이터가 필요 없을 때
'update_post_term_cache' => false, // 분류 데이터가 필요 없을 때
'fields' => 'ids', // ID만 필요할 때
);
2. 캐싱 활용하기
자주 사용하는 쿼리 결과는 트랜지언트 API를 사용하여 캐싱할 수 있어:
function get_cached_portfolio_items() {
$cache_key = 'portfolio_items_' . md5(serialize($args));
$results = get_transient($cache_key);
if (false === $results) {
$query = new WP_Query($args);
$results = $query->posts;
// 1시간 동안 결과 캐싱
set_transient($cache_key, $results, HOUR_IN_SECONDS);
}
return $results;
}
3. 인덱싱 활용하기
자주 쿼리하는 메타 필드는 인덱싱을 고려해. 대규모 사이트에서는 커스텀 데이터베이스 테이블을 만드는 것도 방법이야.
7.2 템플릿 최적화
1. 불필요한 함수 호출 줄이기
템플릿 내에서 같은 함수를 반복해서 호출하지 말고, 결과를 변수에 저장하여 재사용해:
// 비효율적인 방법
<?php if (get_post_meta(get_the_ID(), '_portfolio_featured', true) === 'yes') : ?>
<!-- 코드 -->
<?php endif; ?>
<?php if (get_post_meta(get_the_ID(), '_portfolio_featured', true) === 'yes') : ?>
<!-- 다른 코드 -->
<?php endif; ?>
// 효율적인 방법
<?php $is_featured = get_post_meta(get_the_ID(), '_portfolio_featured', true) === 'yes'; ?>
<?php if ($is_featured) : ?>
<!-- 코드 -->
<?php endif; ?>
<?php if ($is_featured) : ?>
<!-- 다른 코드 -->
<?php endif; ?>
2. 템플릿 파트 활용하기
반복되는 코드는 템플릿 파트로 분리하여 재사용해:
// parts/portfolio-item.php 파일 생성
<div class="portfolio-item">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail('medium'); ?>
<h3><?php the_title(); ?></h3>
</a>
</div>
// 메인 템플릿에서 사용
<?php
while (have_posts()) : the_post();
get_template_part('parts/portfolio', 'item');
endwhile;
?>
7.3 이미지 최적화
포트폴리오나 제품 갤러리처럼 이미지가 많은 커스텀 포스트 타입에서는 이미지 최적화가 중요해:
1. 적절한 이미지 크기 사용하기
워드프레스의 이미지 크기 기능을 활용하여 각 용도에 맞는 이미지 크기를 등록하고 사용해:
// functions.php에 이미지 크기 등록
add_image_size('portfolio-thumbnail', 400, 300, true);
add_image_size('portfolio-large', 1200, 900, false);
// 템플릿에서 사용
the_post_thumbnail('portfolio-thumbnail');
2. 지연 로딩(Lazy Loading) 활용하기
워드프레스 5.5부터는 이미지 지연 로딩이 기본 지원돼. 필요에 따라 커스텀 지연 로딩 솔루션을 사용할 수도 있어.
3. 다음 세대 이미지 형식 사용하기
WebP, AVIF 같은 최신 이미지 형식을 지원하는 플러그인을 사용하면 이미지 크기를 줄이고 로딩 속도를 향상시킬 수 있어.
7.4 페이지네이션과 무한 스크롤
많은 수의 커스텀 포스트 타입 항목을 표시할 때는 페이지네이션이나 무한 스크롤을 고려해:
1. 기본 페이지네이션
// 아카이브 템플릿에서
the_posts_pagination(array(
'mid_size' => 2,
'prev_text' => '이전',
'next_text' => '다음',
));
2. AJAX 로딩 버튼
사용자가 '더 보기' 버튼을 클릭하면 AJAX로 추가 항목을 로드하는 방식이야.
3. 무한 스크롤
사용자가 페이지 하단에 도달하면 자동으로 다음 항목을 로드하는 방식이야. 이 방법은 사용자 경험을 향상시키지만, 메모리 사용량이 증가할 수 있어 주의가 필요해.
주의: 너무 많은 커스텀 포스트 타입과 분류법을 만들면 데이터베이스 부하가 증가할 수 있어. 꼭 필요한 것만 만들고, 가능하면 기존 구조를 재활용하는 것이 좋아. 또한, 대규모 사이트에서는 객체 캐싱 플러그인(Redis, Memcached 등)을 사용하는 것을 고려해봐!
8. 자주 묻는 질문(FAQ) ❓
Q: 커스텀 포스트 타입과 일반 포스트의 차이점은 무엇인가요?
A: 일반 포스트는 블로그 글처럼 시간 순서가 중요한 콘텐츠에 적합해. 반면, 커스텀 포스트 타입은 제품, 포트폴리오, 이벤트 등 특정 유형의 콘텐츠를 관리하기 위한 별도의 섹션을 만들어줘. 각 커스텀 포스트 타입은 자체 아카이브, 분류법, 메타 데이터를 가질 수 있어 콘텐츠를 더 체계적으로 관리할 수 있게 해줘.
Q: 커스텀 포스트 타입을 만들 때 고려해야 할 주요 사항은 무엇인가요?
A: 다음 사항들을 고려해야 해:
- 명확한 목적: 이 포스트 타입이 정확히 어떤 콘텐츠를 관리할 것인지
- 고유한 슬러그: 다른 포스트 타입이나 페이지와 충돌하지 않는 고유한 슬러그
- 필요한 기능: 제목, 에디터, 썸네일 등 어떤 기능이 필요한지
- 분류 방법: 어떤 분류법이 필요한지
- URL 구조: 사용자와 검색 엔진에 친화적인 URL 구조
- 퍼머링크: 커스텀 포스트 타입 생성 후 퍼머링크 설정 재저장
Q: 커스텀 포스트 타입을 만든 후 기존 포스트를 변환할 수 있나요?
A: 네, 가능해! 'Post Type Switcher' 같은 플러그인을 사용하면 기존 포스트의 유형을 쉽게 변경할 수 있어. 또는 SQL 쿼리를 사용하여 데이터베이스에서 직접 변경할 수도 있지만, 이 방법은 백업 후 조심스럽게 진행해야 해.
Q: 커스텀 포스트 타입의 단일 페이지와 아카이브 페이지 템플릿은 어떻게 만드나요?
A: 테마 폴더에 다음 파일을 만들면 돼:
- single-{post_type}.php: 단일 페이지 템플릿 (예: single-portfolio.php)
- archive-{post_type}.php: 아카이브 페이지 템플릿 (예: archive-portfolio.php)
이 파일이 없으면 워드프레스는 기본적으로 single.php와 archive.php를 사용해. 또한 플러그인이나 테마 함수를 통해 프로그래밍 방식으로 템플릿을 지정할 수도 있어.
Q: 커스텀 분류법과 카테고리/태그의 차이점은 무엇인가요?
A: 카테고리와 태그는 워드프레스의 기본 분류법이야. 카테고리는 계층적 구조(부모-자식 관계 가능)를 가지고, 태그는 비계층적(평면적 구조)이야. 커스텀 분류법은 이와 유사하지만, 특정 포스트 타입에 맞춤화된 분류 체계를 만들 수 있어. 예를 들어, '포트폴리오' 포스트 타입에 '프로젝트 유형'이라는 분류법을 만들 수 있지.
Q: REST API에서 커스텀 포스트 타입과 분류법을 사용할 수 있나요?
A: 네, 'show_in_rest' 매개변수를 true로 설정하면 REST API에서 커스텀 포스트 타입과 분류법을 사용할 수 있어. 이는 헤드리스 워드프레스 구현이나 JavaScript 프레임워크와의 통합에 중요해. 또한 register_rest_field() 함수를 사용하여 API 응답에 커스텀 필드를 추가할 수도 있어.
Q: 커스텀 포스트 타입이 검색 결과에 표시되지 않아요. 어떻게 해야 하나요?
A: 커스텀 포스트 타입을 등록할 때 'exclude_from_search' 매개변수가 true로 설정되어 있을 수 있어. 이 값을 false로 변경하면 검색 결과에 포함돼. 또한 'publicly_queryable' 매개변수도 true로 설정되어 있는지 확인해봐.
Q: 커스텀 포스트 타입과 분류법을 사용할 때 SEO를 최적화하는 방법은 무엇인가요?
A: 다음 방법을 고려해봐:
- 의미 있는 슬러그 사용하기
- 사용자 친화적인 URL 구조 설정하기
- Yoast SEO 같은 플러그인으로 메타 데이터 최적화하기
- XML 사이트맵에 커스텀 포스트 타입 포함시키기
- 구조화된 데이터(Schema.org) 추가하기
- canonical URL 설정하기
Q: 테마를 변경하면 커스텀 포스트 타입과 분류법이 사라지나요?
A: 커스텀 포스트 타입과 분류법을 테마의 functions.php 파일에 직접 등록했다면, 테마를 변경할 때 사라질 수 있어. 이를 방지하려면 사이트별 플러그인을 만들어 그곳에 등록하거나, Code Snippets 같은 플러그인을 사용하는 것이 좋아. 또는 CPT UI 같은 플러그인을 사용하면 테마와 독립적으로 유지돼.
결론: 워드프레스의 무한한 가능성을 열어보세요! 🚀
지금까지 워드프레스 커스텀 포스트 타입과 분류법에 대해 깊이 있게 알아봤어. 이 강력한 기능들을 마스터하면 워드프레스로 거의 모든 종류의 웹사이트를 구축할 수 있다는 걸 알게 됐을 거야!
핵심 요약
✅ 커스텀 포스트 타입은 특정 유형의 콘텐츠를 관리하기 위한 별도의 섹션을 만들어줘.
✅ 커스텀 분류법은 콘텐츠를 체계적으로 구조화하고 그룹화하는 방법을 제공해.
✅ 코드로 직접 만들거나 플러그인을 사용하여 쉽게 구현할 수 있어.
✅ 메타 박스와 커스텀 필드로 추가 정보를 관리할 수 있어.
✅ 템플릿을 커스터마이징하여 프론트엔드 표시 방식을 제어할 수 있어.
✅ 성능 최적화 기법을 적용하여 대규모 사이트에서도 원활하게 운영할 수 있어.
재능넷 같은 서비스 마켓플레이스를 운영하거나, 포트폴리오 사이트, 부동산 목록, 레시피 블로그, 이벤트 캘린더 등 다양한 웹사이트를 만들 때 이 기술들을 활용해보길 추천해. 워드프레스의 진정한 힘은 이런 커스터마이징 능력에 있거든!
이제 네가 배운 지식을 바탕으로 창의적인 웹사이트를 만들어볼 차례야. 어떤 아이디어든 워드프레스 커스텀 포스트 타입과 분류법을 활용하면 현실로 만들 수 있어! 🌟
더 많은 웹 개발 지식이 필요하신가요?
재능넷에서 워드프레스 전문가들의 다양한 서비스를 만나보세요! 맞춤형 웹사이트 개발부터 워드프레스 튜토리얼까지, 여러분의 웹 프로젝트를 성공으로 이끌어줄 재능인들이 기다리고 있습니다.
댓글 작성
이 글에 대한 여러분의 생각을 들려주세요
로그인이 필요합니다
댓글을 작성하려면 먼저 로그인해주세요.
댓글 0
지식인의 숲 - 지적 재산권 보호 고지
지적 재산권 보호 고지
- 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
- AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
- 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
- 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
- AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.
아직 댓글이 없습니다.