WordPress : 指定されたタグを持つ記事から最新n件を出力する関数

WordPress

WordPressで指定されたタグを持つ記事から最新n件を出力する関数を書いた。

この関数は、現在表示されている記事のタグから関連記事を抽出する場合を想定して作成しました。

関数のコード

以下の関数を functions.php に置く。

function get_related_tag_article( $tag, $show_post='10', $order_by='DESC', $sort_key='ID', $sort_by='DESC' )
{
    // 関連記事格納用変数初期化
    $posts = array();
    // 重複チェック用記事ID
    $post_not_in = array();
    // 表示している記事の記事IDを格納する
    $post_not_in[] = get_the_ID();

    // 数値以外だったらエラー防止のためにデフォルト値をセットする
    if(!is_numeric($show_post))
    {
        $show_post = '10';
    }

    // 基準キー順がASC・DESCでなかったらデフォルト値をセットする
    if($order_by != 'ASC' && $order_by != 'DESC')
    {
        $order_by = 'DESC';
    }

    // 並び変えキーがID・post_dateでなかったらデフォルト値をセットする
    if($sort_key != 'ID' && $sort_key != 'post_date')
    {
        $sort_key = 'ID';
    }

    // 並び変え順がASC・DESCでなかったらデフォルト値をセットする
    if($sort_by != 'ASC' && $sort_by != 'DESC')
    {
        $sort_by = 'DESC';
    }

    // 最終的な並び順によって変数の中身を変える
    if($sort_by == 'ASC')
    {
        $sort_by = SORT_ASC;
    }
    else
    {
        $sort_by = SORT_DESC;
    }

    // 引数に従ったクエリ
    $query = array(
        'tag_id' => $tag->term_id ,
        'post__not_in' => $post_not_in,
        'showposts'=> $show_post,
        'caller_get_posts'=>1,
        'post_status' => 'publish',
        'orderby' => $order_by
    );
    query_posts($query) ;

    $i = 0 ;
    if ( have_posts() ) : while ( have_posts() ) : the_post();
        $post_not_in[] = get_the_ID();
        $posts[$i]['ID'] = get_the_ID();
        $posts[$i]['title'] = the_title(NULL,NULL,false);
        $posts[$i]['title_atr'] = the_title_attribute( 'echo=0' );
        $posts[$i]['permalink'] = get_permalink();
        if( has_post_thumbnail( $query->ID ) ) {
            $posts[$i]['thumbnail'] = get_the_post_thumbnail( $query->ID, 'thumbnail');
        } else {
            $posts[$i]['thumbnail'] = '<img src="NO_IMAGE.PNG" alt="no image" >' ;
        }
        ++$i;
    endwhile; endif;
    // クエリリセット
    wp_reset_query();

    // 関連記事が1件以上あったら出力する。
    if(count($posts) > 0)
    {
        // ソートするために変数にキーと値を格納する
        foreach ($posts as $key => $row)
        {
            $sort[$key] = $row[$sort_key];
        }

        // ソートする
        array_multisort( $sort, $sort_by, $posts );

        // 最後に出力する
        echo '<div class="related_post">' ;
        foreach($posts as $related_article)
        {
            echo <<<EOF
            <a href="{$related_article['permalink']}" title="{$related_article['title_atr']}">{$related_article['thumbnail']}{$related_article['title']}</a>
EOF;
        }
        echo '</div>' ;
    }
}

吐き出すHTMLコードが気に入らない場合は「// 最後に出力する」以下を修正してください。

サムネイル画像表示が不要な場合は、$posts[$i]['thumbnail’] に関する記述を削除してください。

関数の使い方例

上記関数をfunctions.phpに記述後、個別記事の表示を行っているテンプレートファイル(single.php やcontens-single.php) で、以下のような呼び出しを行います。

<?php 
    $tags = get_the_tags();
    foreach($tags as $tag) {
        echo "<h3 class=\"boxcont-title\">" . $tag->name . "に関連する最近の記事</h3>" ;
        get_related_tag_article( $tag, 4 ) ;
    }
?>

get_the_tagsで取りだしたタグ配列から個別にタグを取りだし、ひとつずつ get_related_tag_article 関数に渡してください。