カテゴリーごとに最新投稿が含まれていれば「NEW」を表示するWordPressのショートコード

特定カテゴリーに新着投稿があればNEWを表示するショートコード

自社のイントラをWordPressで再構築した際に、要望されたことのひとつに『サイドバーとして配置しているメニューのカテゴリー一覧に、カテゴリーごとに最新の投稿が含まれていたら「NEW」マークを表示して欲しい。』と言うのがありました。
そこで特定のカテゴリーを指定して、そのカテゴリーの投稿記事に最新のものが含まれていたらカテゴリー名の横に「NEW」マークを表示するというショートコードを作成してみましたのでここに共有しておきます。拡張機能としてカテゴリーの最新投稿数をカウントしてその件数を表示するということもできます(FaceBookのメニューなどで表示される最新未読アイコンみたいな感じの表示にすることもできます)。

ショートコードを色々探してみたのですが、何気にWordPressで記事の一覧リストの横に「NEW」を表示するみたいなショートコードは数多くあるのですが、どれも記事リストに対しての最新判定ばかりで、カテゴリーに対しての最新判定というショートコードはめぼしいのが見つからなかったので、自作することにしました。
参考にしたのは星野邦敏氏のWordPressコミュニティで紹介されていた「WordPressでNew!を表示するパターン別4つの方法」という記事。氏のサイトでは、WordPressの企業サイトならではの要望やニーズに対してのTIPSが紹介されていてとてもためになりました。

[php highlight=”2-37,38″]
function addnew($attr, $content){
extract(shortcode_atts(array(
‘slug’ => ”,
‘ttype’ => ‘pub’,
‘term’ => 7,
‘vtype’ => ‘str’,
), $atts));
$today = date_i18n(‘U’);
$ttype = ($ttype!=’pub’) ? ‘mod’ : ‘pub’;
$term = ($term!=7) ? intval($term) : 7;
$vtype = ($vtype!=’str’) ? ‘num’ : ‘str’;
$value = ($content!=”) ? do_shortcode($content) : ‘new’;
global $post;
$cats = get_category_by_slug($slug);
if(!$cats){
return ”;
}else{
$cat = $cats->term_id;
if(!$cat) return ”;
}
$last_post_ids = array();
$lastposts = get_posts(‘category=’.$cat);
foreach($lastposts as $lastpost) :
$entry = ($ttype == ‘pub’) ? date_i18n(‘U’, strtotime($lastpost->post_date)) : date_i18n(‘U’, strtotime($lastpost->post_modified));
$interval = date(‘U’, ($today – $entry)) / (60 * 60 * 24);
if(intval($term) > $interval){
$last_post_ids[] = $lastpost->ID;
}
endforeach;
if(count($last_post_ids) > 0){
if($vtype == ‘str’){
$retstr = $value;
}else{
$retstr = count($last_post_ids);
}
}
wp_reset_query();
if($retstr != ”) return $retstr;
}
add_shortcode(‘addnew’, ‘addnew’);
[/php]

「Shortcode Exec PHP」プラグインにインポートする場合は、上記ソースコードの2~38行目をコピーするか、こちらのXMLファイルを管理画面からインポートしてください(※「addnew」という名前でインポートされるので、すでに同名のショートコードがある場合は上書きされてしまいます。ご注意ください)。
実際のショートコードの使い方の例は、下記の通りです。

  1. 指定のカテゴリー内に公開日より7日以内の投稿が含まれていれば「new」を表示する

    [code lang=”html” light=”true”]
    <li><a href="カテゴリーへのパーマリンク">カテゴリー名</a>[addnew slug="カテゴリーのスラッグ名"]</li>
    [/code]

  2. 指定のカテゴリー内に公開日より7日以内の投稿が含まれていれば太字の「NEW!」を表示する

    [code lang=”html” light=”true”]
    <li><a href="カテゴリーへのパーマリンク">カテゴリー名</a>
    [addnew slug="カテゴリーのスラッグ名"]<b>NEW!</b>[/addnew]</li>
    [/code]

  3. 指定のカテゴリー内に最終更新日が3日以内の投稿が含まれていればその件数を表示する

    [code lang=”html” light=”true”]
    <li><a href="カテゴリーへのパーマリンク">カテゴリー名</a>
    [addnew slug="カテゴリーのスラッグ名" ttype="mod" term="3" vtype="num"][/addnew]</li>
    [/code]

  4. 指定のカテゴリー内に公開日より5日以内の投稿が含まれていればカテゴリーリンクを表示する

    [code lang=”html” light=”true”]
    [addnew slug="カテゴリーのスラッグ名" ttype="pub" term="5" vtype="str"]
    <li><a href="カテゴリーへのパーマリンク">カテゴリー名</a></li>
    [/addnew]
    [/code]

  5. 指定のカテゴリー内に最終更新日が7日以内の投稿が含まれていれば、リンクの前に件数アイコンを表示するためのSPANタグを挿入する

    [code lang=”html” light=”true”]
    [addnew slug="カテゴリーのスラッグ名" ttype="mod" vtype="str"]
    <span class="add-icon-new">[addnew slug="カテゴリーのスラッグ名" vtype="num"]</span>
    [/addnew]<a href="カテゴリーへのパーマリンク">カテゴリー名</a>
    [/code]

ショートコードをネストできるので、使い方次第でいろんなケースに対応できるかと思います。

<

p style=”text-indent:1em;”>
なお、サイドバー等のウィジェット内でショートコードを使いたい場合は、利用しているテーマのfunction.phpに、下記のコードを追加してください。
[php light=”true”]
add_filter(‘widget_text’, ‘do_shortcode’);
[/php]

おすすめ記事