WordPressのテンプレートファイル編集:カテゴリー・ターム・抜粋
Category
WordPress
WordPressを使ってサイトを制作する場合、「ページによって表示するカテゴリーや件数を変更したい」「カテゴリーやタームを条件付きで表示したい」「抜粋の文字数を制限したい」等、場合に応じて出力する内容を変更したいと思うことがよくあります。
今回は、"カテゴリー・ターム・抜粋"に絞って、テンプレートファイルで出力する内容を編集するための記述について書こう思います。
Keyword:カテゴリー,ターム,抜粋,テンプレートファイル編集
以下の順で紹介していきます(※テキストをクリックすると表示部分にスクロールします)。
-
カテゴリー
表示件数・カテゴリーの指定、single.phpでカテゴリー名を表示、指定カテゴリーを除外 -
ターム
タームを表示(ターム名を表示、タームのリンクを表示) -
抜粋
抜粋表示に条件を付ける(文字数制限、“続きを読む”のリンクを追加、改行を反映)
カテゴリー
表示件数・カテゴリーの指定
// 表示件数を5件に指定 <?php query_posts($query_string.'&posts_per_page=5'); ?> // カテゴリーID5の記事のみを表示 <?php query_posts($query_string.'&cat=5'); ?> // カテゴリーID5の記事のみを5件表示 <?php query_posts($query_string.'&cat=5&posts_per_page=5'); ?> // カテゴリーID3と5の記事のみを表示 <?php query_posts($query_string.'&cat=3,cat=5'); ?> // カテゴリーID3と5の記事のみを表示しない <?php query_posts($query_string.'&cat=-3,cat=-5'); ?>
説明
ループの直前に記述します(<?php if (have_posts()) : ?>の前)。
●query_posts
メインのループのみを変更する関数です。
URLから得られた引数(ページ番号やカテゴリー)は無視します。
ページ分割時は、引数の前に$query_stringを加え、続く引数を”&”で記述します。
●query_string
query_postsで変更したループ条件を初期設定に戻す際に使用します。
query_postsでループ条件を変更した場合、同一条件のまま以降のループにも引き継がれてしまいますので、query_stringを使ってクエリ条件をリセットしてやります。
●表示件数を指定
‘&posts_per_page=表示件数’と記述します。
[2012.3.13追記]
※“showposts”は非推奨のため”posts_per_page”に変更しました。
詳細はWordPressのCodexをご参照ください。
⇒ WordPress Codex~テンプレートタグ/クエリの投稿:ページ送り引数
●カテゴリーを指定
‘&cat=カテゴリーID’と記述します。
‘&cat=3,cat=5’のようにカンマ区切りで複数のカテゴリを指定することができます。
また、’&cat=-3,cat=-5’のように”-(マイナス)”を付けるとそのカテゴリを除外することができます。
●ページ分割時の注意点
ページ分割をしている場合、”query_string”を追加することでページングが正常に動作するようになります。ですが、ページ分割に”PageNavi”プラグインを使用している場合、「件数表示がずれる」「最後のページ番号が404エラーページになる」といった不具合が生じる場合があるようです。これはWordPressの管理画面上で行うデフォルトの表示設定と”PageNavi”プラグインとの間に起こる不具合のようです。同じ不具合が発生した場合、以下の設定で回避することが出来ますので、試してみてください。
WordPressの管理画面から[設定]→[表示設定]を選択し、”1ページに表示する最大投稿数”を”1″もしくは”-1(全件表示)”にして保存します(※この方法を使用する場合、記事の表示件数はテンプレートファイル側で指定してあげるようにしましょう)。
[2012.3.13追記]
“PageNaviプラグイン”使用時のページングの不具合は、テンプレートタグ”paged”等を使用しても回避できますが、パーマリンク設定にも問題があるようです。
“/%category%/%post_id%.html”のように”.html”で終わるようなパーマリンク設定にしている場合、「query_stringとpaged」や「wp_reset_queryとpaged」等を使用しても不具合が発生してしまうようです。なので、”.html”で終わるようなパーマリンク設定をしている場合、上記の設定をするようにしています。
single.phpでカテゴリー名を表示
// single.phpでカテゴリー名を表示 <?php $cat = get_the_category(); $cat = $cat[0]; {echo "$cat->cat_name" ;} ?> // cf) single.phpでスラッグ名を表示する際は、以下のようにします // single.phpでスラッグ名を表示 <?php $cat = get_the_category(); $cat = $cat[0]; {echo "$cat->category_nicename" ;} ?>
説明
single.php(個別ページ)でカテゴリーを表示したい場合、<?php the_category(‘,’); ?>と記述することが多いと思いますが、これだとカテゴリーのリンクも付加されてしまいます。ページのタイトルとしてページ内に表示したい場合、リンクは付けたくありません。このような場合に使用します。
※比較として、”single.phpでスラッグ名を表示”も記載しておきます。
指定カテゴリーを除外
// 指定カテゴリー名を除外する <?php $categories = get_the_category(); $exclude = array(カテゴリーのID,カテゴリーのID); foreach((array)$categories as $category) if(!in_array($category->cat_ID, $exclude)) echo ''.$category->cat_name.' '; ?> // 指定カテゴリーのリンクを除外する <?php $categories = get_the_category(); $exclude = array(カテゴリーのID,カテゴリーのID); foreach((array)$categories as $category) if(!in_array($category->cat_ID, $exclude)) echo '<a href="'.get_category_link($category->cat_ID).'">'.$category->cat_name.'</a> '; ?> // カテゴリーを複数選択時、子カテゴリー名のみを表示させる <?php $categories = get_the_category(); foreach($categories as $category) if(cat_is_ancestor_of(親カテゴリーのID, $category)) echo ''.$category->cat_name.' '; ?> // カテゴリーを複数選択時、子カテゴリーのリンクのみを表示させる <?php $categories = get_the_category(); foreach($categories as $category) if(cat_is_ancestor_of(親カテゴリーのID, $category)) echo '<a href="'.get_category_link($category->cat_ID).'">'.$category->cat_name.'</a> '; ?>
説明
指定したカテゴリー名やカテゴリーのリンクを除外したい場合に使用します。
“カテゴリーのID”の箇所に除外したいカテゴリーIDを記述します。
また、親カテゴリー内に属する子カテゴリーだけを表示したいような場合もあるかと思います。例えば、”雑貨”という親カテゴリーに属する”アクセサリー”や”鞄”等の子カテゴリーだけを表示したいような場合に使用します。こうする事で、クライアントさんが間違って親カテゴリーにも表示のチェックをしたとしても、ページ上には出力されなくなりますので、管理画面からの処理を間違っても安心です。”親カテゴリーのID”の箇所に除外したい親カテゴリーのIDを記述します。
“指定カテゴリー名(リンク)を除外する”は、複数のカテゴリーを除外したい場合に、”カテゴリーを複数選択時、子カテゴリー名(リンク)のみを表示させる”は、親カテゴリーを除外したい場合に使い分けてみてください。
ターム
タームを表示
// ターム名を表示 <?php if ($terms = get_the_terms($post->ID, 'タクソノミー名')) { foreach ( $terms as $term ) { echo '<li>' . esc_html($term->name) . '</li>'; } } ?> // タームのリンクを表示 <?php echo get_the_term_list($post->ID, 'タクソノミー名'); ?>
説明
カスタム投稿タイプで作成したタクソノミーに属するターム名とタームのリンクを出力します。上記の”ターム名を表示”の例では、echo文に<li>~</li>を使用していますので、リスト表示されます(※“ターム”とは、通常の投稿の”カテゴリー”にあたるものだと考えれば分かりやすいと思います)。
タームに用意されているパラメータに関しては、以前の記事で紹介していますので、こちらも是非ご覧ください。
「WordPressでよく使うテンプレートタグの覚え書き」タームのパラメータ
抜粋
抜粋表示に条件を付ける
// 抜粋表示を100文字までに制限(100文字以上は“...”で表示) <?php $excerpt=mb_substr($post->post_excerpt,0,100); echo ''.$excerpt.'...'; ?> // 上記に“続きを読む”のリンクを追加 <?php $excerpt=mb_substr($post->post_excerpt,0,100); echo ''.$excerpt.'...<a href="'.get_permalink().'">続きを読む</a>'; ?> // 抜粋に改行を反映させる <?php $excerpt = $post->post_excerpt; echo ''.nl2br($excerpt).''; ?> // 上記に100文字までの文字数制限を追加(100文字以上は“...”で表示) <?php $excerpt=mb_substr($post->post_excerpt,0,100); echo ''.nl2br($excerpt).'...'; ?>
説明
●抜粋表示を100文字までに制限(100文字以上は“…”で表示)
抜粋に100文字までの文字数制限を付け、100文字以上は”…”で表示されるようにしています。書き方としては、”(文字列,開始位置,文字数,文字エンコーディング)”となります。”mb_substr”は、マルチバイト文字列の一部を取得する関数で、文字列を開始位置から文字数分取得します(※開始位置や文字数は2バイトで1文字として表示します)。”0,100″の箇所が開始位置と文字数になります。また、文字エンコーディング省略時は、内部エンコーディングが使用されます。
●抜粋に改行を反映させる
抜粋はデフォルトでは改行が反映されませんので、テンプレートファイルに”nl2br”を追記してやります。”nl2br”は、改行文字の前に改行タグ<br />を挿入した文字列を返す関数で、書き方としては”nl2br(文字列)”となります。
●その他
“excerpt(抜粋)”の箇所を”content(本文)”や”title(タイトル)”と変更してやることで、本文やタイトルの文字数制限にも使うことができますので、とても便利です。
関連記事(※当記事と関連性が高いと思われる記事)
WordPressでよく使うテンプレートタグの覚え書き
2012/01/15WordPressの検索表示をカスタマイズする
2012/03/11WordPressのアイキャッチ画像
2012/04/12WordPressのFacebook用OGP出力テンプレート
2012/06/02WordPressでCSSやJavascriptをページ毎に振り分ける
2011/12/29おすすめ書籍・商品(※当記事と関連性が高いと思われる書籍・商品)