Wordpressの記事投稿一覧ページURLをカスタマイズする
Wordpressの記事一覧は初期設定で無効になっており、index.phpが表示レイアウトとして採用されるルールです。
functions.phpで設定を有効にするとarchive.phpやcategory.phpが採用され、逆にindex.phpは採用されなくなります。
記事一覧URLはfunctions.phpでスラッグ名を設定でき、カテゴリ一覧URLはcategory/を省略すればスラッグ名のみが採用され、まとまります。
自作テーマにおける投稿一覧ページのカスタマイズ
本記事はWordpressテーマを自作している管理者向けの解説です。
例えば企業サイトをWordpressの自作テーマで構築する場合、TOPページはテーマファイル内の「index.php」が担当しますよね。
header.phpやfooter.phpの読込と共に、TOPページ向けのHTMLソースがindex.phpに直接入ります。
投稿記事の一覧ページURLを作る
index.php内で新着情報の一覧は表示しますが、大体は最新10件などに限定する事でしょう。
その上でTOPページとは別に、投稿記事一覧のページURLを準備する事になります。
本記事では、自作テーマで投稿記事一覧ページURLを作成・カスタマイズする方法についてご紹介します。
記事のパーマリンク
パーマリンク設定はカテゴリに分ける事を想定し「カスタム構造」が選択されている事を前提にします。
https://ドメイン名/%category%/%postname%/
URL上、まずカテゴリ名が最初に来てそのあとに投稿名が来る、一番理想的な形だと思います。
index.phpによる一覧表示
Wordpressの初期設定では「投稿」記事一覧の表示ページとしてTOPページが採用される様になっています。
つまり記事一覧の対象ページとして、基本index.phpが使われるのですね。
普段index.php上で何気なく投稿記事出力コードを書いてるので、いざその様に言われてもピンとこないかも知れません。
これは投稿記事に「カテゴリ」を設定していると、顕著にわかります。
カテゴリ名の入った一覧URL
投稿記事にカテゴリ分類がある場合、カテゴリ名とセットで「スラッグ名」も登録しているはずです。
スラッグ名は必ず「英単語」にしておく必要があります。
カテゴリ別の記事URL
Wordpressでは記事にカテゴリを付与している場合、その「スラッグ名」がURLに付くアドレスが生まれます。
つまり以下の様なURLでも、記事一覧が表示される訳です。
https://ドメイン名/category/business/
https://ドメイン名/category/movie/
https://ドメイン名/category/anime/
カテゴリ別URLにもindex.phpが使われる
この生成されたURLに使われるのは、やはりindex.phpとなります。
仮にindex.php内に記事出力部分が全くなくても、TOPページのレイアウトが表示されているはずです。
投稿記事を出力するコードの有無にかかわらず、ルール上index.phpが使われる事になります。
これがWordpressの初期設定が働いている事の証です。
カテゴリ別には分類されない
さらにもしindex.phpに記事出力コードがあっても、常に全ての記事が表示されます。
https://ドメイン名/category/business/…全記事
https://ドメイン名/category/movie/…全記事
https://ドメイン名/category/anime/…全記事
businessのURLでもmovieのURLでも、記事は全て出力されてしまうのです。
index.phpには、記事をカテゴリ別に分ける基本機能は無いのですね。
記事専用のURL・カテゴリ別URLを作るには、index.phpに頼らずにいく必要があります。
archive.phpファイルの追加
ここまで、index.php以外で記事一覧専用のURLページが必要になる事はわかりました。
本来、記事一覧を表示する専用のテーマファイルは「archive.php」です。
しかしWordpressの初期設定では、投稿記事一覧(アーカイブ)設定は無効になっています。
では実際に無効になっている事を確認してみましょう。
archive.phpを用意
では以下の一般的な投稿記事出力コードを、archive.phpに入れてみましょう。
レイアウト部分はindex.phpとは違う様にしておくとわかりやすいです。
ソース例(wp_queryの場合)
<?php query_posts("posts_per_page=30"); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> //ここに出力コードが入ります。 <?php endwhile; endif; ?>
ここでは記事のジャンルは問わず、全ての記事を出力しています。
ではこのachive.phpをテーマファイル上にアップしておきましょう。
archive.phpは無効のまま
ここでふと「記事一覧のURLは何になるのだろう」と疑問に思うのではないでしょうか。
実は「https://ドメイン名/archive/」と入力しても、記事一覧は表示されません。
URLが存在しないので「ページが見つかりません」と表示される訳です。(或いは404エラーページ)
先程のカテゴリスラッグ名のURLも、依然としてindex.phpが採用された状態であり、archive.phpは役に立っていません。
これで投稿記事一覧の設定が無効になっている事がわかったと思います。
全記事一覧(カテゴリ分別なし)ページを作る
ここまで、archive.phpをアップしただけでは表示されない事がわかりましたね。
index.phpに頼らずに、きちんとarchive.phpに担当させる必要があります。
functions.phpで有効にする
ではWordpressの投稿記事アーカイブページの設定を「有効」にする方法を紹介しましょう。
以下コードを「functions.php」に記述していきます。
functions.php追記
function post_has_archive( $args, $post_type ) { if ( 'post' == $post_type ) { $args['rewrite'] = true; $args['has_archive'] = 'blog'; //任意のスラッグ名 } return $args; } add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );
上記のスラッグ名部分がURLのサブディレクトリ名に相当します。ここで記事一覧用のURLを決める事になります。
この設定により、https://ドメイン名/blog/など専用のURLを生成する事ができる訳です。
記述後に管理画面の「設定」→「パーマリンク設定」→「変更を保存」をクリックすることで反映されます。
※このパーマリンクの更新は毎回必ず行いましょう。
表示結果
以下のURLで一覧が表示されるかどうかを確認してみます。
https://ドメイン名/blog/
無事に違うレイアウトで記事の一覧が表示されていると思います。
使われているのはもちろんarchive.phpです。
これでやっと、archive.phpが投稿記事一覧ページとして採用された事になりますね。
index.phpの表示がされなくなる
逆に先程index.phpで表示されていた以下のURLは、いずれも存在しなくなります。
https://ドメイン名/category/business/
https://ドメイン名/category/movie/
https://ドメイン名/category/anime/
上記URLは存在しなくなりますが、index.phpで投稿一覧を出力する事はできます。
これでindex.phpが正式に、記事一覧表示の対象ファイルから外れた事になります。
記事のカテゴリ別一覧ページを作る
これを受けてindex.phpで表示できなくなったカテゴリ別のURLは、別のファイルが担当する必要があります。
それが「category.php」です。
category.phpファイルの作成
カテゴリ別の投稿記事を表示するためには、category.phpファイルを使います。
試しに、archive.phpと全く同じようにソースを入れてみましょう。
category.phpソース例(archive.phpと全く同じ)
<?php query_posts("posts_per_page=30"); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> //ここに出力コードが入ります。 <?php endwhile; endif; ?>
カテゴリ一覧の表示
このcategory.phpをUPするだけで、先程のカテゴリ別URLの表示が復活します。
https://ドメイン名/category/business/
https://ドメイン名/category/movie/
https://ドメイン名/category/anime/
しかもbusinessならbusinessの記事のみ、movieならmovieの記事のみがURLごとに並びます。
記事の出力自体は同じなのに、ファイル名が違うだけでカテゴリが分類できている事になりますね。
category.phpでカテゴリ記事の一覧が表示できるようになりました。
重複URLができる
一つ注意頂きたいのは、投稿記事をカテゴリ別に分けた場合、以下のURLでも表示される事です。
https://ドメイン名/business/
https://ドメイン名/movie/
https://ドメイン名/anime/
category/の表記が無いURLですね。
このcategory/は、あっても無くても同じように記事が表示されます。
Wordpress側で簡単に統一可能
しかしこのままにしておくとGoogleから「重複URL」とみなされる可能性があり、SEO的にも良くありません。
category/が付くURLの方は、category/がつかない方に統一できます。
これはWordpressのパーマリンク設定ページ下の方にある「カテゴリベース」の欄に「.」を入れるだけで解消します。
階層構造が整備される
URLからcategory/を消しておく事は、実はきちんとメリットがあります。
冒頭部分で、詳細ページのパーマリンクを以下の様にしていると説明しましたね。
https://ドメイン名/%category%/%postname%/
詳細記事のURLは、カテゴリのディレクトリ名のうしろに投稿記事のpostnameが来ます。
・https://ドメイン名/business/…仕事カテゴリ一覧
・https://ドメイン名/business/postname…仕事関連記事の詳細
指定ディレクトリ内に記事が収まるため、URL構造がピラミッド型に収まります。
まとめ
Wordpressの初期設定のON・OFFによる、担当ファイルの違いをまとめてみました。
ファイル名 | 設定OFF | 設定ON |
---|---|---|
記事一覧 | index.phpが担当 | archive.phpが担当 index.phpは担当しない |
カテゴリ別一覧 | index.phpが担当 | category.phpが担当 index.phpは担当しない |
上記の「担当」とは、記事の出力コードがある・ないに関わらず、強制的に採用される事を意味しています。
例えばachive.phpに記事出力のコード部分が全く無かったとしましょう。
それでもfunctions.phpの設定を有効にしていれば、記事の一覧URLには強引にachive.phpが表示されるのです。
条件:投稿の表示設定が「最新の投稿」の場合
今回紹介した設定は全て、Wordpressの表示設定欄が「最新の投稿」になっている場合です。
ここで「固定ページ」が選択されている場合は、archive.phpは使われません。
固定ページのテンプレートである「page.php」で、記事一覧が表示される事になります。
固定ページ内に記事一覧を表示する
まずは何も入っていない固定ページを一つ作成して、パーマリンクをきちんと設定しておきます。
その上でその固定ページ名をWordpressの表示設定欄で選ぶだけです。
ただこの場合、固定ページのpage.phpを記事でも使い回す事になりますよね。
記事一覧はオリジナルレイアウトにしたい事もあるでしょうから、achive.phpを使った方が良いと思います。