사용자정의 포스트 타입의 기사를 사용자정의 Taxonomy의 카테고리로 분류하기

사용자정의 포스트 타입의 기사는 기본 포스트 기사의 카테고리와 포스트 태그는 분류할 수 없지만, 사용자정의 포스트 타입 전용의 카테고리와 포스트 태그를 준비해서 분류할 수 있다. 따라서 이 기능을 이용하기 위해서는 사용자정의 Taxonomy라는 기능을 이용한다. 택소노미는 콘텐츠를 분류하는 시스템을 의미하며, 기본으로 준비된 포스트 기사의 ‘카테고리’ 및 ‘포스트 태그’도 택소노미의 하나이다. 사용자정의 택소노미로는 임의의 택소노미를 카테고리 형식 또는 포스트 태그 형식으로 작성할 수 있다.
예를 들어 앞에서 작성한 ‘NEWS’ 사용자정의 포스트 타입의 기사를 카테고리로 분류할 수 있도록 하는 경우 function.php에 register_taxonomy()를 추가해서 다음과 같은 형식으로 파라미터를 지정한다.

register_taxonomy(
taxonomy의 슬러그‘,
포스트 타입의 이름‘,
array(
‘label’ => ‘Taxonomy의 라벨 이름‘,
‘hierarchical’ => true,
)
);

작성하는 taxonomy의 슬러그를 newscat으로, 라벨 이름을 ‘NEWS’라고 지정한다. taxonomy는 카테고리 형식으로 작성하기 위해 hierarchical 파라미터를 true라고 지정한다.

->MEMO

taxonomy를 포스트 태그 형식으로 작성하는 경우 hierarchical 파라미터를 ‘false’로 지정한다.
function.php

(생략)

//뉴스 기사를 분류하는 사용자정의 Toxonomy
register_taxonomy(
‘newscat’,
‘news’,
array(
‘label’ => ‘NEWS 카테고리’,
‘hierarchical’ => true,
)
);

?>

이제 알림판의 ‘NEWS’ 안에 ‘NEWS 카테고리’가 추가된다. 선택하면 카테고리의 관리화면이 열리기 때문에 뉴스 기사의 분류에 사용하는 카테고리를 작성한다. 다음과 같이 카테고리 이름과 슬러그를 지정해서 3개의 카테고리를 작성한다.

카테고리 이름           슬러그
사이트 공지사항          site
직원 공지사항            staff
긴급 공지사항            urgent

카테고리를 작성하면 기사를 분류한다. 편집화면에서 카테고리를 지정한 수 [업데이트]  버튼을 클릭하면 카테고리로 분류하는 설정은 완료된다.

  • 뉴스 기사가 속하는 카테고리 표시하기
    뉴스 기사의 개별 페이지에 기사가 속하는 카테고리를 표시한다. 기사의 제목 오른쪽 아래에 카테고리 이름을 표시하기 위해 >content-singel.php를 열고 <div class=”posts”>~</p> 안에 <?php echo get_the_term_list(); ?>를 추가한다. 표시 중인 기사의 ‘newscat’ 택소노미로 관리하는 모든 카테고리를 출력하도록 지정하고, 출력한 카테고리 이름에는 카테고리 페이지로 이동하는 링크가 설정된다.
    content-singel.php

    <div class=”post”>
    <h2><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h2>
    <p class=”postcat”>
    <?php the_category(‘ ‘); ?>

    <?php echo get_the_term_list($post->ID, ‘newscat’,”,’ ‘); ?>

    </p>

    <?php the_post_thumbnail(); ?>

    (생략)

  • 이동경로에 카테고리 표시하기
    뉴스 기사의 개별 페이지의 이동경로에 기사가 속하는 카테고리를 추가한다. 여기에서는 ‘TOP>포스트 타입>카테고리>기사의 제목’이라는 형식이 되게 한다. 이동경로는 microdata를 이용해서 마크업했기 때문에 카테고리의 이름과 URL을 따로 출력해야 한다. 따라서 get_the_terms($post->ID, ‘newscat’)으로 기사가 속하는 카테고리에 관한 데이터를 취득하고, <?php echo $myterm->name; ?>으로 카테고리 이름을 출력하고, <?php echo get_term_link($myterm->slug, ‘newscat’); ?>으로 URL을 출력한다.
    single-news.php

    <?php get_header(); ?><!– 이동경로 –>
    <div id=”breadcrumb”>
    <div itemscope itemtype=”http://data-vocabulary.org/Breadcrumb”>
    <a href=”<?php echo home_url(); ?>” itemprop=”url”>
    <span itemprop=”title”>TOP</span>
    </a> &rsaquo;
    </div><div itemscope itemtype=”http://data-vocabulary.org/Breadcrumb”>
    <a href=”<?php echo get_post_type_archive_link($post_type); ?>” itemprop=”url”>
    <span itemprop=”title”>
    <?php $myposttype = get_post_type_object($post_type); ?>
    <?php echo $myposttype->label; ?>
    </span>
    </a> &rsaquo;
    </div>

    //이동경로에 카테고리 추가하기
    <div itemscope itemtype=”http://data-vocabulary.org/Breadcrumb”>
    <?php $myterms = get_the_terms($post->ID, ‘newscat’);
    $myterm = reset($myterms); ?>
    <a href=”<?php echo get_term_link($myterm->slug, ‘newscat’); ?>” itemprop=”url”>
    <span itemprop=”title”>
    <?php echo $myterm->name; ?>
    </span>
    </a> &rsaquo;
    </div>

    <div><?php the_title(); ?></div>
    </div>
    <!– 콘텐츠 –>
    <div id=”content”>

    <?php if(have_posts()): while(have_posts()):
    the_post(); ?>
    <?php get_template_part(‘content’,’single’); ?>

    <p class=”pagenation”>
    <span class=”oldpage”><?php previous_post_link(); ?></span>
    <span class=”newpage”><?php next_post_link(); ?> </span>
    </p>
    <?php endwhile; endif; ?>
    </div>

    <!– 사이드바 –>
    <div id=”sidebar”>
    <ul>

    //카테고리 메뉴 추가하기
    <li class=”widget”><h2>NEWS 카테고리</h2>
    <ul>
    <?php $myterms = get_terms(‘newscat’); ?>
    <?php foreach ($myterms as $myterm): ?>
    <li>
    <a href=”<?php echo get_term_link($myterm->slug, ‘newscat’); ?>”>
    <?php echo $myterm->name; ?>
    </a>
    </li>
    <?php endforeach; ?>
    </ul>
    </li>

    <li class=”widget”><h2>최신 뉴스</h2>
    <ul>
    <?php query_posts(‘post_type=news&posts_per_page=5’); ?>
    <?php if(have_posts()): while(have_posts()):
    the_post(); ?>
    <?php get_template_part(‘content’,’title’); ?>
    <?php endwhile; endif; ?>
    </ul>
    </li>
    </ul>
    </div>

    <?php get_footer(); ?>

  • 카테고리 메뉴 추가하기
    뉴스 기사의 개별 페이지에 카테고리 메뉴를 추가한다. get_terms(‘newscat’)로 ‘newscat’ 택소노미로 관리하는 모든 카테고리에 관한 데이터를 취득해서 <?php echo $myterm->name; ?>으로 카테고리 이름을, <?php echo get_term_link($myterm->slug, ‘newscat’)로 URL을 출력한다. 또한 카테고리 메뉴는 사이드바에 표시하기 위해 <ul>과 <li>로 마크업하고, ‘NEWS 카테고리’라는 제목을 붙여서 입력한다.
  • 카테고리 페이지 작성하기
    여기까지 표시한 카테고리의 링크를 클릭해서 카테고리 페이지를 열면 화면에 아무것도 표시되지 않는다. 사용자정의 택소노미 기능을 관리하는 카테고리 페이지는 category.php 및 archive-news.php로  생성되지 않고 아무것도 입력되어 있지 않은 index.php로 생성되기 때문이다.
    사용자정의 택소노미의 기능으로 관리하는 카테고리의 페이지는 taxonomy.php로 생성할 수 있기 때문에 taxonomy.php를 작성해서 [sample] 테마 폴더로 업로드한다.
    taxonomy.php는 뉴스 기사의 인덱스 페이지를 생성하는 archive-news.php를 기본으로 생성한다. taxonomy.php에 archive-news.php의 소스를 모두 복사한다. 복사하면 이동경로와 페이지의 제목 부분에 카테고리 이름을 출력하도록 수정한다. get_term_by()로 표시 중인 카테고리에 관한 데이터를 취득해서 <?php echo $terminfo->name; ?>으로 카테고리 이름을 출력한다.
    taxonomy.php

    <?php get_header(); ?><!– 이동경로 –>
    <div id=”breadcrumb”>
    <div itemscope itemtype=”http://data-vocabulary.org/Breadcrumb”>
    <a href=”<?php echo home_url(); ?>” itemprop=”url”>
    <span itemprop=”title”>TOP</span>
    </a> &rsaquo;
    </div>

    <div><?php $terminfo = get_term_by(‘slug’,$term,$taxonomy); ?>
    <?php echo $terminfo->name; ?>

    </div>
    </div>

    <!– 콘텐츠 –>
    <div id=”content”>

    <p class=”title”><?php echo $terminfo->name; ?></p>

    <?php query_posts(‘posts_per_page=5&order=DESC&’ . $query_string); ?>
    <?php if(have_posts()): while(have_posts()):
    the_post(); ?>
    <?php get_template_part(‘content’); ?>
    <?php endwhile; endif; ?>

    <?php get_template_part(‘pagenation’); ?>
    </div>

    <?php get_sidebar(); ?>

    <?php get_footer(); ?>

출처: 바꾸면서 배우는 워드프레스 디자인

답글 남기기