WordPress で関連記事を表示するウィジェットを、プラグインを使わず自作する
WordPressを本格的に勉強しはじめてからもうすぐ半年。このブログでようやくガチガチのWordPressエントリを書ける日がやってきました。今日の記事の対象は、WordPressのソースをいじりはじめた初心者〜中級者の方々と思われます。まだ中級がどんなものか分かってませんが( ´ ▽ ` )ノ
WordPressで作られたサイトでよく見る「関連記事」エリア。プラグインでやれば一発ですが、クライアントの要望に細やかに対応するため、それから自分自身がコードを勉強するために、いろいろごにょごにょとやってみました。
検索でたどり着いてくださった方は、はじめましてですね。名古屋でWordPressを中心としたWEB制作を行っている gutchino と申します。ぐっちーの。グッチーノ。イタリア人きどりですみません。新潟出身の父と愛知出身の母を持つ、純粋な日本人です。最近言ってみたいのはイギリスとスペインとニッポンの田舎です。
さて、今日ご紹介するのは、WordPress で関連記事を表示するウィジェットを、プラグインを使わず自作する(=ファイルにコード書く)という、需要があるのかないのかよく分からないものです。万が一「キターーーーー(・∀・)ーーーーー!」って方がいたらコードもってってください。ダブルクリックで全選択できます。それでは早速。
おしながき
1. 関連する記事一覧を表示する
2. ウィジェットを作る
3. あとはいつも通りウィジェット設定

1. 関連する記事を表示させる
sidebar.php などに直書き、またはそれをテンプレート化して使います。関連する=同じタグが付いていると解釈し、今回はアイキャッチ無しで作りました。もちろん有りにもできますが、その方法はまた別エントリで。
コードはこちら。
※おなじみWebクリエイターボックスさんの記事を参考にさせていただきました。ありがとうございました!
<ul>
<?php
global $wp_query;
$post = $wp_query->get_queried_object();
$tags = wp_get_post_tags($post->ID);
$tagIDs = array();
if ($tags) {
$tagcount = count($tags);
for ($i = 0; $i < $tagcount; $i++) {
$tagIDs[$i] = $tags[$i]->term_id;
}
$args=array(
'tag__in' => $tagIDs,
'post__not_in' => array($post->ID),
'showposts'=>4,
'caller_get_posts'=>1
);
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<li class='relatedPost'>
<a href='<?php the_permalink();?>' title='<?php the_title_attribute(); ?>'><?php the_title(); ?></a>
</li>
<?php endwhile; wp_reset_query(); ?>
<?php } else { ?>
関連する記事は見当たりません。
<?php } ;
} ?>
</ul>
2. ウィジェットを作る
上記コードを参考にしてウィジェット用に書き直した次のコードを functions.php に貼り付けます。
class WP_Widget_relation extends WP_Widget {
function WP_Widget_relation() {
$widget_ops = array(
'classname' => 'WP_Widget_relation',
'description' => 'アイキャッチ付きの関連記事一覧',
);
$this->WP_Widget('relation', '関連記事一覧作った!', $widget_ops);
}
function widget($args, $instance) {
extract( $args );
$title = apply_filters('widget_title', $instance['title']);
?>
<?php
echo $before_widget;
if ( $title ) echo $before_title . $title . $after_title;
<ul>
<?php
global $wp_query;
$post = $wp_query->get_queried_object();
$original_post = $post;
$tags = wp_get_post_tags($post->ID);
$tagIDs = array();
if ($tags) {
$tagcount = count($tags);
for ($i = 0; $i < $tagcount; $i++) {
$tagIDs[$i] = $tags[$i]->term_id;
}
$args=array(
'tag__in' => $tagIDs,
'post__not_in' => array($post->ID),
'showposts'=>4,
'caller_get_posts'=>1
);
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<li>
<a href='<?php the_permalink();?>' title='<?php the_title_attribute(); ?>'><?php the_title(); ?></a>
</li>
<?php endwhile; wp_reset_query(); ?>
<php } else { ?>
関連する記事は見当たりません。
<?php } ;
} ?>
</ul>
echo $after_widget; ?>
<?php
}
function update($new_instance, $old_instance) {
return $new_instance;
}
function form($instance) {
$title = esc_attr($instance['title']);
?>
<p><label for='<?php echo $this->get_field_id('title'); ?>'><?php _e('Title:'); ?> <input class='widefat' id='<?php echo $this->get_field_id('title'); ?>' name='<?php echo $this->get_field_name('title'); ?>' type='text' value='<?php echo $title; ?>' /></label></p>
<?php
}
} // class WP_Widget_relation
// register WP_Widget_relation widget
add_action('widgets_init', create_function('', 'return register_widget('WP_Widget_relation');'));
3. あとはいつも通りウィジェット設定
1で書いたコードの代わりに、
<?php dynamic_sidebar( 'secondary-widget-area' ); ?>
と書いて、管理画面 > 外観 > ウィジェット から、先ほど作成したウィジェットを選べば無事表示され…ましたよね!?
ウィジェットエリアを増やすなど、需要の高いハウツーは他の方がたくさん良記事を書いてくださっているので、Googleで探してみて下さい。
さいごに
長くなるので今回は書きませんでしたが、次回以降に書こうと考えているのは次の通りです。
・ウィジェットの作り方の解説。
・ウィジェットで表示させる中身の作り方。
・プラグインをしれっと functions.php に引越させる方法。
・長くなった functions.php の中身を他のテンプレートファイルにごそっと移す方法。
いつもそうですが、今回もコードを作る上でたくさんの先人たちに助けられました。この場を借りてお礼申し上げます。
また、ここでご紹介しているコードはコピペしたり手を加えたりしてどんどん使ってください。その際にバグを発見された方はぜひお知らせください。