【初心者必見】
WordPressのテーマを自作しよう!
〜その3:「投稿」の内容を出力してみよう〜
■目次
- 前回のあらすじ
- single.phpに「投稿」の内容を表示させよう!
- 「投稿」詳細の内容を取得しよう!
- まずは記事IDを取得しよう!
- 記事タイトルを取得しよう!
- 記事の本文を取得しよう!
- 投稿日を取得しよう!
- 記事カテゴリーを取得しよう!
- category.phpに「カテゴリー別の記事一覧」を表示させよう!
- 表示中のカテゴリー情報を取得しよう!
- カテゴリーに属する記事を取得しよう!
- 記事情報を取得しよう!
- カテゴリー名を見出しとして表示しよう!
- ページャーを追加しよう!
- 表示される記事数とページャーのカウントを合わせよう!
- 表示中のページ目によって表示内容が変わるようにしよう!
- ページャータイトルを非表示にしよう!
- archive.phpに「投稿記事一覧」を表示させよう!
- 最新投稿された記事一覧を表示しよう!
- ページャーを表示しよう!
- ページ見出しを表示しよう!
前回のあらすじ
テンプレートを作成し、ブラウザ上で各ページの表示を確認した2人。
管理画面から投稿した内容を表示するように、コーディングを行っていくと意気込んでいた。
栖天
こんな風に画面に表示されるんですね!
早く投稿内容が表示されるようにしていきたいです!
唯月
慌てない慌てない。
まずは「投稿」が表示されるように必要な記述について説明していくから、よく聞いていてね。
前回は「テンプレート」を各ページごとに作成し、テーマ関数ファイルである「functions.php」も一緒に作成を行いました。
現段階でのテーマフォルダ「first-theme」の中には以下の12ファイルが存在することになります。
ではさっそく、ブログの要である「投稿」の投稿内容が表示されるようにしていきましょう。
「投稿」に当てはまるテンプレートは「archive.php」と「category.php」「single.php」の3つでしたね。
この記事では、この3つのテンプレートの表示を行っていきます。
なお実装していく順番は以下になります。
HTMLでは「TOP→下層→さらに下層……」とコーディングすることが多いですが、WordPressのテーマ作成やシステム化においては「……より深い下層→下層→TOP」というように末端から行っていきます。
- single.php
- category.php
- archive.php
現段階ではデフォルトで存在する「Hello world!」の1記事があるため、この記事の表示を確認していくことになります。
では、実装していきましょう!
single.phpに「投稿」の内容を表示させよう!
single.phpに記述を行っていく前に、まず「投稿」の詳細ページには何を表示させるか考えていきましょう。
「タイトルと本文……それから」とあげていける場合もあれば、「全く思いつかない……」と混乱する場合もあるかと思います。
ですが表示内容が全く思いつかなくても大丈夫です。
WordPress提供している公式のオンラインマニュアルが存在します!
このマニュアルにはテーマ作成における必要な内容が記載されているため、これを読めばページに表示する内容がだいたい把握できますよ。
※マニュアルを読めばいいならこの記事はいらないのでは? というのは言わないでくださいね
WordPress公式オンラインマニュアル(日本語版)
WordPress Codex 日本語版
というわけで、「投稿」詳細ページのテンプレートである「single.php」に記述する内容を確認していきましょう。
公式マニュアルの「テーマの作成」というページを見てください。
「テンプレートファイルのチェックリスト」の「個別投稿表示 (single.php)」から内容を確認することができます。
※コンテンツはページ下部に存在するため、目次からクリックして飛ぶといいですよ。
引用:WordPress Codex日本語版 テーマの作成(https://wpdocs.osdn.jp/テーマの作成)/ 2021年1月1日現在
single.phpに記載した方がいい内容がずらっとリスト化されているのが確認できますね!
この中からsingle.phpに記載したい内容をピックアップしていきます。
今回は、以下の内容を記述していくことにします。
- 投稿のタイトル
- 投稿の本文
- 投稿日
- 投稿カテゴリー
この4つの項目をsingle.phpに記述し「投稿」詳細ページに表示するようにしていきます。
記述内容が決まったところで、実際に記述を行っていきましょう。
Finderに戻り、テーマフォルダ「first-theme」の中にある「single.php」をテキストエディタで開いてください。
前回のheader.phpとfooter.phpを読み込む作業を行っていれば、その読み込みコードが記述されているはずですよ。
single.phpをテキストエディタで開いた際の記載内容
「投稿」詳細の内容を取得しよう!
それではsingle.phpに投稿内容を表示するコードを記述していきましょう!
まずは3行目の「ここに記事の詳細ページを表示します。」は不要のため、削除しておきましょう。
管理画面に投稿された内容を取得するためには「投稿」記事のIDが必要となってくるため、そのIDを取得しましょう。
まずは記事IDを取得しよう!
栖天
そのIDって管理画面から探すんですか?
唯月
ID自体は管理画面から見ることはできるわ。
でも記述の際は不要よ。そのID自体をsingle.phpで取得してくるってことになるの。
栖天
な、なるほど…?! そんなことができるんですね。
栖天ちゃんと同じく「IDを取得するってできるの?」と思ったかもしれません。ですがご安心を。
WordPressでは現在の投稿IDを取得する関数が存在します。
「get_the_ID()」という関数を使用すれば、現在表示しているページの投稿IDを取得することができます。
ではそれを利用して、投稿IDを取得していきましょう。
投稿IDを取得する関数
公式マニュアル「get_the_ID」
single.phpのコード内容(get_the_IDを記述後)
4行目の「get_the_ID」で表示中の投稿IDを取得し、変数「$post_id」に格納しています。
この$post_idという名前は固定ではなく、任意で命名できます。
$マーク以下のテキストは自分にとってわかりやすい名前に変えてOKです。
当然ながら使用できる文字は半角英数字と記号は「_」のみとなります。
またPHPでは、$マークは変数を示す記号となるためマークを削除することはできません。変数を作る際は必ず「$」を先頭につけるようにしてください。
例)$post_data_id, $page_id, $id
※なおWordPressには固有のグローバル変数が存在します。これらを変数をとして使用することはできないためご注意ください。
WordPressの固有グローバル変数一覧
WordPress Codex 日本語版「グローバル変数」
5行目の「var_dump($post_id)」で、変数「$post_id」に格納された投稿IDを画面上へ出力します。
※上記で変数名を変更していたら5行目の$post_idの変数名も変更してくださいね。
※「echo $post_id;」でも問題はありませんが、もし変数に何も格納されていなかった場合は何も出力されないため、確認が難しくなります。
「var_dump()」だと値が0や空の場合は、空であることを示す内容が出力されるため、デバッグする際に便利となります。
ではコードの記載ができたら保存をし、ブラウザで「投稿」詳細ページを表示してみましょう。
投稿URLがわからない場合は、管理画面の左側にある黒背景サイドバー「投稿」をクリックし、デフォルトで存在する「Hello world!」という記事をマウスオーバーしてください。
タイトル下に「表示」というテキストリンクが現れるため、それをクリックしてください。
画面上に「Hello world!」の記事ページが表示されます。
先ほどsingle.phpに記述した、記事IDを取得し表示するコードに間違いがなければ「int(1)」が表示されているはずです。
header.phpとfooter.phpに記述した表示チェックのテキストが邪魔に思う場合もあると思います。
その時は思い切って削除しておきましょう。
この「int(1)」の表記の意味についてですが、このintは整数のデータ型というものであり、変数に入っているデータが整数の時に表示されます。
データ型はintの他に文字列型「string」や浮動小数点型「float」、配列型「array」やオブジェクト型「object」などが存在します。
var_dumpで出力したデータは、このデータ型も一緒に表示してくれるため、今変数がPHP側でどういう扱いになっているか知ることもできますよ。
intがデータ型と示すということがわかりました。次に括弧の中にある数値を確認していきましょう。
この数値は、我々が探し求めていた「投稿」記事のIDになります。
「でもこれって本当に記事IDなの?」と思うかもしれません。では、その記事IDが本当に合っているか確認していきます。
WordPressの管理画面に戻り、左側の黒背景サイドバー「投稿」をクリックし、記事IDを確認したい記事名をクリックしてください。
今回はID取得を行おうとしている「Hello world!」という記事になります。
記事名をクリックすると、記事の編集画面が表示されるはずです。
編集画面の表示が確認できたら、ブラウザ上部にある表示中のURLを確認しましょう。
ここから記事IDを確認することができます。
しかし、おそらく「localhost:8888/wp-site/wp-admin/post.php」となっていて、記事IDらしきものが見えない! と焦るかもしれません。
ですがご心配なく。そのURLを一度クリックし、テキスト編集できるようにしてみてください。
すると先ほどは表示されていなかった、URLの後ろのテキストが見えるようになっているはずです。
※ブラウザによっては「?post=」以降も初めから全て表示してくれている場合もあります。
URLにカーソルをおくと「?post=」以下のテキストが追加表示されましたね。
この「post=1」と表示された数値が、編集画面を開いている記事のIDとなります。
var_dumpで出力したIDの数値と、確認したい記事のIDが合致しているのを確認できました!
これでsingle.phpは、表示中の記事の内容に参照できることがわかりましたね。
栖天
気になったことがあるんですけど、記事IDって他の記事と被ったりしないんですか?
唯月
いいところに目をつけたわね。
これからたくさん記事を作成していくと思うんだけど、それらの記事IDが被ることはないわ。
記事が作成されるたびに、連番でIDが付与されていくの。途中で記事を削除しても生成された番号が消えることはないから、次に新しく記事を作成したらその次の番号がIDとして与えられるということになるわね。
栖天
じゃあ絶対に被らないってことですね!
唯月
微妙なところね……。管理画面でなく、データベースの方で編集を加えると変更はできてしまうの。
IDはユニークだから被ることはありえないとは思うけど万一はありえそうだし……(ブツブツ「データベースをいじらない限りは」という条件なら「絶対」って言ってもいいかもしれないわね。
記事タイトルを取得しよう!
これで記事IDが取得できました。
次に記事のタイトルを取得してみましょう。
IDはWordPressで用意されていた「get_the_ID()」という関数を使って取得しました。
なんとタイトルも同じように、専用の関数が存在します。
それを使って、画面上にタイトルを表示していきます。
投稿タイトルを取得する関数
公式マニュアル「get_the_title」
上記URLをクリックし、公式マニュアルの「関数リファレンス/get the title」を見てください。
「使い方」の箇所には「get_the_title( $ID );」と記載があるのが確認できますね。
関数の括弧内にある「$ID」は一体何なのかというと、パラメータというものになります。
このパラメータについての説明は、同ページ内の「パラメータ」箇所に記載があるため、合わせて確認しましょう。
引用:WordPress Codex日本語版 関数リファレンス/get the title(https://wpdocs.osdn.jp/関数リファレンス/get_the_title)/ 2021年1月1日現在
「投稿の ID、もしくはタイトルを取得する投稿を特定するオブジェクト。デフォルトは、現在の投稿。」と記載がありました。
このget_the_title()の括弧内に、タイトルを取得したい記事IDを入力することで、入力したIDに該当する記事のタイトルを取得するということになります。
記事IDを入力しない場合は、現在表示しているページの記事タイトルを取得してくることになります。
ではさっそくこの関数を使ってみましょう。
Finderに戻り、テーマフォルダ「first-theme」の中にある「single.php」をテキストエディタで開き、get_the_titleの記述を追加しましょう。
コードを追加した記述は以下になります。
変数「$post_title」に関数get_the_titleで取得した記事タイトルを格納しています。
それをvar_dumpで出力しています。var_dumpの括弧の中は、$post_titleに書き換えてくださいね。
記述ができたら保存し、ブラウザで表示確認を行いましょう!
投稿URLにアクセスしてくださいね。なお投稿URLの確認方法は既に説明した通り、管理画面の左側にある黒背景サイドバー「投稿」をクリックし、デフォルトで存在する「Hello world!」という記事をマウスオーバー後にタイトル下に表示される「表示」というテキストリンクをクリックしてください。
ダブルクォンテーションに囲まれた文字列「Hello world!」が出力されているのが確認できました!
「Hello world!」記事を確認していたため、正しく記事タイトルが表示されていますね。
なお記事タイトル横の「string(12)」についてですが、これは「文字列(string)」であり「12文字(12)」であることを示しています。
正しく記事タイトルを取得できていることがわかったため、var_dumpではなくechoを使って画面に表示していきます。
var_dumpはあくまで値の確認用(デバッグ)として使用する、出力の関数です。サイト訪問者に向けて表示する場合は「echo」を使用しましょう。
また記事タイトルのため、h1タグで囲ってあげましょう。
コードは以下になります。
「echo esc_html($post_title);」で変数「$post_title」に格納された記事タイトルを出力しています。
また、$post_titleが囲まれている「esc_html」についてですが、これはWordPressが用意しているHTMLテキストをエスケープする関数となります。
HTMLテキストのエスケープとは、プログラムやマークアップで使用する「<」「>」といった記号などを「<」「>」に変換して表示することを指します。
これらエスケープは、思わぬバグやクラッカーからの攻撃を防ぐことを目的としています。
特にHTMLタグをそのまま表示したいということが無い場合には、esc_htmlをつけることにすると良いでしょう。エスケープ処理は癖づけておくことがベストです。
WordPress Codex 日本語版「esc_html」
公式マニュアル「関数リファレンス/esc html」
では、コードを記述し保存ができたら、再度ブラウザ上での表示を確認しましょう。
先程開いた「Hello world!」の記事を開きっぱなしにしている場合は、ページのリロードを行ってくださいね。
これで記事タイトルが表示されました!
h1タグで囲っているため、出力したタイトルはブラウザのCSSが効いています。
フォントサイズが大きくなり、上下にmarginが付与されているはずです。
※もし初めにreset.cssを適応していれば、var_dumpで出力したようなテキストサイズのままになっています。
では次に記事の本文を表示してみましょう。
記事の本文を取得しよう!
記事本文もタイトルと同じく、専用の関数が存在します。
手順もタイトルを同じです。変数に格納して、値を出力していきましょう。
投稿本文を取得する関数
公式マニュアル「get_the_content」
上記URLをクリックし、公式マニュアルの「関数リファレンス/get the content」を見てください。
「使い方」の箇所には「get_the_content( $more_link_text, $stripteaser )」と記載があるのが確認できますね。
関数の括弧内にある2つのパラメータ「$more_link_text」「$stripteaser」を詳しく確認しましょう。
引用:WordPress Codex日本語版 関数リファレンス/get the content(https://wpdocs.osdn.jp/関数リファレンス/get_the_content)/ 2021年1月1日現在
「パラメータ」箇所の説明によると、「<!--more-->」以前と以降の扱いをどうするか…ということが設定できるようです。
この「<!--more-->」というのは、WordPress側で用意された「続きを読む」タグのことで、記事の編集画面にあるエディタからそのタグを追加できます。
今回はこのパラメータを使うことはなさそうです。
括弧内は空にして使用しましょう。
Finderに戻り、テーマフォルダ「first-theme」の中にある「single.php」をテキストエディタで開き、get_the_titleの記述を追加しましょう。
追記したコードは以下になりますよ。
なお追記箇所は6行目と7行目の2つとなります。
var_dumpで出力してみるとどんな値が出力されるのか確認してみましょう。
ブラウザで記事ページを表示するか、該当ページのリロードを行ってください。
記事「Hello world!」の本文が表示されているのが確認できました!
では続いて、タイトルと同じように本文をechoで出力していきましょう。
Finderにまた戻って、single.phpのコードを以下のように書き換えてください。
タイトルはh1タグで囲みましたが、今回の本文はdivタグで囲んであげましょう。本文であることがわかりやすいように、クラス名をpost_contentとします。
先程のコードで7行目にあったvar_dumpを削除し、新たに11行目から13行目を追記しました。
栖天
あれ? 今度はエスケープの「esc_html」をつけないんですか?
唯月
えぇ。記事の本文はHTMLタグを使って内容を整えて書くことが多いから、エスケープは行わないわ。
栖天
じゃあ「タグなんて不要!」って場合はエスケープしていいんですね
唯月
そういうことになるわね。
では再びブラウザで表示を確認してみましょう。
記事タイトルの下に設置した本文が表示されていますね!
ちょっとだけ記事ページっぽくなってきました。
では次に、記事が投稿された日付を表示していきましょう!
投稿日を取得しよう!
記事の投稿日は、WordPress側で用意されたテンプレートタグを使って取得・表示をしていきます。
変数に格納して値を取得しましょう!
記事の投稿日を取得するテンプレート
公式マニュアル「get_the_date」
上記URLをクリックし、公式マニュアルの「テンプレートタグ/get the date」を見てください。
「使い方」の箇所には「$pfx_date = get_the_date( $format, $post_id );」と記載があるのが確認できますね。
タイトルや本文のときと違って、$pfx_dateという変数に格納していますが、実際に使用する時の変数名は任意のものに変更してOKです。
では関数の括弧内にある2つのパラメータ「$format」「$post_id」を詳しく確認しましょう。
引用:WordPress Codex日本語版 テンプレートタグ/get the date(https://wpdocs.osdn.jp/テンプレートタグ/get_the_date)/ 2021年1月1日現在
「パラメータ」の説明によると、「$format」は日付の書式を指定し「$post_id」は日付取得したい記事のIDを入力するようです。
日付の書式は以下のように指定します。
例)「2021年01月01日」と指定したい → 'Y年m月d日'
「2021/01/01」と指定したい → 'Y/m/d'
「2021年1月1日」と指定したい → 'Y年n月j日'
取得日の西暦は「Y」。
月は、0をつける場合は「m」となり、つけない場合は「n」。
日は、0をつける場合は「d」となり、つけない場合は「j」が置き換えの文字となります。
日付以外にも時刻に関しても、こういったフォーマットが存在するため、一通り確認しておくと良いかもしれません。
一覧は以下のWordPress公式サポートサイトのURLより確認ができますよ。
日付と時刻の書式
日付・時刻の書式一覧
では記述を行っていきましょう。
今回使用するフォーマットは2021年01月01日の年月日形式にします。
Finderに戻り、テーマフォルダ「first-theme」内「single.php」をテキストエディタで開いて追記しましょう。
今回はvar_dumpでの確認は省きます。
またh1閉じタグの下にp要素(クラス名「post_date」)を追加し、その中に日付の出力を行います。
追記後「single.php」コード
追記箇所)7行目、12〜14行目
ブラウザでの記事ページの表示
見出し「Hello world!」の下及び、本文の上に投稿日が表示されました!
「Hello world!」記事はWordPressをインストールした際に作成されるため、WordPressをインストールした日付が表示されますよ。
記事をいくつか作成してみて、日付が記事によって変わるか確認してみてもいいかもしれませんね。
記事カテゴリーを取得しよう!
記事カテゴリーも投稿日と同じく、WordPress側で用意されたテンプレートタグを使って取得・表示をしていきます。
変数に格納して値を取得しましょう!
記事のカテゴリーを取得するテンプレート
公式マニュアル「get_the_category」
上記URLをクリックし「テンプレートタグ/get the category」を見てください。
これまでと同じく「使い方」及び、パラメータを確認していきます。
「使い方」の箇所には「get_the_category( $id );」と記載が、パラメータには「$id」があるのを確認できました。
引用:WordPress Codex日本語版 テンプレートタグ/get the category(https://wpdocs.osdn.jp/テンプレートタグ/get_the_category)/ 2021年1月1日現在
パラメータ「$id」は投稿のIDを指していることが確認できました。
ではさっそく表示していきましょう。
Finderに戻り、single.phpに記述を追加しましょう。
栖天
えっと、変数に格納してカテゴリーの値を取得して……。
唯月
慣れてきたようね。その調子よ
栖天
ありがとうございます!
じゃあ日付を表示したpタグの下に、クラス名「post_category」のpタグを追加してその中に表示しようっと!
唯月
……
栖天ちゃんが追記したsingle.phpのコードは以下になります。
追記箇所は8行目と、16〜18行目になります。
では表示を確認してみましょう。
栖天
あれ?! なぜかカテゴリーじゃなくて「Array」の文字が表示されました!
これは一体……! どうしたらいいんでしょうか……。
唯月
ふふふ。「Array」が表示される壁にぶち当たったようね。
この「Array」は配列といって、ざっくり言うなら……変数の列車というところかしら!
栖天
よく分かりませんが、こうなるって分かってたなら教えてくださいよー……。
唯月
ごめんなさいね。自分で気づいて欲しかったから黙っていました。
カテゴリーを表示するには一手間加える必要があるの。それを説明していくわね。
では公式マニュアルの「テンプレートタグ/get the category」のページをもう一度確認してください。
ページの中程にある「戻り値」の項目を見てみましょう。
引用:WordPress Codex日本語版 テンプレートタグ/get the category(https://wpdocs.osdn.jp/テンプレートタグ/get_the_category)/ 2021年1月1日現在
「戻り値」には「(配列)」の文字が記載されているのが確認できました。
先程の記事ページの画面に表示された「Array」は配列という意味のため、戻り値が配列ということは正しいということになります。
なお、get_the_titleもget_the_contentの公式マニュアルにも「戻り値」の項目があります。
項目を確認してみると「(文字列)」の表記になっていることが確認できますよ。
タイトルや本文では、返ってきた文字列の値を変数に格納していることになるため、正しく文字として表示されたことになります。
では本題の、配列で返ってきたデータから正しくカテゴリーを取得する方法を確認していきたいと思います。
まずは配列の中身を確認していきましょう。
Finderに戻り、テーマフォルダ「first-theme」の中「single.php」を開き、コードを以下のように書き換えましょう。
9行目にvar_dumpを使って、配列の中身を確認するコードを追加しました。
ではブラウザで表示を確認してみましょう。
var_dumpを記述した位置に「array(1) { [0] => object……」という長い記述が表示されました!
「何が書いてあるのか見づらい…」と思う場合は、画面上で右クリックし「ページのソースを表示」をクリックしてソースコードを表示してみてください。
すると一行で長く書かれていたarrayの内容が、ソースコード上では分かりやすく改行された状態になっていることが確認できますよ。
慣れないうちはソースコードを表示し、確認するようにしましょう。
get_the_categoryで取得した値は、配列となって返ってきました。
ソースコードの58行目「array(1)」についてですが、arrayは配列を示し、括弧の中の数値は格納された値の数を示しています。
今回、数値は「1」となっているため、配列の中には1つの値が格納されていることになります。
「Hello world!」記事ではカテゴリー「未分類」が一つ登録されているため、数値が1になっているのは正しいですね。
次の59行目にある「[0]=>」については、配列の何番目に入っているか示しています。
配列の中に複数の値が格納されている場合は「[0]=>'値', [1]= '値', [2]=>'値', ……」となります。
番号は0始まりのため、一番目の数値は「[0]=>」になりますよ。1ではないため気をつけてくださいね。
今回、配列は1つの値しか格納されていないため「[0]=>」のみ表示していることになります。
この上記2つの行が示している内容が把握できれば、配列は何となくわかるようになっていきます。
では配列の一番目の中身を確認していくと、まず確認できるのが「object(WP_Term)#3850 (16) 」という表記になりますね。
「object(WP_Term)#3850」という文字がありますが、これはざっくりと言うなら「このデータはオブジェクト型だよ」ということを示しています。
その後ろの括弧に囲まれた数値は、オブジェクトのデータの数を示しています。
オブジェクトの中にある「[]」で囲まれた要素を数えると、16つあるのが確認できますよ。
この16つのデータが何を示しているのか気になりますが、これらは公式マニュアルの「テンプレートタグ/get the category」の「戻り値」の項目に記載があるため、そちらより確認ができます。
16つ全てを使うことはなく、必要な要素だけを抜き出して使用していきます。
今回使用する要素
- カテゴリーID(term_id)
- カテゴリー名(name)
では、配列とオブジェクトを解剖してカテゴリーを表示していきましょう!
配列はforeachを使うことで中の値を取得できます。
foreachを利用して配列の中身を取得したコードは以下にになります。
Finderに戻り、single.phpを以下の記述に書き換えてくださいね。
変更箇所)9〜11行目
9行目「foreach( $post_category as $category_data )」で配列「$post_category」の値を一つずつ取得し、新たな変数「$category_data」に格納しています。
このasより右側にある変数「$category_data」はこのforeachの中でしか使えない変数となるため、foreachのループ外で使用しない用気をつけてくださいね。
なお「$category_data」としていますが、asより右側の変数名は新たに命名するため、任意の好きな名前にしてOKです。
foreachの中で、$category_dataをvar_dumpして中身を確かめます。
$category_dataには何が格納されているのかが確認できますよ。
では書き換えて保存ができたら、ブラウザでの表示を確認しにいきましょう。
先程と代わり映えがしないように思いますが、初めの内容をよくご覧ください。
foreachする前にはあった「array(1) ([0]=>」の表記がなくなっていることが確認できます。
これで配列の中身を取得することができました!
foreachを回して配列(array)の中身を参照していることによって、arrayという表記が不要になったということになります。
では次にWP_Termオブジェクトの中にある、カテゴリーIDとカテゴリー名を取得しましょう!
オブジェクトは配列と形が似ていますが、配列とは違うもののためforeachで取得することはできません。
その代わり、アロー演算子というものを使用して値を取得していきます。
アロー演算子:
->
使用例)$object_data->term_id
矢印っぽい形ということでアロー演算子という名前は覚えやすいですね。
例えば、カテゴリー名「未分類」を取得したい場合は、オブジェクト内にある「未分類」が紐づけられているパラメータを探します。
「未分類」が紐づけられているパラメータは「name」と「cat_name」と2つ存在することが分かりますね。
「name」も「cate_name」もどちらもカテゴリー名のパラメータになります。
どちらから取得しても構いませんが「name」の方が文字数が少なく記述が楽になるため、今回は「name」の方を使用します。
公式マニュアルによると、初めの「term_id」はカテゴリーIDを指すようです。
このterm_idもアロー演算子を使って値を取得していきましょう。
Finderに戻って、テーマフォルダ「first-theme」内のsingle.phpに記述してください。
オブジェクトから各種パラメータの値を取得するコードを追記したsingle.php
追記箇所)10, 11行目及び12, 13行目
まず10行目についてですが、カテゴリーのIDを取得するコードとなります。
変数「$category_id」を作成し、その中に「 $category_data->term_id」で取得したデータを格納しています。
※もちろん、変数$category_idは新規作成となるため、好きな名前に変更してOKです。例)$cate_id, $cat_id
foreachで配列の中身を一つ一つ参照し、参照したデータを$category_dataに格納しました。
$category_dataに格納されたデータはオブジェクト型であるため、オブジェクト$category_dataからアロー演算子を用いて各種パラメータを指定します。
そして、そのパラメータに紐づく値を取得しています。
今回、変数$category_dataに格納されたオブジェクトから、カテゴリーIDを保持するパラメータ「term_id」をアロー演算子で指定しています。
これによって、term_idに紐づくカテゴリーIDを取得し、変数$category_idに格納しています。
次に11行目についてですが、こちらはカテゴリー名を取得するコードになります。
変数「$category_name」を作成し、その中に「 $category_data->name;」で取得したデータを格納しています。
※もちろん、この変数$category_nameも新規作成となるため、好きな名前に変更してOKです。例)$cate_name, $cat_name
カテゴリーIDと同じく$category_nameも、変数$category_dataに格納されたオブジェクトから、カテゴリー名を保持するパラメータ「name」をアロー演算子で指定しています。
これによって、nameに紐づくカテゴリー名を取得し、変数$category_nameに格納しています。
では12行目と13行目に記載したvar_dumpでそれぞれのデータを確認しましょう!
記述ができたら保存をし、ブラウザに戻って記事ページを表示してみてください。
見出し「Hello world!」の上に「int(1) string(9) "未分類"」が表示されているのを確認できました。
「int(1)」はカテゴリーIDを、「string(9) "未分類"」はカテゴリー名を表示しています!
これで無事に値が取得できたことになりますよ。
では今度はechoを使って、カテゴリー名を画面上に表示してみましょう。
栖天
でもforeachを使わないと表示されないんですよね……。
どうやって表示するんだろう……。それに何で配列の形になってるのかな?
唯月
この記事ではカテゴリは1つしか設定されてないからそう思うわよね。
カテゴリは複数設定できるのは知っているかしら? 設定したカテゴリの情報を全て取得するとなると、配列の形がベストってことになるわ。
栖天
確かに! たくさんのカテゴリーを設定して一つしか表示されないのは困りますね。
唯月
それから、これからの記事に複数のカテゴリが設定されることを考えると、表示するHTMLコードごとforeachで回して出力する方がいいわね。
先程はforeachとvar_dumpを使って、取得してきた値を確認を行いました。
次にforeachを使いつつ取得した値を画面上に表示するコードを記述していきましょう!
複数のカテゴリーが出力されることを想定すると、HTMLはpタグで記述するよりもulタグとliタグで記述する方が良さそうですね。
HTMLのみの場合、カテゴリーの記述は以下のようにしていきます。
このHTMLに沿って、foreachを記述していきます。
今回、カテゴリー数によってliタグの要素が増減することになります。
よってカテゴリーを一つずつ回していくforeachは、liタグを囲むように記述すると希望通りの出力になることが予想できますね。
またulタグの中にliタグを記述していくため、ulタグは1度しか使わないことからもforeachで回すのはulタグの中で行うほうがよさそうです。
上記から、single.phpに記載する内容は以下になりますよ。
Finderに戻って、テーマフォルダ「first-theme」内「single.php」に記述を行いましょう。
記述後のsingle.php
追記箇所)16〜26行目
編集前のコードにあった、9〜14行目のforeachのコードを削除し、17行目〜25行目にforeachを移動しました。
また、ulタグでforeachの記述を囲い、foreach内にliタグの内容を記述しています。
記述ができ保存を行ったあとは、お待ちかねの表示確認です。
ブラウザで記事ページをみると投稿日の下に、ブラウザCSSの効いたリスト形式でカテゴリーが表示されているのが確認できますよ。
またWordPressの管理画面から「投稿」のカテゴリーを新規に追加し「Hello world!」記事にその新規カテゴリーを追加すると、追加したカテゴリーが表示されるようにもなります。
試しに追加して、確認してみてくださいね。
これでforeachを回すことでカテゴリーが表示されるようになりましたが、1点気になることができました。
もし「カテゴリーが1つも設定されていない場合」はどのような表示になるのか気になりますね。
基本的には、配列のデータがない状態でforeachを回すとエラー文が表示されます。
※WordPressのバージョンや設定によってはエラーが表示されない場合もあります。
もしサイトを公開して、気付かぬうちにエラー文が表示されていればちょっと困りますよね。
ですがご安心を。
PHPには、配列や変数の中にデータが存在しないか確認する「empty」という関数が存在します!
「empty」という関数を使って、配列にデータない場合はカテゴリーを表示しないようにしていきましょう。
変数の空チェック関数
PHP 関数リファレンス「empty」
「empty()」の括弧の中に、チェックしたい変数名を入力すると、空かどうか判定してくれます。
戻り値には、空だった場合はtrue、データがある場合はfalseが入ります。
この「empty」と条件分岐のif文を組み合わせることで、配列にカテゴリーのデータがある場合は表示をし、データが1つもない場合は非表示(ulタグとliタグを出力しない)にするということができます。
ではsingle.phpにこの条件分岐のコードを追記していきましょう!
Finderに戻って、テーマフォルダ「first-theme」の中「single.php」に追記を行っていきます。
「$post_category」にデータがある場合に、foreachを回して$post_categoryのデータを一つずつ確認していく、ということのため、始まりのifはforeachが始まる前に、endifはforeachが終わった後に追記します。
追記後のsingle.php
追記箇所)17行目, 27行目 if・emptyとendifを追加
なお「empty」という関数の先頭に「 !」がつけています。
先程説明したように「empty」は「空だった場合にtrue」を返すという関数となります。
今回、値が空「ではない」場合に、foreach以下の出力を行って欲しいため、否定の意味を持つ「!」を先頭に追記しています。
唯月
これで記事に表示する内容は一通り表示できたわね。
それで、私からの提案なのだけれど……。カテゴリにリンクをつけてみるのはどうかしら?
栖天
カテゴリーにリンク……。
あ! カテゴリーに属する記事の一覧ページに飛ぶリンクってことですね。
唯月
そうよ。後でカテゴリ別の一覧ページを作成するけど、ページを作って誰にも見てもらえないってなると寂しいもの。
ユーザにページ遷移してもらえるよう、リンクをつけちゃいましょ!
ではforeachで取得したカテゴリー名に、該当のカテゴリー別一覧ページに飛ぶリンクを追加しましょう。
リンクを取得するコードを記述する箇所は、カテゴリーIDやカテゴリー名を取得した変数たちと同じ場所になります。
ではさっそく、オブジェクトからリンクURLを取得しましょう! ……といきたいところですが、残念。
オブジェクトにはリンクURLを取得できるパラメータは存在しません。
「それじゃあリンクを取得できないのでは?」と思いますが、ご安心を。
WordPressにはカテゴリーのリンクURLを取得する関数が存在します!
それが「get_category_link」という関数になります。
カテゴリーのリンクURLを取得する関数
公式マニュアル「get_category_link」
上記リンクをクリックし、公式マニュアルの「関数リファレンス/get category link」を見てください。
「使い方」の箇所には「get_category_link( $category_id );」と記載があるのが確認できますね。
関数の括弧内にある1つのパラメータ「$category_id」を詳しく確認しましょう。
引用:WordPress Codex日本語版 関数リファレンス/get category link(https://wpdocs.osdn.jp/関数リファレンス/get_the_content)/ 2021年1月1日現在
「パラメータ」の項目にある「$category_id」については「リンクを返すカテゴリーの ID」と記載があります。
このget_category_link()の括弧内に、取得してきたカテゴリーIDを入力することで、リンクが取得できることを示していますね。
「戻り値」には、「(文字列) 」と「(URL) 」という文字があることから、文字列としてURLが返ってくることが分かります。
マニュアルの関数リファレンスの確認ができたところで、実際に記述して出力される内容を確かめてみましょう。
Finderに戻り「first-theme」フォルダ内「single.php」をエディタで開き、コードに追記しましょう。
追記ができたら、保存をした後にブラウザで記事ページを開いて表示を確認してください。
追記後のsingle.php
追記箇所)22, 23行目:get_category_linkとvar_dumpを追加
投稿日の下に「string(67)……」とURLが表示されているのが確認できました。
これがカテゴリーごとの一覧を表示するページのURLになります。
ではカテゴリーURLが取得できた後は、カテゴリー名にaタグを追加してリンクを付与していきましょう。
再びFinderに戻って、single.phpに記述を行います。
追記できたら保存しブラウザで記事ページの確認をしてくださいね。
追記後のsingle.php
追記箇所)25, 27行目:aタグ追加
aタグのhrefの中に、PHPコードを記述しました。
「これでちゃんと動くの?」と思いますが、ちゃんと正しく動きます。
PHPはサーバ再度言語のため、処理がサーバ側で行われるのに対し、HTMLはブラウザ側で処理を行われます。
先にPHPのコードが解析され、変数に格納したタイトルや投稿日などがテキストとして置き換えられる形になります。
その後HTMLがブラウザに解析される頃には、PHPコードではなくタイトルや投稿日、リンクURLなどが入力されている状態となっているのです。
カテゴリー名にリンクが追加されたのが確認できます。
ソースコードを確認すると、var_dumpした際に確認したカテゴリーリンクのURLがaタグのhref内で表示されています。
リンクをクリックすると、カテゴリー別一覧ページが表示されるはずですよ。
これで「投稿」記事の詳細ページの内容表示が完了しました!
CSSは各自整えていただくか、また別の機会に説明するためその時までお待ちいただけたらと思います。
では、次に「カテゴリー別一覧ページ」の内容を画面上に表示させていきましょう。
category.phpに「カテゴリー別の記事一覧」を表示させよう!
single.phpでも行ったように記述の前にまず、ページには何を表示させるか考えていきましょう。
今回「カテゴリー別の記事一覧」ということで、投稿された記事の中から該当カテゴリーに属する記事をリストとして表示することになります。
そして、それら記事のことを表示するための内容が必要になります。例えば、記事タイトル・カテゴリー・サムネイル……などなど。
この記事では、以下の内容をカテゴリー別一覧ページに表示したいと思います。
- カテゴリー別記事リスト
- サムネイル画像
- タイトル
- 本文(50文字)
- 投稿日
では表示する内容が一通り決まったところで、現在のカテゴリー別一覧ページの表示を見てみましょう。
ブラウザで先程まで触っていた、記事の詳細ページを開いてください。複数の記事が存在する場合は、カテゴリーが設定されている記事であればどれを表示してもらってもOKです。
ページが開けたら、カテゴリーのリンクをクリックしてください。複数カテゴリーを設定している場合は、どれをクリックしても問題ありません。
もしくは、WordPressの管理画面の左側にある黒背景サイドバー「投稿」をマウスオーバーし、表示される「カテゴリー」のテキストをクリックしてください。
画面の右側にカテゴリーの一覧が表示されると思うため、いずれかのカテゴリーをマウスオーバーし「表示」テキストをクリックしてください。
するとカテゴリー別の一覧ページが表示されますよ。
では、まずはカテゴリーに属する記事を取得していきましょう!
見出しにあるように「投稿」のカテゴリー別記事一覧ページを表示するテンプレートは「category.php」になります。
Finderに戻り、テーマフォルダ「first-theme」の中にある「category.php」をテキストエディタで開いてください。
現状のcategory.phpの記述内容
表示中のカテゴリー情報を取得しよう!
カテゴリーに属する記事を全て取得するためには、まずカテゴリーIDといった現在表示中のカテゴリー情報が必要となります。
まずはカテゴリーIDを取得し、その後属する記事を取得していきます。
single.phpでは現在表示中の記事IDを取得することができましたが、category.phpでは現在表示中のカテゴリー情報を取得することができますよ。
取得の方法は、WordPressで用意されている関数「get_query_var」を利用することになります。
先にその表示中のカテゴリーを取得していきましょう。取得する情報は使用しやすいよう、カテゴリーIDとします。
現在表示中のデータを取得する関数
公式マニュアル「関数リファレンス/get query var」
では上記リンクをクリックして、関数リファレンス「get_query_var」の詳細を確認していきましょう。
「使い方」の項目には「get_query_var( $var, $default )」と「$var」「$default」の2つのパラメータが必要であることがわかります。
その下「パラメーター」の項目での「$var」には「(string) (必須) 取得する変数キー」とあり、「$default」には「クエリ変数が設定されていない場合、値が戻ります」と記載がありますね。
引用:WordPress Codex日本語版 関数リファレンス/get query var(https://wpdocs.osdn.jp/関数リファレンス/get_query_var)/ 2021年1月1日現在
まず一つ目「$var」の取得する変数キーについて確認します。
「変数キーって何?」って思うかもしれませんが、今開いてるget_query_varのリファレンスページの隅から隅まで見ても、変数キーについての記述は見当たりません。
実はその「変数キー」は別ページに一覧が載っています。
同ページの「説明」コンテンツを見てください。
「グローバル $wp_query オブジェクトの WP_Query クラス内の public query variable /en を取得する。」を記載があるのを確認できます。
この一文の、リンクとなっている「public query variable」テキストをクリックしてください。ここに変数キーの一覧が載っているのです。
WordPress Query Vars(変数キーの一覧)
クエリ変数「Query Vars」
ページを開き、目次の「1.2 クエリ変数」をクリックして該当コンテンツに移動してください。
見出し下に「public」と「private」の2つのエリアで別れた内容が確認できますね。
リファレンス「get_query_var」では「public query variable」とあったため、同じ文字がある「public」エリアの中身を確認してください。
引用:WordPress Codex日本語版 WordPress Query Vars(https://wpdocs.osdn.jp/関数リファレンス/get_query_var)/ 2021年1月1日現在
使用できる変数キーがたくさん確認できますね。
今回はカテゴリーIDを取得したいため、カテゴリー(category)を表す「cat」を使用することになります。
取得できる内容はページやテンプレートによって変わってくるため、暇があれば変数キーを一つずつ確認してみると思わぬ発見があるかもしれませんね。ぜひ記述して確かめてみてください。
これで、変数キーに何を入力するかわかりましたね。
次に2つ目「$default」について確認していきましょう。
これは端的にいうと「戻り値」になります。
get_query_varは、$varで入力した変数キーに該当する値を取得してきますが、もし取得してきた「値がなかった場合」にこの$defaultで入力した内容が返ってくることになります。
例)category.php内の記述が「$sample_data = get_query_var( 'post', '値がありません!' );」の場合、変数$sample_dataに格納されるのは「値がありません!」の文字列になります。
この2つめの「$default」パラメーターはオプションとなっているため、入力はあってもなくても問題ありません。
今回は特に値を返す必要もないため、設定はなしでいきます。
パラメーターついて確認ができたところで、実際にcategory.phpに記述を行っていきましょう。
Finderに戻り、テーマフォルダ「first-theme」の中「category.php」に追記してくださいね。
追記できたら保存し、ブラウザで表示を確認していきます。カテゴリー別一覧ページを既に表示している場合はリロードを、新規にページを開く場合は管理画面「投稿」のカテゴリーをクリックした後、カテゴリーの一つから「表示」をクリックしてくださいね。
追記後のcategory.phpの記述内容
追記箇所)2〜5行目:get_query_varおよびvar_dumpを追加
カテゴリー「未分類」を表示している場合は、カテゴリーIDの「1」が出力されていることが確認できます。
これでカテゴリーIDが取得できました。
カテゴリーに属する記事を取得しよう!
それではお待ちかね。カテゴリーに属する記事を取得し、表示するようにしていきましょう。
WordPressには記事一覧を取得する「WP_Query」という関数が存在します。この関数を使って、カテゴリーに属する記事を取得していきます。
記事一覧を取得する関数「WP_Query」
公式マニュアル「関数リファレンス/WP Query」
上記マニュアルリンクをクリックし「使い方」「パラメータ」を確認していきたいところですが、今までの関数とは少々違うところがあります。
ページを見た方はわかると思いますが、今まので関数と違いパラメーターの数がかなり多いです。
一つずつ律儀に確認していけば日が暮れてしまうのではないか思うほどに、大量に存在しています。
この「WP_Query」は、投稿された記事全てから指定された条件で絞り込んで取得する関数になります。
この絞り込みはパラメータで指定でき、絞り込み条件が色々(投稿タイプ・取得記事数・カテゴリー指定などなど)あるためこのように多量となっています。
引用:WordPress Codex日本語版 関数リファレンス/WP Query(https://wpdocs.osdn.jp/関数リファレンス/WP_Query)/ 2021年1月1日現在
たくさん存在するパラメーターですが、今回使用するパラメータは以下の4つとなります。
「投稿タイプ」「ステータス」「ページ送り」のパラメータに関しては、よく使用することが多いため記憶するようにしておくと便利かもしれません。
- 投稿タイプ
- ステータス
- ページ送り
- カテゴリー
一つ目「投稿タイプ」についてですが、これは投稿された記事の絞り込みを行うためのパラメータになります。
「投稿」以外にも「固定ページ」や関数設定で任意に作成できる「カスタム投稿」が存在するため、それらタイプを指定することができます。
今回はカテゴリーに属する「投稿」記事を取得したいため「投稿」だけを取得するパラメータの設定を行います。
投稿タイプのパラメータ使用方法
関数リファレンス「WP Query」投稿タイプのパラメータ
引用:WordPress Codex日本語版 関数リファレンス/WP Query(https://wpdocs.osdn.jp/関数リファレンス/WP Query)/ 2021年1月1日現在
使用例を確認すると、配列のキー「'post_type'」に取得したい投稿タイプを指定しているようです。
「投稿」はリファレンスにあるよう「'post'」で指定してあげることができます。
よって記述は以下のようになりそうですね。
なおpost_typeやpostといった文字列には必ずシングルクォーテーション「'」で囲いましょう。文字列がシングルクォーテーションで囲まれていないと、エラーが出る恐れがあります。
次に「ステータス」についてですが、これは投稿記事の公開状態から絞り込みを行うためのパラメータになります。
「公開中」記事だけでなく「下書き」状態や「ゴミ箱に入った」投稿も、このパラメータで指定することができます。
今回は「公開中」の記事だけを表示したいため「公開中」というパラメータの指定を行います。
投稿ステータスのパラメータ使用方法
関数リファレンス「WP_Query」投稿ステータスのパラメータ
引用:WordPress Codex日本語版 関数リファレンス/WP Query(https://wpdocs.osdn.jp/関数リファレンス/WP Query)/ 2021年1月1日現在
リファレンスの使用例を確認すると、配列のキー「'post_status'」に取得したい公開状態を指定しているようです。
「公開中」は記載にあるよう「'publish'」で指定してあげることができます。
よって記述は以下のようになりそうですね。
次に「ページ送り」についですが、これは1ページあたりに記事をどの数だけ表示するか指定するパラメータになります。
指定した数字の数だけ投稿を取得してきますよ。なお、全ページ取得してほしいという場合は「-1」を指定することで取得できます。
今回は1ページに15件表示したいため「15」を指定します。
ページ送りパラメータの使用方法
関数リファレンス「WP_Query」ページ送りのパラメータ
引用:WordPress Codex日本語版 関数リファレンス/WP Query(https://wpdocs.osdn.jp/関数リファレンス/WP Query)/ 2021年1月1日現在
ページ送りのパラメーターは複数存在しますが、使用するのは1ページあたりに含める投稿数を指定できる「posts_per_page」になります。
使用例より、記述は以下になりそうですね。なおよくある綴り間違い「post_per_page」といった、先頭のpostに「s」をつけるのを忘れてしまうと絞り込みが反映されなくなります。綴り間違いには気をつけてくださいね。
なお、数値にはシングルクォンテーション「'」をつけなくてもOKです。
最後に「カテゴリー」について確認しましょう。
「カテゴリー」は指定したカテゴリーに属する投稿を取得するパラメータになります。
category.phpで記事を取得するにあたって、最重要と言っても過言ではないパラメータになりますね。
直接IDを指定することもできますが、今回は取得してきたカテゴリーIDを格納している変数を指定してあげましょう。
カテゴリーのパラメータ使用方法
関数リファレンス「WP_Query」カテゴリーのパラメータ
引用:WordPress Codex日本語版 関数リファレンス/WP Query(https://wpdocs.osdn.jp/関数リファレンス/WP Query)/ 2021年1月1日現在
リファレンスを確認すると「cat」というパラメーターを使用すれば、カテゴリーIDを指定すれば絞り込みができると記載がありますね。
「cat」とカテゴリーIDを格納した変数「$category_data」を使って記述すると以下のようになりますね。
変数名は文字列扱いではないので、シングルクォーテーション「'」で囲む必要はありません。
これでWP_Queryの括弧内に入力する内容が把握できました!
ではさっそく、実際にcategory.phpに追記していきましょう。
それぞれ「array(…)」と配列の形になっていましたが、これらは「,」で一つの配列に合体させることができます。
arrayを一つにまとめて、WP_Queryの括弧内に記述した形は以下になります。
Finderに戻って「first-theme」内「category.php」を編集して、保存してください。
編集後のcategory.php
追加箇所)
変数「$category_post_data」を作成し、その中にWP_Queryで取得してきたデータを格納するという記述になります。
これでカテゴリー別の記事一覧が取得できるようになりました。
栖天
長い! 見づらい! わかりにくい!
もっと見やすくする方法はありますか……?
唯月
そうね。こんなに長ったらしいと保守管理にも支障が出てしまうわ。
このWP_Queryのパラメータを編集しやすいように、見やすくコードを変えちゃいましょう!
栖天ちゃんが言うように、WP_Queryの括弧内が長くなり見づらくなりました。
これを見やすいように編集を行っていきましょう。
まず行うことは、WP_Queryの中身がどうなっているか確認することです。
括弧内には複数のパラメータが存在していますが、配列「array」で囲っているため実質は配列が一つ入っていることになります。
この配列を変数に格納して、その変数を括弧内に入れるようにすれば一旦は表示がマシになりそうだと考えられますね。
では変数を新たに作成して、WP_Queryの括弧内にあるarray配列を格納しましょう。
変数を作成し、WP_Queryの括弧内に入力したcategory.php
これでWP_Query内の記述は見やすくなりました。
しかし、配列内の記述は依然見づらいままですね。現状はまだパラメータが4つのためまだ我慢して見ることができますが、パラメータがもっと増えるとより見づらくなってしまいます。
$cat_query_argsの方も、見やすいように整えていきましょう。
配列の場合は、配列の中身毎に改行を加えてあげるとより見やすくできます。
改行して見やすくなった$cat_query_argsは以下になります。
PHPは基本的に文末を示す「;」を設置するまでは改行を加えてもコードに支障はありません。
適度に改行して見やすくしておきましょう。
これでWP_Queryで取得する各種パラメーターが見やすく、修正しやすい形になりました。
形が整ったところで変数「$cat_post_data」に格納された、WP_Queryで取得したデータを確認してみましょう。
$cat_post_dataをvar_dumpして、格納された値の確認を行います。
追記後、保存ができたらブラウザでページの表示確認を行ってください。
WP_Queryで取得した値を格納した変数$cat_post_dataをvar_dumpする記述を追加したcategory.php
追記箇所)12行目:var_dumpを追記
画面にオブジェクトデータとその中にある配列が一気に表示されました。
長々と書かれていて、一つずつ確認していくには時間がかかってしまいそうですね。
画面上を右クリックしソースコードから確認すると、このオブジェクトデータが整形されて見やすくなりますよ。
出力された「object(WP_Query)」の中身を確認していくと「query」「query_vars」「tax_query」…などなど、たくさんのパラメータが存在することがわかります。
今回欲しいデータは投稿データのため、記事情報が確認できる「posts」というパラメーターを使用します。
「posts」以外に「post」というパラメーターが存在しますが、こちらは1記事のみの取得となります。
「カテゴリーに属する記事全て」を取得したい今回は、複数記事を取得できる「posts」パラメーターを使いたいと思います。
※末尾に「s」が付くか付かないかというだけの違いになるため、記述の際は綴り間違いには十分気をつけてくださいね。
ではまずはオブジェクトデータのパラメータ「posts」の中身だけ表示するように書き換えましょう。
オブジェクトデータからパラメータの中を参照するには、アロー演算子を使ってパラメータを指定してあげると取得できますよ。
var_dumpの中身を「$cat_post_data」から「$cat_post_data->posts」に変更してください。
編集後のcategory.php
追記箇所)12行目:var_dump内の変数「$cat_post_data」にパラメーター指定を追記
「->posts」を追記することで、先程は画面いっぱいに表示されていた中身が一気に減りました。
オブジェクトデータ内「posts」に格納されている配列データが表示されている状態になっています。
今は該当する記事が1つしかないため、array(1)という表記のとおり配列内には記事1つだけが格納されていることになります。
WordPress管理画面の「投稿」から記事を増やし、該当カテゴリーを付与するとその記事も追加で取得されるようになりますよ。
では取得できた記事を、一覧として表示していきましょう。
まずは「$cat_post_data->posts」で取得したデータが存在するか否か、if文を使ってチェックを行います。
データがある場合に、コードを実行するようにします。
postsパラメーターの中身は配列のため、echoで出力すると「Array」のテキストが返ってきます。
single.phpで記事カテゴリーを取得したやり方と同じように、foreachを使って中身を取得していきましょう。
「$cat_post_data->posts」をforeachで回し配列の中身一つずつを、新たに作成する変数$cat_postに代入させるようにしていきます。
foreachの「as」の後ろが新規変数になります。この段階では任意の名前を命名することができますよ。
これらif文とforeach文を組み合わせて、category.phpに記述していきましょう!
Finderに戻り、テーマフォルダ「first-theme」内の「category.php」に記述を行います。
なおforeachを回したデータを画面上に表示するため、既に作成済みのdiv要素クラス「main_content」の中に記述していきます。記述・保存ができたらブラウザでカテゴリー別一覧ページを確認してくださいね。
※「ここにカテゴリ一覧を表示します。 」テキストは削除してくださいね。
記述後のcategory.php
追記箇所)14〜18行目:if文・foreach文・var_dump追加
栖天
先程まであった先頭の「array(1)…」という表記が消えています! ……あれ、なんだかデジャブのような
唯月
single.phpで行った記事カテゴリ取得と流れは一緒だからかしら。
栖天
そういえばそうでした!
オブジェクト型になっているということは……今回も同じようにIDとか名前を取得できるってことですね。
唯月
そういうこと。まずは必要情報がなにかもう一度おさらいしておきましょう。
記事情報を取得しよう!
記事一つにつき、取得したい内容は以下であると最初にあげましたね。
- サムネイル画像
- タイトル
- 本文(50文字)
- 投稿日
オブジェクト内から取得できるデータは「タイトル」「本文」「投稿日」の3つになります。
この3つのデータと記事IDの4つを、アロー演算子でパラメーターを指定して取得してきましょう。
category.phpに追記してください。
追記後のcategory.php
追記箇所)17,18,19,20行目の4つ
本文についてですが、一覧記事ということで全文は不要となるため文頭50文字を表示するように調整しておきましょう。
PHPには文字を切り出す関数が存在しますよ。
文字列を取り出す関数「mb_substr」
PHPマニュアル「mb_substr」
また本文にはHTMLタグが含まれている可能性があります。
HTMLタグが含まれたままだと表示崩れが起きたり、字数が正しく切り取れないため、50文字を切り出す前に不要なタグを取り払っておきましょう。
こちらも専用の関数が存在します。
HTMLやPHPのタグを取り除く関数「strip_tags」
PHPマニュアル「strip_tags」
「strip_tags」を使用しタグを削除した後で「mb_substr」で文頭50文字を切り出します。
strip_tags使用例
mb_substr使用例
意味)第一引数「$post_strip_content」文字列の、第二引数「0」文字目から第三引数「50」文字を切り出す
ではこれら本文切り取りのコードをcategory.phpに追記しましょう!
追記後のcategory.php
追記箇所)17,18,19,20行目の4つ
今回新たに変数「$post_strip_content」と「$post_trimming_content」を作成していますが、$post_contentの本文そのままをこのページで使用することがない場合、$post_contentのままにして使い回すことが可能です。
使いやすい方でコーディングしてくださいね。
※編集前の本文を使用する場合に$post_contentに編集後の内容を代入してしまうと、内容が上書きされてしまいます。
$post_contentに代入する場合の記述例
これで取得したい4つの記事データのうち、3つが取得できました。
次に残っている最後の1つ「サムネイル画像」の情報を取得しましょう。
サムネイル画像ですが、WordPressでは「アイキャッチ画像」として設定されます。
この投稿記事に設定された「アイキャッチ画像」を取得する方法ですが、これもWordPressには専用の関数が存在します。
投稿記事に設定されたアイキャッチ画像のURLを取得する関数
公式マニュアル(英語版)「get_the_post_thumbnail_url」
この「get_the_post_thumbnail_url」を利用してアイキャッチ画像のURLを取得し、そのURLをimgタグのsrcに出力するよう記述していくことにします。
上記リンクをクリックし、ページを見てみましょう。
全て英語のため途中で読むのをやめてしまいそうですが、ここは一つずつしっかり確認してきますよ。
このページに記載されている内容は日本語版の関数リファレンスと同じ形式のため、ある程度は書かれている内容が把握できるはずです。
まずは関数の「使い方」「パラメータ」を確認していきます。
「使い方」をみると、get_the_post_thumbnail_url()の括弧内に2つのパラメーターが必要であることがわかりますね。
では次にそのパラメーターの詳細を確認していきましょう。
パラメータには「$post」と「$size」の2つがあります。
「$post」部分の説明には「Post ID」という文字があることから、記事IDが必要になるということがわかります。
また「$size」はについては、パラメーター名からわかるように画像のサイズを指定するとわかりますね。
引用:WordPress Codex Code Reference「get_the_post_thumbnail_url()」(https://developer.wordpress.org/reference/functions/get_the_post_thumbnail_url/)/ 2021年1月1日現在
記事IDはforeachで取得してきた「$post_id」を利用することができそうです。
画像サイズについてはデフォルトの「'post-thumbnail'」を利用することにしましょう。
これら内容を確認し、実際にget_the_post_thumbnail_url()を使ってみると以下のコードになります。
ではさっそくcategory.phpに記述しましょう!
Finderに戻り「first-theme」フォルダの「category.php」をテキストエディタで開いて追記してください。
追記後のcategory.php
追記箇所)23行目:get_the_post_thumbnail_urlを追記
栖天
必要な情報はこれで全て取得できましたね!
じゃあ次は画面に表示するために、データを出力ですね!
唯月
一つ何か忘れてないかしら?
これは「記事一覧」ページ……。記事をクリックしたら記事の詳細ページに遷移した方が良いと思うのだけど……。
栖天
! 忘れてました……。
リンク先をまだ取得できていませんでしたね……。
唯月
では、リンク先を取得しましょうか!
記事詳細ページのURLを取得する方法ですが、こちらもやはりWordPress側で用意された関数が存在します。
その名も「get_the_permalink」。
get_the_permalink()の括弧内に記事IDを入力することで、入力した記事IDを表示するURLを取得してくれますよ。
投稿記事URLを取得する関数
公式マニュアル(英語版)「get_the_permalink」
追記後のcategory.php
追記箇所)24行目:get_the_permalinkを追記
これで必要となる全てのデータを取得しました!
各種変数に格納した値が正しく取得できているかvar_dumpを使って確認してみてくださいね。
では実際に各種値の出力を行っていきましょう。
まずは各記事を表示するためのulタグとliタグを記載する必要がありそうですね。
次に、記事の詳細(タイトル・本文等)を表示するために、liタグの中にdivタグやpタグを使っていきます。
今回は左側に画像、右側にタイトルや本文を表示する形にしたいため、以下のような記述で進めていきたいと思います。
ではこのHTMLコードを、category.phpに取得した記事情報を当てはめて追記していきましょう。
ulタグはif文の後に、liタグはforeachの後に記述してくださいね。
テーマフォルダ「first-theme」内の「category.php」を開き編集してくださいね。
追記後のcategory.php
追記箇所)15, 40行目:ulタグ追加。27〜38行目:HTMLコード追加
ブラウザでカテゴリー別一覧ページを表示すると、このような表示になっているはずです。
現在の「Hello world!」記事では、アイキャッチ画像が登録されていないため画像が表示されない状態になります。
画面上では画像が表示されていないだけですが、ソースコードを確認するとHTMLコードが不恰好になっていることがわかります。
画像部分のコードが、画像がないために「<img src="">」という表記になっていますね。
サイトのコード上これはNGといっても過言ではないため、修正しておきましょう。
またリストで複数記事が表示される際に、画像の有無でレイアウトがガタガタになってしまうことも防ぎたいと思います。
よってアイキャッチ画像が設定されていない時は「No image」というダミー画像を表示することにします。
好きな画像を作成してOKですが、ここはサービスを使って画像を表示しましょう。
使用するサービスはこちらになります。
ダミー画像生成システム
https://placehold.jp
上記サイトから生成したURLを、ダミー画像として使用します。
画像URLがない場合にダミー画像を使用するということで、if文を使いましょう。
コードは以下になります。「else」を使うことで「それ以外」の場合の内容を記述することができますよ。
ではこのコードをcategory.phpに記述しましょう。
Finderでテーマフォルダ「first-theme」内「category.php」を編集してください。
編集箇所は画像がある<p class="img">タグ内です。
編集後category.php
編集箇所)30〜34行目:img画像にif文を追加
編集後、保存してブラウザで確認してみると、ダミーとして設定した画像が表示されているはずですよ。
まだCSSを設定していないため、画像やテキストは縦並びで表示されています。
栖天
わぁ……。記事の内容が表示されると何だか感動しますね。
でもこのページ、今は何のカテゴリーが表示されているかわからないですね…。
唯月
それなら見出しを追加して、その中にカテゴリ名を表示してみたらどうかしら。
カテゴリIDも取得してるし、カテゴリ名の取得・表示なんてもう簡単よね。
栖天
ハードルをあげないでください〜。
カテゴリー名を見出しとして表示しよう!
カテゴリー名といったカテゴリー情報を取得するには、WordPressに存在する専用の関数である「get_category」を利用します。
記事詳細の方でカテゴリーを取得した「get_the_cageory」とは別物です。
記述の際は綴り間違い等に注意してくださいね。
get_category :カテゴリーIDからカテゴリー情報を取得する
get_the_category:記事IDから、記事に属するカテゴリー情報を取得する
記事IDから記事情報を取得する関数「get_category」
関数リファレンス「get category」
get_the_categoryで取得した時と同じように、返ってくるデータはオブジェクト型になります。
nameというプロパティを指定することで、カテゴリー名が取得できますよ。
「get_query_var」で取得したIDを使って、カテゴリー情報を取得しましょう。
では上記コードを、category.phpに設置していきます。
テーマフォルダ「first-theme」内にある「category.php」に追記してくださいね。
追記後のcategory.php
追記箇所)4,5行目:カテゴリー名取得・17行目:見出し表示
追記後、コードを保存しブラウザで思った通りに表示がされるか確認してみてくださいね。
ページ上部に見出しが表示され、何のページが今表示されているのか一目でわかるようになりましたね!
ページャーを追加しよう!
これで記事一覧が表示されるようになりました。
ですが、1ページに表示にされるのはWP_Queryで設定した15件までです。もし15件以上の投稿があった場合、16件目以降は画面に表示されることはありません。それならいっそ表示する記事数を15件と言わずに、カテゴリーに属する全記事をを表示するように変えてしまいたくなりますね。
20〜30件程度ならそれでもいいかもしれませんが、今後投稿を重ねて100件や200件と数が増えた場合どうしましょう。
1ページに100件もの記事を表示するとなると、ページ表示速度がぐんと遅くなってしまう可能性があります。
ページの表示速度が下がってしまう可能性を考慮すると、やはり1ページに表示する件数は指定しておきたいですね。
栖天
1ページに表示する件数は指定したい。
でもカテゴリーに属する全記事を表示したい。
一体どうすれば……!!
唯月
欲張りさんね。でも、いい方法があるわ。
栖天
あるんですか?! 教えてください!
唯月
記事を15件表示するアーカイブページを、複数作成すればいいんじゃないかしら。
15件の記事を表示するアーカイブページを複数作成する。「え? それってどういうこと?」と思うかもしれませんね。
例えば、現在archive.phpには最大15件の記事が表示されます。それなら投稿記事のの16件目から30件までを表示するページを追加で作成しよう! ということです。
ページを複数作成するといっても、何件投稿されているか随時数えてその都度archive.phpを追加で作っていくという話ではありません。ページ自体はWordPress側で自動で作成してくれるようになるため、私たちはそのページを表示してもらうための設定を行うだけでOKです。
ページを作成できても、遷移するURLがわからなければ意味がないのでは? と思うかもしれませんが、ご安心ください。
ページネーションという機能を使用すれば、次の投稿記事一覧のページへ遷移するリンクを出力することができます。
お気づきかもしれませんが、そのページネーションという機能はWordPressに備わっています。
では実際にその機能を使ってページネーションもといページャーを表示してみましょう!
公式マニュアルの関数「get_the_posts_pagination」ページを見てくださいね。
ページネーションの関数
公式マニュアル「関数リファレンス/get the posts pagination」
上記URLにアクセスし「説明」「使い方」「パラメータ」を確認しましょう。
「使い方」では変数に格納していることがわかりますね。関数が「get_」から始まっているため、値を取得してくるだけということがわかります。
「パラメータ」で設定できる引数が記載されていますね。今回は今のところ使用しないため、括弧の中身は空で進めていくことにします。
変数に格納し、その変数をechoで出力するコード
もしくは、そのままechoで出力するコード
上記コードをcategory.phpに記述していきますが、現在記事は1つしか投稿されていません。
その場合ページャーが表示されることなく、正しく設定できているか確認できないため、先にダミー記事を作って確認できる状態にしておきましょう。
ダミー記事は5つ程度作成しておくと確認しやすいと思います。
WordPress管理画面の左側の黒背景サイドバー「投稿」をクリックし「新規作成」をクリックして記事作成を行ってくださいね。
※筆者はカテゴリーの内容が分かれるかもチェックしたいため、新規にカテゴリー「カテゴリー1」を追加しいくつかの記事に付与しています。
では前準備として記事を複数作成できたら、実際にページャーの記述を行いましょう!
Finderに戻って、テーマフォルダ「first-theme」内の「category.php」に、get_the_posts_paginationを追記してくださいね。
追記後のcategory.php
追記箇所)49〜53行目:ページャーの記述を追記
ブラウザで表示チェックを行いたいところですが、現状のままでは画面にページャーが表示されることはありません。
画面に表示するには、WordPressの管理画面の方で一手間設定を加える必要があります。
WordPressの管理画面に戻って、左側にある黒背景サイドバー「設定」をマウスオーバーしてください。
すると色々な設定項目が表示されると思います。その中から、上から3つ目の「表示設定」をクリックしてください。
色々な設定項目が存在するのが確認できますね。
その中にある「1ページに表示する最大投稿数」の件数をチェックしてください。
ここに設定されている数字が、さきほどのページャーを表示するか否かを判別する材料となります。
現在の設定は「10」件となっています。
1ページあたりに表示される記事数は最大10件ということになり、記事が10件を超えた場合に初めてページャーが表示される設定になっています。
今投稿されている記事は「Hello world!」を含めて6件のため、ページャーが表示されないということになります。
ではこの数値を変更すればページャーは表示されるのでしょうか?
実際に変更し、設定を保存した後に記事一覧ページを確かめてみましょう。
「1ページに表示する最大投稿数」の件数を10件から「5」件に変更して、ページ下部にある「変更を保存」の青ボタンをクリックしてください。
編集・保存ができたら、変更が反映されページャーが表示されるようになっているか確認してみましょう。
ブラウザでカテゴリー別一覧ページを確認してくださいね。
正しく変更ができていると、カテゴリーに属する記事が全て表示され、その記事一覧の最下部にページャーが表示されているのが確認できるはずです。
ページャーの「2」もしくは「次へ」をクリックすると、次のカテゴリー別一覧ページが表示されますよ。
表示されているページのURLを確認すると、2ページ目ということがわかるはずです。
※2ページ目以降の表示内容設定を行っていないため、画面上に表示される内容は1ページ目と同様の内容になります。
2ページ目のカテゴリー別一覧ページ(カテゴリー:未分類)のURL
URL:localhost:8888/wp-site/category/未分類/page/2/
栖天
……あれ?
設定では「5」件までって設定しましたけど、記事は6つ表示されていますね。バグかな。
唯月
鋭いわね。でもこれはバグではないわ。
WP_Query関数を使って、表示記事数を設定したのを覚えているかしら。
栖天
覚えてます! 確か「posts_per_page」で「15」と記載しました。
もしかして、その「15」件表示するって設定が適応されているんでしょうか!
あれ、でもそれならページャーも表示されないはずだし……。あれれ?
唯月
ふふ、混乱してきたわね。
じゃ、まずは一つずつ確認していきましょうか。
表示される記事数とページャーのカウントを合わせよう!
category.phpに記載したWP_Queryのposts_per_pageの値は「15」のため、1ページ目に表示される記事は最大15件表示されるようになっています。
よって現在、投稿にある6件のデータ(カテゴリーが「未分類」のもの)が全て表示されている状態です。
次に「設定」の「1ページに表示する最大投稿数」を「5」件にしたため、1ページに表示される記事は最大5件になります。
カテゴリーに属する投稿データが6件のため、1件の投稿データが1ページ目にはみ出ることになるはずですね。そのためページャーが表示されたことになります。
栖天ちゃんは混乱していましたが、もしかすると勘のいいあなたはもうお気づきかもしれません。
そう、このWP_Queryの設定取得投稿数と、WordPress管理画面の「設定」表示投稿数は連動していないのです!
そんなことがあっていいのかと思いそうですが、連動していれば「設定」の表示投稿数が「15」となり、いくら数値を変更しても変わることがないはずですね。
このページャーの投稿表示数とWP_Queryの設定投稿取得数が合わない問題ですが、両方の数値を同じにすることで難を逃れることができます。少し手間となりますが、記事の表示数を変更する場合は、テンプレートの記述と管理画面「設定」の表示件数の2つの項目を変更しましょう。
では、category.phpのWP_Queryのposts_per_pageの値を「5」に変更して、表示を確認しましょう。
Finderに戻って、テーマフォルダ「first-theme」内の「category.php」に、posts_per_pageの数値を変更してくださいね。
追記後のcategory.php
追記箇所)11行目:posts_per_pageの数値を「5」に変更
category.phpのposts_per_pageの値を変更後、保存しブラウザで表示チェックを行うと、記事が5件まで表示されているのを確認できますよ。
ただ、ページャーの「次へ」をクリックしても、表示される記事は1ページ目と同じ内容のままです。
これを、1ページ目は1ページ目の内容を、2ページ目には2ページ目の内容が表示されるように設定していきましょう!
表示中のページ目によって表示内容が変わるようにしよう!
現在category.phpに記述しているWP_Queryでは、1ページ目の内容しか表示されません。
なぜなら1ページ目・2ページ目以降に関わらず、表示されるのはcategory.phpに記述した内容になるからです。
現状category.phpの記述内容に、ページ数によって取得データを変更する内容を記載していません。
WP_Query関数ではページ数によって取得する内容を変更する設定が存在します。
これを使用して、表示中のページによって内容を変更しましょう。
ページ数によって取得内容の変更パラメータ
関数リファレンス「WP_Query」ページ送りパラメータ
上記リンクをクリックし、目次の「5.11 ページ送りパラメータ」から該当コンテンツを見てください。
「xページから投稿を表示」コンテンツを見ると、設定したいページ数によって内容を変更する方法が記載されていますよ。
引用:WordPress Codex日本語版 関数リファレンス/WP Query(https://wpdocs.osdn.jp/関数リファレンス/WP Query)/ 2021年1月20日現在
「'paged' => $数値」を記述すれば、そのページ番号時での内容を取得できそうですね。
1ページごとに数値を一つ一つ設定していくわけにはいかないですし、もしそのやり方を採用するとページ数ごとにテンプレートを作成することにもなってしまいます。
あまり好ましいとは言えないため、ページ数は自動で取得し、それをWP_Query上で反映するようにしておきたいですね。
現在表示中のページ数を取得するには「get_query_var」関数を使用する必要があります。
指定する変数クエリは「'paged'」のようですね。
このpagedを指定することで、2ページ目以降の場合はページ数が取得されることになります。
こちらも上記マニュアルにある「現在のページから投稿を表示」コンテンツに記載がありますよ。
公式マニュアルによると、変数$pagedを作成し、その中にget_query_var( 'paged' )で取得した現在ページ数を格納しているようですね。
変な記述。と思った方もいるかもしれません。
この「〇〇 ? △△ : ×× ;」という記述は三項演算子といって、if文の簡略形となります。
このコードは以下のように書き換えることが可能です。
5行あったif文のコードが、三項演算子を使用すると1行に短縮できました。
三項演算子は記述内容を短縮できて便利ですが、可読性が下がるため、今回のページ数取得のように簡単な内容の場合のみ使用するようにしましょう。
基本的にはif文を使用することをおすすめします。
では変数$pagedに、ページ送りの変数クエリがある場合はその数値を、変数クエリがない場合は「1」を格納しましょう。
そしてその変数$pagedをWP_Queryのパラメータに追加していきます。
それでは、実際にcategory.phpに記述していきましょう。
Finderに戻り「first-theme」内にある「category.php」に記述を行ってください。
追記後のcategory.php
追記箇所)3行目:$pagedで現在ページ数を取得、14行目:ページ送りパラメータを追加
記述できたら保存し、ブラウザで表示を確認してみましょう。
「posts_per_page」を「5」にしているため、1ページ目に表示される記事が5つになっています。
先程WP_Queryにページ送りパラメータ「paged」を表示中のページ数を参照するように設定したため、記事一覧下にあるページャーの「次へ」をクリックすると、2ページ目が表示されるはずですね。
「paged」の設定が正しく反映されているか、確認してみましょう。
ページャーの「次へ」もしくは「2」をクリックしてください。
1ページ目では5/6件の記事が表示されていましたが、2ページ目では残りの1件が表示されています!
ブラウザの検索バーに表示されるURLを確認すると2ページ目を表示していることがわかりますね。
またページャーの「前へ」と「1」テキストにリンクがあることから、現在ページが2ページ目であることを示しています。
これでページャーが正しく動くようになりました。
今後記事がどれだけ増えても、全ての記事が表示できますね。
ページャータイトルを非表示にしよう!
ページャーが正しく動作するようになりましたが、もしかするとページャーの上に「投稿ナビゲーション」というテキストが表示されていたりしませんか?
今回このタイトルテキストは不要のため、非表示にしたいと思います。
ここで紹介する方法はテキストを画面上から見えなくするだけで、タイトルを囲っていたHTMLタグのコードは残ったままになります。もしコードごと削除したい場合は別の方法を探していただくことになります……。
このページャーのタイトルは関数「get_the_posts_pagination」のパラメーターから変更が可能となっています。
では公式マニュアルの「get_the_posts_pagination」ページをもう一度確認してみましょう。
引用:WordPress Codex日本語版 関数リファレンス/get the posts pagination(https://wpdocs.osdn.jp/関数リファレンス/get_the_posts_pagination)/ 2021年1月20日現在
パラメーターを一つずつ確認していくと「$args」は配列となり、その中に各種値を入力していく形になりそうですね。
各種パラメーターの値は英語で「Previous」や「Next」となっていますが、WordPressで日本語化を行っている場合は「前へ」「次へ」といった日本語に置き換わっていますよ。
ブラウザでチェックした際のページャータイトルはデフォルトの「投稿ナビゲーション」となっていました。
該当するテキストが無いように思いますが「screen_reader_text」にある「Posts navigation」が日本語化したものが「投稿ナビゲーション」となります。
よってこの「screen_reader_text」の値を編集すればテキストが置き変わることになります。
今回はタイトルのテキストが不要のため、値を「' '」と半角スペースを設定します。
※半角もしくは全角スペースがないと反映されません。シングルクォンテーションの中身には必ず半角もしくは全角スペースを1文字記述しましょう。
では実際にテキストを変えてみましょう。
「screen_reader_text」以外は変更せずデフォルトのままで進行します。
コードは以下のようになりますよ。
パラメーターは一つしか設定しないため、変数$pager_argsに格納せずそのまま関数内に記述してもOKです。
もしくは
Finderに戻って、テーマフォルダ「first-theme」内「category.php」をテキストエディタで開いてください。
ページャーのコードを、上記コードに置き換えてくださいね。
編集後のcatgory.php
編集箇所)54行目:パラメーター「screen_reader_text」の値を変更
ブラウザでカテゴリー別一覧ページをチェックすると、先程まであったページャータイトルが消えていることがわかりますよ。ソースコードを確認すると、HTMLコードが表示されているのが確認できてしまいますが……。
とりあえずは、ページャータイトルが非表示になったことで良しとしましょう!
ページャー及び2ページ目以降の作成ができたのを確認したところで、1ページあたりの表示件数を設定し直していきます。
現在「5」件までとなっていますが、当初の予定どおり「15」に数値を直してくださいね。
category.php内に記載したWP_Queryの「posts_per_page」を「15」し、加えてWordPressの管理画面にある「設定」>「表示設定」にあった「1ページに表示する最大投稿数」の件数を「15」に修正してください。これら2箇所の修正を行ってください。
これでカテゴリー別の一覧ページ「category.php」に表示する予定の内容が揃いました!
では次に投稿記事のアーカイブページ「archive.php」に内容を表示していきましょう。
archive.phpに「投稿記事一覧」を表示させよう!
single.phpに記事詳細を、category.phpにカテゴリー別記事一覧を表示することができました。
では投稿記事設定の最後である「記事一覧ページ」をarchive.phpに内容を表示していきましょう。
第二回目の記事で、記事一覧ページの表示URLを設定しましたね。
では現状のarchive.phpの表示をブラウザで確かめてみましょう。
functions.phpで設定したパーマリンクが「post-archive」の場合
URL:localhost:8888/wp-site/post-archive/
設定がうまくいっていれば、上記URLでarchive.phpが表示されます。
ではまず、記事一覧ページに表示する内容をピックアップしましょう。
single.phpでも確認した、公式マニュアルの「テーマの作成」というページに記事内に表示するのに必要な内容が記載されています。
その「テーマの作成」ページを閲覧し、表示する内容を決めていきます。
ページを開くことができたら「テンプレートファイルのチェックリスト」の「アーカイブ (archive.php)」から内容を確認することができます。
※コンテンツはページ下部に存在するため、目次からクリックして飛ぶといいですよ。
引用:WordPress Codex日本語版 テーマの作成(https://wpdocs.osdn.jp/テーマの作成)/ 2021年1月1日現在
今回は以下の内容を記述していきます。
- 最新の投稿記事リスト
- サムネイル画像
- タイトル
- 本文(50文字程度)
- 投稿日
- カテゴリー
栖天
あれ?
カテゴリー別記事一覧ページとほぼほぼ内容が一緒ですか?
唯月
そうね。
「最新の投稿を取得する」という点と、各記事の「カテゴリ」を取得する点だけが違う程度で他は一緒よ。
栖天
じゃあ途中までは、category.phpに記述した内容をおさらいする感じで進めていっていいんですね!
唯月
えぇ。頑張ってちょうだいね。
最新投稿された記事一覧を表示しよう!
category.phpでは、関数「WP_Query」を使って、記事の一覧を使用しました。
archive.phpでも同じく「WP_Query」を使って記事一覧を取得していきます。
今回はカテゴリー指定が必要ないため、category.phpでは記載した「'cat' = $カテゴリID」は不要となります。
「投稿」で「公開」されている記事を「15」件取得するWP_Queryコード
archive.phpでは「最近」投稿された記事を取得したいため「投稿されて新しい記事を」という指定をしておきましょう。
WP_Queryでは記事を取得する順番を指定してあげることができます。
公式マニュアルに詳細が載っていますよ。
関数リファレンス「WP_Query」順序づけパラメータ
「WP Query」順序づけパラメータ
上記ページにアクセスすると「順序づけパラメータ」の項目に2つのパラメータ「order」と「orderby」の2つが存在することがわかりますね。
引用:WordPress Codex日本語版 関数リファレンス/WP Query(https://wpdocs.osdn.jp/関数リファレンス/WP_Query)/ 2021年1月17日現在
「order」は取得する順番を指定できます。昇順(値が若い・小さい・低い順)か降順(値が古い・大きい・高い順)の2つから選択できます。
指定する際は、昇順の場合「ASC」を、降順の場合は「DESC」と記載しましょう。
今回、最新の記事を取得したいため「DESC」を指定します。
「最新の投稿」ということでASCを記載しそうになりますが、記事の投稿番号(ID)の数値が大きいためDESCになります。
このあたりでどっちがどっちか混乱しそうですが、気をつけて記載してくださいね。
※間違えたら間違えたで後でコードを書き直せばOKです。
「orderby」は順序づけを行う項目を指定します。
投稿日を基準に並び替えたり、記事名で並び替えたりなど、色々な項目から選ぶことができます。
記事名を選択し、記事タイトルが日本語の場合は「数字(0→9)→ひらがな・カタカナ(あ→ん)→漢字」という順番に並び替えがされるはずです。
今回は「最新の記事」順に表示したいため「date」を指定することにします。
記事を作成した順番でも変わらないのであれば「ID」でも指定ができますよ。
では先程のWP_Queryのコードに、新たに「order」と「orderby」を追加したコードをarhive.phpに記述しましょう!
Finderに戻ってテーマフォルダ「first-theme」内にある「archive.php」に追記してくださいね。
追記後のarchive.php
追記箇所)2〜11行目:WP_Queryコードを追加
あとはcategory.phpでデータを取得したのと同じように、各種必要となるデータを取得していきます。
WP_Queryで取得したデータから投稿記事の一覧を取得する場合は、アロー変数を使ってパラメーター「posts」を指定すれば取得できましたね。
また「->posts」で取得してきたデータは配列のため、データが空っぽだとそのままforeachを回した際にエラーが表示される可能性があります。
それを回避するために、if文とempty関数を利用して値の有無をチェックしていましたね。
上記を思い出しながら記事内容を取得・表示していきましょう。
foreach内の各種内容取得については詳細は省きます。
詳しく知りたい方は「caategory.phpの記事情報を取得しよう!」をご確認ください。
テーマフォルダ「first-theme」内「archive.php」を編集してくださいね。
編集ができたら、保存しブラウザで表示チェックを行いましょう。
もし値が取得できているか不安な場合は、都度var_dumpして値のチェックを行うとベストですよ。
追記後のarchive.php
追記箇所)12〜43行目:ifで$cat_post_dataの値チェック・foreachで$cat_post_dataの内容取得と表示
これでcategory.phpと共通の箇所である、記事の内容は取得・表示できました。
次に、各記事のカテゴリーを取得し表示するように追加のコードを記載しましょう。
記事に属するカテゴリーの取得の方法については、single.phpで記事情報を取得する際に説明しているため詳細な説明は省きます。
詳しく知りたい方は、上記リンクより詳細なカテゴリー取得の方法をご覧ください。
get_the_categoryを使って記事に属するカテゴリーを取得
single.phpでの記事情報取得で説明したように、get_the_categoryで取得したデータは配列の形になっています。
foreachで各カテゴリーの内容を取得する前に、if文で配列の値の有無をチェックしておきましょう。
では上記コードをarchive.phpに適応し、記事ごとにカテゴリーを表示します。
テーマフォルダ「first-theme」内「archive.php」を編集してください。
追記後のarchive.php
追記箇所)24行目:get_the_category追加・39〜54行目:カテゴリー表示
カテゴリーを表示するようにした記事一覧
現在、一つの記事全てに記事詳細ページへ飛ぶリンクを付与しています。
もしカテゴリー名にカテゴリー別一覧ページに飛ぶリンクを付与したい場合は、aタグの設置箇所を変更する必要があるためご注意くださいね。
aタグの中にaタグを追加することはできないため、そのような記述を行うとレイアウト崩れが起こる可能性があります。
カテゴリー名にカテゴリー別一覧ページに飛ぶリンクを追加した場合の記事内容liタグコード
liタグ内全体を覆っていたaタグのコードを、imgタグとh2タグの前後にそれぞれ追加しなおしています。
これによって、カテゴリー名にaタグを追加することができるようになりました。
ページャーを表示しよう!
category.phpに追加したページャーを、archive.phpでも使用できるように追加しましょう。
なお、WordPress管理画面で設定した「設定」>「表示設定」にある「1ページに表示する最大投稿数」は全テンプレートで共通となってしまいます。ページごとに表示件数を変えることはできないため、ご注意ください。
※テンプレートごとに表示件数を変えたい場合は、プラグインを使用すると対応できる可能性があります。ページャーのプラグインは多数あるため、ぜひ気に入ったプラグインを使用してくださいね。
ページャーを利用するには、下記3つの設定が必要でしたね。
category.phpで実行したことを思い出しながら、archive.phpへも追記していきましょう。
- 現在のページ数を取得し、変数$pagedに格納
- WP_Queryにページ送りパラメータを設定
- ページャーを表示する関数を追加
Finderに戻り、テーマフォルダ「first-theme」内にある「archive.php」を編集しましょう。
編集後のarhive.php
追記箇所)3行目:$pagedを追加。8行目:WP_Queryパラメータ「paged」を追加。61〜65行目:ページャー表示コードを追加。
1ページに表示する記事は15件と設定したため、現在記事が6件しかないこの記事一覧ページにはページャーは表示されませんのでご注意ください。
ページ見出しを表示しよう!
表示中のページが記事一覧だとわかるように、ページの上部に見出しを表示するようにしましょう。
category.phpでは表示中のカテゴリー名を取得し、それを見出しとして出力しました。
ですが、今回の記事一覧ではカテゴリー名といった情報を取得する必要がありません。
HTMLコードをそのまま記述してしまいましょう。
Finderに戻って、テーマフォルダ「first-theme」の中にある「archive.php」に記述してください。
クラスmain_contentの中に記述するのが良さそうですね。
記述ができたら、保存しブラウザで記事一覧ページを確認してくださいね。
追記後のarchive.php
追記箇所)15行目:h1タグの見出し追加
archive.phpに表示する内容は揃いました。
「投稿」の内容を、3つのテンプレート「archive.php」「category.php」「single.php」に表示できましたね!
次回は404ページと自己紹介の固定ページを作成していきます。
お楽しみに!
栖天
あっという間に投稿記事が表示されましたね……!
唯月
お疲れ様。
これでサイトの大部分はできたようなものよ。
栖天
となると、あとちょっとで完成になるんですね。
ドキドキしてきました。
次の記事:404ページと固定ページを表示してみよう!