WordPressで同じタグをつけた記事のリンク一覧を表示させるショートコードを作ってみた

wp-shortcode-links-to-same-tagged-articles@2x

WordPressで関連記事を記事本文に簡単に挿入できるように、同じタグをつけた記事へのリンクを一覧で表示させるショートコードを作ってみました。同じことをしようとしている方の参考になれば幸いです。あくまで自己責任でローカル環境などでテストしてからお使いください。

使い方

記事にタグIDを指定してショートコードを入れると、そのタグがついた記事のリンク一覧が表示されます。

[tag-links tagid="100"]

タグIDは、管理画面の「投稿 > タグ」メニューで表示されるリンクで確認してます(もっといい方法あると嬉しいんですけど)。

仕様

  • 指定したタグIDのすべての記事のリンク一覧を表示します
  • ショートコードにtagidが指定されていない場合、何も表示されません
  • タグのついた記事がない場合も何も表示されません
  • ショートコードを入れた記事は除外されます

ソース

以下をfunctions.phpに入れます。

// shortcode to get links in with the same tag
function get_tagged_posts($atts, $content = null) {
  $a = shortcode_atts( array(
    'tagid' => ''
  ), $atts );

  if(!empty($a['tagid'])){
    $pageid = get_the_ID ();
    $tag_link_content = '';
    global $post;

    $args = array(
      'tag_id' => $a['tagid'],
      'order' => 'DESC',
      'posts_per_page' => -1,
      'exclude' => $pageid
    );

    $tagged_posts = get_posts( $args );

    if($tagged_posts){
      $tag_link_content='
    '; foreach($tagged_posts as $post) : setup_postdata($post); $tag_link_content.='
  • '.the_title("","",false).'
  • '; endforeach; $tag_link_content.='
'; } wp_reset_postdata(); return $tag_link_content; } } add_shortcode("tag-links", "get_tagged_posts");

ちょっと説明

以下「#」はソースの行数です。

#7

  if(!empty($a['tagid'])){

tagidが指定されてるかチェックします。

#10

    global $post;

元記事のメインのThe Loop とは違うループの操作をするために指定してます。他の方法が良いという情報 も。WP_Query とか使った方が良いのでしょうか?

#12〜17

    $args = array(
      'tag_id' => $a['tagid'],
      'order' => 'DESC',
      'posts_per_page' => -1,
      'exclude' => $pageid
    );

get_posts()を使って同じタグのついた記事一覧を取得するために、以下を引数として指定しています。

  • タグID
  • 表示順
  • 表示件数(-1を指定すると全記事表示になります)
  • 除外する記事のID(#8で取得した元記事のIDを指定してます)

#21〜28

    if($tagged_posts){
      $tag_link_content='
    '; foreach($tagged_posts as $post) : setup_postdata($post); $tag_link_content.='
  • '.the_title("","",false).'
  • '; endforeach; $tag_link_content.='
'; }

get_posts()で記事が取得できたことを確認して、記事が取得されていた場合にループしてリンクを生成してます。

#30

    wp_reset_postdata();

ループをリセットして、テンプレートタグが元記事のループを参照するようにします。

以上です。

推奨されていない書き方、より良い書き方などあったら、コメントなどでご指摘いただけたら幸いです。

WordPress関連の記事

よかったら他のWordPress関連の記事もどうぞ

参照した情報

About the author

「明日のウェブ制作に役立つアイディア」をテーマにこのブログを書いています。アメリカの大学を卒業後、ボストン近郊のウェブ制作会社に勤務。帰国後、東京のウェブ制作会社に勤務した後、ウェブ担当者として日英バイリンガルのサイト運営に携わる。詳しくはこちら

ウェブ制作・ディレクション、ビデオを含むコンテンツ制作のお手伝い、執筆・翻訳のご依頼など、お気軽にご相談ください。いずれも日本語と英語で対応可能です。まずは、Twitter @rriver またはFacebook まで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です