개요

위와 같은 동적 페이지를 만들기 위한 방법을 기록해보겠습니다.

방법 자체는 Isotope플러그인의 filter기능으로 구현했습니다. Isotope – Filtering을 보시는게 더 쉽고 간단할 수 있습니다.

위의 페이지는 Types플러그인 이용하여 아래의 기능으로 이루어졌습니다.

custom post 생성 : ‘link’

taxonomy 생성 : ‘linktag

‘link’ custom post를 ‘linktag’ taxonomy와 연결

아래 소스는 http://blogurl.com/link 로 접속했을 때 출력되는 페이지를 overdrive하기 위해 만든 archive-link.php이고, 이 파일의 loop안에서 content-linkthumb.php를 불러오게 됩니다.

archive-link.php

    <?php
    /**
     * The template for displaying Archive pages.
     *
     */

    get_header(); ?>
    <?php
    //custom post name : link
    //tag(taxonomy) : linktag
    //
    //archive-link.php는 link 라는 custom post를 출력하는 페이지.
    //이 파일이 없을 경우 archive.php가 출력되는데, 테마 폴더 안에 이 파일을 만들면 http://blogurl.com/link로 접근할 때
    //archive.php대신 출력된다.

    $args = array(
        'post_type' => 'link',
        'posts_per_page' => -1
        );
    $the_query = new WP_Query( $args ); // 포스트 갯수는 설정에서 지정해 둔 숫자로 출력되는데 전체 포스트를 출력하기 위해 wp_query를 새로 지정해줌.
    ?>

    <section id="primary" class="content-area">

        <h2>A.some.link</h2>

        <div id="filters" class="button-group">
            <button data-filter="*">show all</button>
            <?php
            // 페이지 상단 버튼 태그 버튼 그룹.
            // taxonomy 'linktag'의 terms들을 출력한다.
            $args = array(
                'orderby' => 'name',
                'taxonomy' => 'linktag',
                'hide_empty' => 1,
                'order' => 'ASC'
                );
            $categories = get_categories($args);
            foreach($categories as $category) {
                echo '<button data-filter="'.$category->slug.'">'.$category->name.'</button>';
            }
            ?>
        </div>
        <div class="linkthumbs">
            <?php
            if ( $the_query->have_posts() ) :
                while ( $the_query->have_posts() ) : $the_query->the_post();
            get_template_part( 'content', 'linkthumb'); // content-linkthumb.php를 인클루드한다.
            endwhile;
            endif;
            wp_reset_postdata();
            ?>

        </div>
    </section>
    <script src="http://dev.0-q.me/js/isotope.pkgd.min.js"></script>
    <script>

    jQuery( document ).ready( function( $ ) {
        var $container = $('.linkthumbs');
        var currentFilter = '*';
        $container.isotope({
          itemSelector: '.linkthumbs article',
          layoutMode: 'fitRows'
        });
        $('#filters').on( 'click', 'button', function() {
            //#filters아래의 button을 클릭했을 때 이벤트.

            var filterValue = $(this).attr('data-filter') ; // 클릭한 버튼의 data-filter을 확인
            if(currentFilter != filterValue ){ // 현재의 filterValue와 클릭한 filterValue를 확인하여 다를때 실행.
                currentFilter = filterValue;
                $(this).siblings().removeClass('selected');
                $(this).toggleClass('selected'); // 클릭한 버튼에 selected 클래스를 지정하고 나머지 버튼에서 해당 클래스를 제거
                filterValue = $(this).attr('data-filter') == '*' ? '*' : '.tag-'+$(this).attr('data-filter') // filterValue확인
                $container.isotope({ filter: filterValue }); // isotope에서 해당 데이터만 보이게 함.
            }
        });
        $('.tags').on( 'click', 'a', function() {
            // .tags아래의 버튼을 클릭할때 data-filter속성을 확인하여 jquery의 trigger을 이용. 상단의 태그들에서 같은 버튼을 클릭한 효과를 낸다.
            var thisValue = $(this).attr('data-filter') == '*' ? '*' : $(this).attr('data-filter') ;
            $('#filters').find("[data-filter='" + thisValue + "']").trigger('click');
            //console.log(thisValue); // 디버깅 용도
        });

    });
    </script>

    <?php get_sidebar('sidebar-1'); ?>
    <?php get_footer(); ?>
    `</pre>

content-linkthumb.php

<?php
    /**
     */
    $linkurl = types_render_field("links", array("raw"=>"true")); //types에서 지정한 links 항목을 $linkurl에 불러온다.
    if($linkurl){
        $linkurl = addhttp($linkurl); // http://가 없을 시 붙여주는 펑션(functions.php에서 만들어 줌.)
    }
    ?>
    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <header class="entry-header">
            <div class="entry-meta">
                <span class="entry-in-time" style="display:none;"> <?php the_time('Y.m.d'); ?> </span>
                <span class="tags"><?php

                $linktags = wp_get_object_terms($post->ID, 'linktag');
                // taxonomy : 'linktag'의 terms들을 출력한다.
                foreach($linktags as $category) {
                    echo '<a data-filter="'.$category->slug.'" href="#">'.$category->name.'</a>';
                }

                ?></span>
            </div>
            <h3 class="entry-title">
                <a href="<?php echo $linkurl ?>" title="<?php echo 'go to '.$linkurl ?>" rel="bookmark" target="_blank" class="newwindow">
                    <?php the_title(); ?>
                </a>
            </h3>

        </header>

        <div class="entry-summary">

            <?php if ( has_post_thumbnail() && ! post_password_required() ) : ?>
            <div class="post-thumbnail">
                <a href="<?php echo $linkurl ?>" title="<?php echo 'go to '.$linkurl ?>" rel="bookmark" target="_blank" class="newwindow"><?php the_post_thumbnail();?></a>
            </div>

            <?php elseif($linkurl != ''): ?>
            <a href="<?php echo $linkurl ?>" title="<?php echo 'go to '.$linkurl ?>" rel="bookmark" target="_blank" class="newwindow">
            <?php echo do_shortcode('[stwthumb]'.$linkurl.'[/stwthumb]' ); //shrinktheweb 플러그인을 이용해 썸네일을 생성?>
            </a>
            <?php endif; ?>

        </div>

    </article>
Tags : #wordpress