WordPressで現在のカテゴリと親カテゴリの人気記事を表示する方法!

_blog

こんにちは、えんぞーです。

今回は久々に Wordpress 関連の事を書きたいと思います。

WordPress に関しては非常に情報が多いので目新しいことは書けないのですが、後々同じような事するときの為にコピペ出来るように残しておこうかと思いまして・・・w

少なからずささっとコピペして実装したい人いるのではないかなぁ・・・とか思いますし。

で、今回のお題は人気記事の表示です。

人気記事表示の概要

2015-05-26_16h55_43

人気記事の表示と言っても既存のプラグインである「WordPress Popular Posts」を利用してちょっと表示を弄る感じです。

当然ながらこのプラグイン無いと動かないのでインストールは必須になります。

目的としては、よく目にする指定したカテゴリの人気記事を表示させるという事なのですが今回そこにちょっと手を加えます。

  • 現在表示している記事・カテゴリの人気記事を表示する
  • そのカテゴリの親カテゴリの人気記事も表示する

こんな感じになります。

結果としては今見ているこのページの右サイドバーに表示している人気記事一覧が出来上がります。

ここは「Wordpress」カテゴリなのでそこでの人気記事と親カテゴリである「Web 制作関連」のカテゴリの人気記事が表示されています。

カスタマイズのためのコード

解説しながらコード出していっても良いのですが、需要としては「コピペしてはよ動かしたい」だと思うのでポイント絞って書いていきますw

function.php へ関数を追加

まず、テーマファイルにある「function.php」へ下記のコードを記載します。

 1/*
 2 *人気記事取得の基本関数(Wordpress PopularPosts使用)
 3 */
 4function getpopular($range,$limit,$cat){
 5    if ( function_exists('wpp_get_mostpopular') ) {
 6        $pram = array (
 7            'range' => $range, //集計期間の指定(daily,weekly,monthly)
 8            'limit' => $limit, //最大表示数
 9            'cat'   => $cat,
10            'wpp_start' => '<ul>',//囲みタグの始まり
11            'wpp_end' => '</ul>',//囲みタグの終わり
12            'post_type' => 'post', //対象にするタイプを指定(今回は投稿のみ)
13            'title_length' => '35', //タイトル文字数の上限を指定
14            'stats_comments' => '0', //コメント数は表示しない
15            'thumbnail_width' => '95', //サムネイル画像のwidth(px)
16            'thumbnail_height' => '95', //サムネイル画像のheight(px)
17            'post_html' => '<li>{thumb}<span>{title}</span></li>', //表示htmlの指定
18        );
19        wpp_get_mostpopular($pram);
20    }
21}

効率よく人気記事自体を引っ張ってくる為に関数にしました。

これで集計期間・最大表示数・カテゴリを指定して人気記事を引っ張ってこれるようになります。

「function_exists」で WordpressPopularPost の関数の存在を確認しているのでプラグインが無くてもエラーにはなりません。もちろん動きませんがw

他のパラメーターは好きに弄ってもらって大丈夫ですし、なんならほかパラメーターも引数にして自由度を上げても OK です。

この関数を単体で使用する場合は、こんな感じになります。

;

上の例で言うと日毎の集計で最大 5 つ、カテゴリ指定は無しで表示されます。

テンプレートファイルに呼び出し部分を追加

あとは呼び出し部分をテンプレートのファイルに追加します。

 1<div class="popularranking">
 2<h4 class="pop_all">総合人気記事</h4>
 3<?php getpopular('daily',5,""); ?>
 4
 5<?php
 6if(is_single()){
 7    //シングルページの場合での動作
 8    $cat = get_the_category();
 9    $cat = $cat[0];
10    $cat_id   = $cat->cat_ID;
11    $cat_name = $cat->name;
12    echo '<h4 class="pop_here">「'.$cat_name.'」の人気記事</h4>';
13    getpopular('weekly',5,$cat_id);
14
15    //親の人気ランキング
16    $parent_id = $cat->category_parent;
17    $categories = get_categories('child_of='.$parent_id.'');
18    $parent = get_category($parent_id);
19    $parent_name = $parent->name;
20    //親カテゴリの名前がなかった場合は処理しない
21    if($parent_name){
22        $catearray = array();
23        $i=0;
24        //現在いるカテゴリの親のランキングが欲しいので親に含まれる子カテゴリを列挙
25        foreach($categories as $category) {
26            $catearray[$i] = $category->term_id;
27            $i++;
28        }
29        $childcat = implode(",",$catearray);
30
31        echo '<h4 class="pop_parent">「'.$parent_name.'」の人気記事</h4>';
32        getpopular('weekly',5,$childcat);
33    }
34
35} elseif(is_category()){
36    //カテゴリページの場合での動作
37
38    $parent_id = get_queried_object()->category_parent;
39    $cat_cat = get_queried_object()->cat_ID;
40    $cat_catname = get_queried_object()->cat_name;
41
42
43    $categories = get_categories('child_of='.$cat_cat.'');
44    $catearray = array();
45    $i=0;
46    if ($categories) {
47        foreach($categories as $category) {
48            $catearray[$i] = $category->term_id;
49            $i++;
50        }
51        $childcat = implode(",",$catearray);
52        echo '<h4 class="pop_here">「'.$cat_catname.'」の人気記事</h4>';
53        getpopular('weekly',5,$childcat);
54    }else{
55        echo '<h4 class="pop_here">「'.$cat_catname.'」の人気記事</h4>';
56        getpopular('weekly',5,$cat_cat);
57    }
58
59    //親の人気ランキング
60    $categories = get_categories('child_of='.$parent_id.'');
61    $parent = get_category($parent_id);
62
63    $parent_name = $parent->name;
64    if($parent_name){
65        $catearray = array();
66        $i=0;
67        foreach($categories as $category) {
68            $catearray[$i] = $category->term_id;
69            $i++;
70        }
71        $childcat = implode(",",$catearray);
72
73        echo '<h4 class="pop_parent">「'.$parent_name.'」の人気記事</h4>';
74        getpopular('weekly',5,$childcat);
75    }
76}
77?>
78</div>

えんぞーどっとねっとのテーマで言うと、sidebar.php に追加していますが別にどこでもいいです。

「popularranking」というクラス名で囲んでいます。

総合人気記事、現在表示しているカテゴリの人気記事、その親カテゴリの人気記事という順番で 5 件ずつ表示するようにしています。

シングルページ・カテゴリページでしか動作しないようになっており、親カテゴリ名がない場合(ルートの場合)は処理しません。

親のカテゴリについては parent_id で引っ張ってきてそこにぶら下がっているカテゴリを列挙して値を渡しています。

ちなみに、アクセスされたページが無くて人気記事が取得できない場合は「Sorry. No data so far.」という文字列が出ます。

こんな感じでいいんでね?ってノリで組んだらうまく動いたようだったのでそのまま掲載してます。

なので、コード自体に余分な部分があるとかおかしい所があるかも知れませんがその辺はご愛嬌という事で・・・。

これはまずいぞっていう部分あれば教えて頂ければ嬉しいです^^

一応 CSS も載っけておきます

このサイトで表示している人気記事リスト部分の CSS も載せておきます。

※このままだと「Wordpress Popular Posts」のデフォルト CSS の影響も受けてしまう様ですので上で記載した function.php に囲みタグのデフォルト値も追加しました。

 1.popularranking {
 2  margin: 5px 0;
 3}
 4
 5.popularranking li {
 6  margin: 5px 0;
 7  display: block;
 8  height: 95px;
 9  background-color: #FAFAFA;
10  border-bottom: dashed 1px #cccccc;
11}
12
13.popularranking li:nth-child(odd) {
14  background-color: #F0F0F0;
15}
16
17.popularranking li a img:hover {
18  opacity: 0.5;
19  filter: alpha(opacity=50);
20  -moz-opacity: 0.5;
21}
22
23.popularranking li span a {
24  display: block;
25  text-align: left;
26  color: #6b6b6b;
27  font-size: 14.5px;
28  padding: 5px;
29  text-decoration: none;
30}
31
32.popularranking li span a:hover {
33  color: #ff1822;
34}

 

とりとめのないまとめ

おそらくもっとスマートなやり方で実装している人もいるかと思うのであくまでこんな実装方法もあるよね位に考えてもらえれば(´ε`;)ウーン…

普段からテーマファイル弄っている人であれば条件等も変更して自分好みに出来るかと思うのでその辺は色々弄ってみるといいですね。

基本的にコピペすれば動くと思いますので特に難しい事はないはずですが、Wordpress Popular Postのプラグインはインストール忘れないようにしてくださいw