カテゴリー別人気記事ランキングウィジェット 複数カテゴリー対応版

カテゴリー別人気記事ランキングウィジェット 複数カテゴリー対応版

プラグインなしで人気記事一覧ウィジェット化」として4回に分けてプラグインなしで人気記事ランキングウィジェットの作り方を備忘録したのだが、そのうちの『プラグインなしで人気記事一覧ウィジェット化-カテゴリー別人気記事ランキングウィジェット』のコードを、複数カテゴリー対応にするのとカテゴリー一覧ページにもそのカテゴリーの人気記事を表示するために見直した。

SEO的にはカテゴリーは1つがよい

うちのサイトなんぞは検索にかからないので話しにならんのだけれど、SEOの観点で見ればカテゴリーは1記事1カテゴリーがよい。まあカテゴリー一覧ページをそんなに重要視する必要もないかもしれないけど、検索エンジン・クローラーからみてもあちこちのカテゴリーに同じ記事があるのはいかがなものかということ。

ユーザーからみたらどうなのという話、例えば私が何かについてググってあるサイトのある記事に辿り着いたとしてその記事を一読して関連記事なんてあったら興味があれば観る。次に興味のあるカテゴリーなんてあれば一覧を覘くという行動をする。

もちろんあるひとつのことを調べている場合探している内容ではないとすぐに次のサイトの記事にいくし、すべてのユーザーが上の例えのような行動をとるわけではないけどカテゴリー一覧ページて結構便利だと思う。

SEO的に検索エンジン・クローラーからすればカテゴリは1つがいいけど、ユーザー目線からすれば適切なカテゴリー分けがされてるという前提条件付きで複数カテゴリーに1つの記事が属していても便利じゃないのという話。記事を書いてる方からするとカテゴリーをひとつにしたいけどどうしても内容的にひとつにできないこともある。

Webページに出力するウィジェットの内容 widget()

どうでもよい前置きが長くなったが変更したのは『Webページに出力するウィジェットの内容』の部分。この部分を下のコードに差し替えた。他のクラス継承とかウィジェットフォームとか更新部分とかはそのままでOK。

/* ウィジェットの内容をWebページに出力 */
public function widget($args, $instance) {
extract($args);
echo $before_widget;
if(is_category()){
$categories = get_category(get_query_var('cat'),false);
$outputname = $categories -> cat_name;
$output = $categories -> term_id;
}
if (is_single()){
$categories = get_the_category();
$separator = ',';
$output = '';
$outputname = '';
foreach( $categories as $cate ) {
$outputname .= $cate -> cat_name . $separator;
$output .= $cate -> term_id . $separator;
}
$outputname = trim( $outputname, $separator ); 
$output = trim( $output, $separator );
}
if (is_single() || is_category()){
echo '<h2>' . $outputname. ' <span class="fon14">カテゴリーの人気記事</span></h2>';	
}
else {
echo '<h2>おすすめの人気記事</h2>';
}
$number = $instance['number'] ;
?>
<div class="ninki-kiji">
<ul>
<?php 
get_the_ID();
$args = array(
'cat' => $output,
'meta_key'=> 'post_views_count',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'post_type' => array('post','page'),
'posts_per_page' => $number
);
$my_query = new WP_Query( $args );?>
<?php while ( $my_query->have_posts() ) : $my_query->the_post(); $rankcount++; ?>
<li>
<a href="<?php the_permalink(); ?>">
<span class="cat-rank-count ranking-count<?php echo $rankcount; ?>">
<?php echo $rankcount; ?>
</span>
<?php if( has_post_thumbnail() ): ?>
<?php the_post_thumbnail('thumb100'); ?>
<?php endif; ?>
<div class="cat-ninki-kiji-text">
<h3><?php the_title(); ?></h3>
<p><?php
$str = get_the_excerpt();
$count = 60;
$more = '...';
echo wp_html_excerpt( $str, $count, $more );
?></p>
</div>
</a>
</li>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
</ul>
</div>
<?php echo $after_widget;
}

カテゴリー一覧ページはget_category()でカテゴリー情報取得

5行目から9行目、get_category()で今いるカテゴリー一覧ページのカテゴリー情報を取得、$outputnameにカテゴリー名、$outputにカテゴリIDを入れとく。

投稿記事ページはget_the_category()で属する全てのカテゴリー情報取得

10行目から21行目、get_the_category()で今居る投稿記事ページの属する全カテゴリーの情報を取得、$outputnameカンマ , 区切りで全てのカテゴリー名、$outputカンマ , 区切りで全てのカテゴリIDを入れとく。

foreach()のままだと$outputnameと$outputの最後に$separator(カンマ , )がついたままなのでtrim()で取っておく。

カテゴリー一覧ページと投稿記事ページではカテゴリー名表示

22行目から24行目、is_single() || is_category()でカテゴリー一覧ページと投稿記事ページでは$outputname(カテゴリー名)を表示、他では『おすすめの人気記事』と表示(全記事からの人気記事ランキングになるはず)。

WP_Queryに渡す条件にカテゴリーIDを入れる

35行目、'cat' => $output, WP_Queryに渡す条件にカテゴリーIDを入れる。カテゴリー一覧ページではそのカテゴリーのIDひとつ、投稿記事ページでは複数カテゴリーに属する場合はカンマ区切りで全ての属するカテゴリーのIDが入るはず。

カテゴリー分けは適切にする

以上で複数カテゴリーに属する投稿記事ページでは属する全カテゴリー内での人気記事ランキングウィジェットが表示され、カテゴリー一覧ページではそのカテゴリーでの人気記事ランキングウィジェットが表示され、思ったとおりの挙動をするようになった。(今のところは)

このサイトは備忘録的なサイトだから別段私だけわかればいいのだけど(WEB上に公開してる時点で本音は違うけど 苦笑)、折角ごく限られた人、いや1人でもアクセスしてくれる人がいるのなら、SEOではよくなくても、爪の先でも役立ててもらう為にカテゴリー分けは適切にする条件で複数カテゴリーもありだと思う今日このごろ。