皆さま引き続きコロナには気をつけてお過ごしください!

【WordPress】カスタム投稿をアーカイブ一覧に表示されるようにしてみた

アイキャッチカスタム投稿 WordPress


以前、投稿タイプを増やす方法や、

増やしたカスタム投稿を最近の投稿に表示する方法などをご紹介しました。

このサイトでは、サイドバーに最近の投稿と、アーカイブを表示していますが、

アーカイブから表示される一覧にはカスタム投稿が反映はんえいされていません💦

デフォルトの投稿タイプ分のみが表示されています。

 

今回は、アーカイブ一覧にカスタム投稿も表示されるようにしてみたいと思います。

 

スポンサーリンク

アーカイブページとは

WordPressでは、投稿を一覧化して表示するページのことをアーカイブページと言います。

条件を付けて表示することも可能で、ある特定の月だけ表示した場合を「月別アーカイブページ」と呼んだりします。

 

スポンサーリンク

編集対象ファイル

一覧表示をさせるには、どのファイルの編集が必要なのでしょうか?

 

一覧表示にカスタム投稿も含めるように設定するには、以下ファイルの編集が必要です。

functions.php

 

functions.phpとは

利用しているテーマ内で汎用的はんようてきに使われるコードを記載するファイルです。

このファイルに、投稿の表示に関する関数を記述します。

 

スポンサーリンク

アーカイブページをカスタマイズしよう

functions.phpの編集となるため、バックアップを取ってから、設定をしていきましょう。

 

functions.phpの編集手順

「Snippets」というプラグインを使って編集をします。

①Snippetsプラグインの「Add New」をクリックする。

snippets追加

②任意のタイトルをつけ、以下コードを記入する。

※カスタム投稿の投稿タイプスラッグ名の部分に、一覧表示させたいカスタム投稿で定義したスラッグ名を記入する。

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がどんなものか、

クエリの意味を理解すると、

どうしてこのコードが必要だったのか、理解できますね。

 

皆様の理解の一助になっていたら幸いです★

タイトルとURLをコピーしました