WordPress 最近の新着記事・更新記事の一覧ウィジェット

2018年3月25日

WordPress 最近の新着記事・更新記事の一覧ウィジェット

新着記事と更新記事の一覧をサイドバーにサムネイル付きで表示するウィジェットの作り方。新着記事一覧のウィジェットはよくあるが、古い投稿でも更新されると一覧の最初に表示される。要は内容の更新順の投稿一覧ウィジェットということ。

新着記事には設定した期間「新着」マークを表示し期間終了後は何もつけない。内容を更新した古い記事には「更新」マークが付く。ウィジェットのタイトル(未指定で「最近の新着・更新記事」)と表示記事件数(最大10件)を指定できる。

追記 2018.04.30

リストのN番目にランダム広告を挿入する機能?をつけてウィジェットオプションを追加したので一部コードが変更になっている。詳しくは下のページ

SEOにも重要 更新にも2通りの意味がある

更新記事 更新にも2通りの意味
更新記事 更新にも2通りの意味

SEOでよく「ブログは更新するのが重要」とか言われるがこれは一般的に更新頻度という意味での更新(なんだか日本語が変)。ようは毎日ブログは記事をアップした方がよいよということ。もちろん質の悪いブログを毎日更新しても無意味だけど。

ここで説明している「最近の新着記事・更新記事の一覧ウィジェット」の更新というのは、古い記事の投稿内容を見直したり、訂正したり、古い情報を最新の情報にしたりと過去の記事をメンテナンスしたことを更新と言っている。

古い記事をメンテナンスしたという意味での更新もSEOで結構重要なようで、例えばあるキーワードで検索ランキング上位に表示されてた記事も時間とともに次から次へとアップされる他サイトのすばらしい記事に抜かれるということがある。

ランキングを維持するために古い記事でもきっちりメンテナンス(更新)すれば効果があるようでないようで云々という話を見たことがある。もちろん内容に変更もなく少し表示を変えただけなのに更新日時だけ更新するのは逆にスパムとなる。

要は検索エンジン様様は、ユーザー視点にたってちゃんと古い記事もメンテナンス(更新)してると評価しますよ。更新してるように見せかけてるとスパムにしまっせということらしい。まあ当備忘録は内容があらあらなので論外だけど。

ということで当備忘録もユーザー視点にたって(ほぼユーザーは私ひとり)、内容を変更・更新したよというアピールを兼ねて、最近の新着記事・更新記事の一覧ウィジェットを作ってみたということ。まあ、後々私自身がどんな経緯でこうしたんだと思い出すのに意味がある。

新着記事・更新記事の一覧ウィジェット

毎度毎度長い前置きはこれくらいにして、新着記事・更新記事の一覧ウィジェットの作り方。functions.phpに直にコードを追加しないで下記ページのようにテンプレートパーツ化している。ウィジェット化自体はWebページに表示する部分以外は定型的なのでサラッと流します。

WP_Widgetクラスを継承 Widget名前や説明

<?php
class New_Kousin extends WP_Widget {
function __construct() {
parent::__construct(
'new_kousin',
'最近の新着・更新記事',
array( 
'description' => 
'最近の新着記事・更新記事の一覧ウィジェット' )
);
}

ウィジェットの内容をWebページに出力

public function widget($args, $instance) {
extract($args);
echo $before_widget;
if(!empty($instance['title'])) {
$title = apply_filters('widget_title', $instance['title'] );
}
if ($title) {
echo $before_title . $title . $after_title;
} else {
echo '<h3 class="side-title">最近の新着・更新記事</h3>';
}
$number = $instance['number'] ;
?>
<div class="ninki-kiji">
<ul>
<?php get_the_ID(); 
$args = array(
'orderby' => 'modified',
'order' => 'DESC',
'posts_per_page' => $number
);
$my_query = new WP_Query( $args );
while($my_query->have_posts()):$my_query->the_post();
?>
<li>
<a href="<?php the_permalink(); ?>">
<?php
if(get_the_modified_date('Y/n/j')!= get_the_time('Y/n/j')):
?>
<span class="kousin-kiji">
更新
</span>
<?php else :
$kikan  =  $instance['nichisuu'] ;
$genzai = date_i18n('U');
$koukai = get_the_time('U');
$keika = date('U',($genzai - $koukai)) / 86400 ;
if( $kikan > $keika ) : ?>
<span class="new-kiji">
新着
</span>
<?php endif; ?>
<?php endif; ?>
<?php if( has_post_thumbnail() ): ?>
<?php the_post_thumbnail('thumb100'); ?>
<?php endif; ?>
<div class="ninki-kiji-text">
<p><?php the_title(); ?></p>
<p class="new-des"><?php
$str = get_the_excerpt();
$count = 40;
$more = '...';
echo wp_html_excerpt( $str, $count, $more );
?></p>
</div>
</a>
</li>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
</ul>
</div>
<?php echo $after_widget;
}

基本的にはWP_Queryサブループで新着記事一覧を取得するよくあるコード。そこにウィジェットオプションで指定した期間新着マークをつける処理や公開日と更新日が違う場合更新マークをつける処理があるといった感じ。

'orderby' => 'modified'で更新日順で記事情報取得

18行目、'orderby' => 'modified'で更新日の新しい順で記事情報を取得。よくある新着記事一覧ウィジェットにするなら'orderby' => 'date'とすればただの新着記事一覧となる。

公開日と更新日が違うなら更新マーク

27行目から32行目、get_the_modified_date('Y/n/j')!= get_the_time('Y/n/j')のところ、公開日をget_the_time()で取得、get_the_modified_date()で更新日を取得、公開日と更新日が違う場合「更新」マークつけてね。

ウィジェットオプションで指定した期間新着マークをつける

33行目から42行目、ウィジェットオプション $instance['nichisuu'] で指定した期間「新着」マークをつける処理。詳細は下記ページ。

wp_html_excerpt 抜粋表示

49行目から54行目、wp_html_excerptで投稿の抜粋から40文字分抜き出して表示する処理。抜粋やら概要をhtmlタグを抜いて文字数指定で表示するとき結構便利なWordPress関数のような気がする。

CSS

.ninki-kiji ul {
padding: 0;
list-style: none;
}
.ninki-kiji li {
position: relative;
margin-top: 10px;
padding: 0 5px 10px;
border-bottom: dotted 1px #ddd;
}
.ninki-kiji a {
display: inline-block;
text-decoration: none;
color: #AD3B32;
font-weight: bold;
}
.ninki-kiji a:hover {
background-color: #fafad2;
}
.ninki-kiji a:after {
display: block;
clear: both;
content: '';
}
.new-kiji {
position: absolute;
top: 0;
left: 0;
padding: 1px 5px;
color: #fff;
font-size:0.8em;
background: rgba(255, 0, 0, .85);
}
.kousin-kiji {
position: absolute;
top: 0;
left: 0;
padding: 1px 5px;
color: #fff;
font-size:0.7em;
font-weight:normal;
background: rgba(0, 0, 0, .85);
}
.ninki-kiji img {
float: left;
width: 100px;
height: 100px;
}
.ninki-kiji-text {
font-size: .9em;
margin-left: 110px;
line-height:1.5em;
}
p.new-des {
font-size:14px;
font-weight:normal;
line-height:1.3em;
color:#333;
}

ウィジェット設定フォームを出力

public function form($instance) {
?>
<p>
<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('タイトル:'); ?></label>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('title'); ?>"
name="<?php echo $this->get_field_name('title'); ?>"
value="<?php echo esc_attr( $instance['title'] ); ?>">
</p>
<p>
<label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('記事表示件数:'); ?></label>
<input type="text" id="<?php echo $this->get_field_id('number'); ?>"
name="<?php echo $this->get_field_name('number'); ?>"
value="<?php echo esc_attr( $instance['number'] ); ?>" size="2">
</p>
<p>
<label for="<?php echo $this->get_field_id('nichisuu'); ?>"><?php _e('表示日数:'); ?></label>
<input type="text" id="<?php echo $this->get_field_id('nichisuu'); ?>"
name="<?php echo $this->get_field_name('nichisuu'); ?>"
value="<?php echo esc_attr( $instance['nichisuu'] ); ?>" size="2">
</p>
<?php
}

ウィジェットオプション

public function update($new_instance, $old_instance) {
$instance = $old_instance;
$instance['title'] = sanitize_text_field($new_instance['title']);
$instance['number'] = ctype_digit($new_instance['number']) ? $new_instance['number'] : 5;
/* 記事表示件数11以上の場合10件表示 */
if( $instance['number'] == 0 || 10 < $instance['number']){$instance['number'] = 10 ; };
$instance['nichisuu'] = ctype_digit($new_instance['nichisuu']) ? $new_instance['nichisuu'] : 7;
/* 表示日数30日以上の場合30日表示 */
if( $instance['nichisuu'] == 0 || 30 < $instance['nichisuu']){$instance['nichisuu'] = 30 ; };
return $instance;
}
}/* class New_Kousin 終わり */

ウィジェットの登録処理

add_action( 'widgets_init', function() {
     register_widget( 'New_Kousin' );
});

functions.phpに直に追加するかテンプレートパーツに

上の、「WP_Widgetクラスを継承 Widget名前や説明」「ウィジェットの内容をWebページに出力」「ウィジェット設定フォームを出力」「ウィジェットオプション」「ウィジェットの登録処理」の黒いPHPコード5つをそのまんまつなげる。

functions.phpに直に追加するかテンプレートパーツにすればウィジェット管理画面に「最近の新着・更新記事」というウィジェットが出来てる。ウィジェットエリアにウィジェットを入れ、タイトル、表示件数、新着マークを表示する期間を指定する。

なお、functions.phpに直に追加する場合、「WP_Widgetクラスを継承 Widget名前や説明」の1行目のPHPの開始タグ <?phpは要らないかも。