以前、投稿タイプを増やす方法や、
増やしたカスタム投稿を最近の投稿に表示する方法などをご紹介しました。
このサイトでは、サイドバーに最近の投稿と、アーカイブを表示していますが、
アーカイブから表示される一覧にはカスタム投稿が反映されていません💦
デフォルトの投稿タイプ分のみが表示されています。
今回は、アーカイブ一覧にカスタム投稿も表示されるようにしてみたいと思います。
アーカイブページとは
WordPressでは、投稿を一覧化して表示するページのことをアーカイブページと言います。
条件を付けて表示することも可能で、ある特定の月だけ表示した場合を「月別アーカイブページ」と呼んだりします。
編集対象ファイル
一覧表示をさせるには、どのファイルの編集が必要なのでしょうか?
一覧表示にカスタム投稿も含めるように設定するには、以下ファイルの編集が必要です。
functions.phpとは
利用しているテーマ内で汎用的に使われるコードを記載するファイルです。
このファイルに、投稿の表示に関する関数を記述します。
アーカイブページをカスタマイズしよう
functions.phpの編集となるため、バックアップを取ってから、設定をしていきましょう。
functions.phpの編集手順
※「Snippets」というプラグインを使って編集をします。
①Snippetsプラグインの「Add New」をクリックする。
②任意のタイトルをつけ、以下コードを記入する。
※カスタム投稿の投稿タイプスラッグ名の部分に、一覧表示させたいカスタム投稿で定義したスラッグ名を記入する。
function my_pre_get_posts( $query ) { if ( $query->is_month() && $query->is_main_query() ) { $query->set( 'post_type', array('post','カスタム投稿の投稿タイプスラッグ名') ); } } add_action( 'pre_get_posts', 'my_pre_get_posts' ); function my_getarchives_where( $where ){ $where = "WHERE"; $where .= " (post_type = 'post' OR post_type = 'カスタム投稿の投稿タイプスラッグ名')"; $where .= " AND post_status = 'publish'"; return $where; } add_filter( 'getarchives_where', 'my_getarchives_where' );
※複数ある場合
3行目を下記のように、カンマで区切って追加する。
array('post','投稿タイプスラッグ名①','投稿タイプスラッグ名②') );
10行目を下記のように、追加する。
$where .= " (post_type = 'post' OR post_type = '投稿タイプスラッグ名①' OR post_type = '投稿タイプスラッグ名②')";
③「Run snippet everywhere」を選択し、「Save changes」をクリックする。
④追加したsnippetが有効になっていることを確認する。
⑤アーカイブページを開き(開いていた場合はF5キーで更新)、対象の投稿が追加されていることを確認する。
コードの意味を確認しよう
コードの内容を理解し、どうしてそのコードが必要なのかを理解していきたいと思います。
- function my_pre_get_posts( $query ) {
- ~~~
- }
my_pre_get_postsという名前の関数を準備します。
この関数は、$queryという引数を受け取り、動作します。
- if ( $query->is_month() && $query->is_main_query() ) {
- ~~~
- }
my_pre_get_posts関数の中身です。
引数が月別のアーカイブページか、メインクエリであった場合に、
中の処理を実施します。
WordPressは、データをデータベースに格納しています。ページを表示する際は、表示するための条件を指定してデータベースからデータを取得します。このときの問い合わせがクエリです。
例えば、デリバリーでは、お客さんの注文に合わせた商品を作って、お客さんの元まで届けていますね、
この注文がクエリです。
クエリの1つです。WordPressによって自動的に生成されるクエリです。
WordPressはデフォルトのまま、投稿を増やすことでサイトを充実させることもできますが、
カスタマイズすることで、更に便利なサイトにすることが可能です。
このデフォルトのサイトを表示させるためのクエリをメインクエリと呼びます。
一方で、カスタマイズして、表示項目を増やした場合、
メインクエリだけでは、すべての情報を表示することができません。
そこで必要になるのがサブクエリです。
例えば、いつもスーパーで食材を買い物するとします。
これがメインクエリだと思ってください。
ちょっと風邪を引いて、薬が必要になりましたが、スーパーには売っていないため、
ドラッグストアに行く必要があります。
これがサブクエリです。
食材も薬も両方買う必要がある時は、
スーパーとドラッグストアの両方に行く必要があります。
- $query->set( ‘post_type’, array(‘post’,’カスタム投稿の投稿タイプスラッグ名’) );
上述のように、月別のアーカイブページや、メインクエリの場合、
メインクエリだけでは、カスタム投稿のデータはデータベースから取得できません。
そこで、サブクエリを設定する必要があります。
post_typeは投稿タイプのパラメータ(引数)です。
この引数に、指定した投稿タイプの情報を取得するよう、設定しています。
複数を指定するためarrayという箱にすべてを入れて渡しています。
投稿タイプ | 内容 |
post | 投稿 |
page | 固定ページ |
revision | 履歴 |
attachment | 添付ファイル |
nav_menu_item | ナビゲーションメニュー項目 |
カスタム投稿タイプのスラッグ名 | カスタム投稿タイプ |
- add_action( ‘pre_get_posts’, ‘my_pre_get_posts’ );
my_pre_get_posts関数を実行します。
- function my_getarchives_where( $where ){
- ~~~
- }
my_getarchives_whereという名前の関数を準備します。
この関数は、$where という引数を受け取り、動作します。
- $where = “WHERE”;
- $where .= ” (post_type = ‘post’ OR post_type = ”カスタム投稿の投稿タイプスラッグ名’)”;
- $where .= ” AND post_status = ‘publish'”;
- return $where
my_getarchives_where関数の中身です。
サブクエリを作っています。
投稿タイプが投稿か、指定したカスタム投稿の投稿タイプスラッグ名であり、
かつ、投稿が公開状態のデータを取得するクエリです。
クエリを生成し、最後にクエリをまとめて返しています。
- add_filter( ‘getarchives_where’, ‘my_getarchives_where’ );
my_getarchives_where関数を実行します。
まとめ
いかがでしたか?
WordPressがどんなものか、
クエリの意味を理解すると、
どうしてこのコードが必要だったのか、理解できますね。
皆様の理解の一助になっていたら幸いです★