URL階層
WordPressでは組み込みの投稿タイプ「投稿」、および組み込みのタクソノミー「カテゴリー」「タグ」がカスタム投稿タイプとカスタムタクソノミーの標準の挙動と異なります。
本プロジェクトではそれらをなるべく他のカスタムポストタイプやカスタムタクソノミーと同様に扱えるようにカスタマイズしていますが、一部開発者の間で強制しておきたい制約がございます。
パーマリンク設定の一部機能の停止
「設定」の「パーマリンク設定」の一部の機能を使用不可に設定しています。
- 共通設定:投稿名
- オプション:カテゴリーベース:(空)
- オプション:タグベース:(空)
これはURL階層の設定箇所を一元化するためであり、本プロジェクトではユーザーがこれらの設定値を書き換えても反映されないよう挙動を強制しています。
日付アーカイブを利用しない
WordPressの日付アーカイブは下記のような形式で日付別の投稿(投稿タイプの「post」)の一覧ページを表示する機能です。
https://example.com/<Y>/<m>/<d>/
この日付アーカイブをカスタム投稿タイプに適用したり、URLを以下のように変更することは理論的には可能です。
date_rewrite_rules フィルターフックが提供されているため、それを利用すれば容易にURL構造を変更することができます。
https://example.com/投稿タイプ名/date/<Y>/<m>/<d>/
// たとえば、日付アーカイブのパーマリンク構造のプレフィックスに「date」をつける例
add_filter( 'date_rewrite_rules', function( $date_rewrite ) {
$new_date_rewrite = [];
foreach ( $date_rewrite as $key => $query ) {
$new_date_rewrite['date/' . $key] = $query;
}
return $new_date_rewrite;
} );
ただし、URLを出力する際に問題が生じます。
wp_get_archives関数を利用してカスタム投稿タイプ「hoge」の日付アーカイブを出力する場合、標準では以下のようになります。
https://example.com/<Y>/<m>/<d>/?post-type=hoge
この実装はWordPress 5.9では以下のようになっており、クエリ文字列を追加するような実装になっています。
// wp-includes/general-template.php 2059行目
$url = get_month_link( $result->year, $result->month );
if ( 'post' !== $parsed_args['post_type'] ) {
$url = add_query_arg( 'post_type', $parsed_args['post_type'], $url );
}
これだけでも実装が困難であることがわかりますが、この関数内の各リンクの出力についても課題があり、たとえば月別アーカイブは get_month_link() 関数を使用して出力しています。
この関数は month_link フィルターによって出力するURLの加工が可能ですが、この関数の第一引数が home_url() 関数で整形された後の結果を取ること、また post_type を引数として提供していません。
この挙動を修正する場合、リライトルールや関連する標準関数の整備が膨大であり、現状では対応を見送ることにしています。
そのため、日付アーカイブは基本的に使用していない方針としています。
トップページの設定
WordPressでは「設定」の「表示設定」→「ホームページの表示」より、そのサイトのトップページを固定ページとして指定するかどうかを設定することができます。
これは一般的にはとても柔軟ですばらしい機能ですが、本プロジェクトに関しては「ホームページの表示」は以下の内容で固定するようにしています。
- ホームページの表示:固定ページ
- ホームページ:(任意の固定ページ)
- 投稿ページ:未選択
理由としては、CMS機能を共通化するにあたって、条件分岐タグを簡素化するためです。
たとえば「ホームページの表示」の条件によって、トップページであることを判断するために以下のように条件分岐タグを使い分ける必要があります。
if ( is_front_page() && is_home() ) {
// 「ホームページの表示:最新の投稿」の場合
} elseif ( is_front_page() && !is_home() ) {
// 「ホームページの表示:固定ページ」「ホームページ:(任意の固定ページ)」の場合
} elseif ( !is_front_page() && is_home() ) {
// 「ホームページの表示:固定ページ」「ホームページ:未選択」の場合
}
また投稿の一覧ページは以下のようになります。
if ( is_front_page() && is_home() ) {
// 「ホームページの表示:最新の投稿」の場合(トップページと投稿一覧ページは同じページになる)
} elseif ( !is_front_page() && is_home() ) {
// 「ホームページの表示:固定ページ」「投稿ページ:(任意の固定ページ)」の場合
} else {
// 「ホームページの表示:固定ページ」「投稿ページ:未選択」の場合はトップページと同じページとなる
}
これを簡素化することで、本プロジェクトの目的をいち早く達成できるように努めています。
編集可能ページ
上述の「トップページの設定」と内容が重複しますが、CMSでは内容が自動的に挿入されるべきページと、ユーザー自身が入力したコンテンツを表示するべきページの2種類があります。
本プロジェクトでは投稿タイプアーカイブとタクソノミーアーカイブ、search.phpで表示されるような検索結果アーカイブやdate.phpで表示されるような日付アーカイブなどの一覧ページと404ページは内容が自動的に挿入されるべきページとし、それ以外のページはユーザー自身が入力したコンテンツを表示するべきページ(※)としています。
※ ただしテンプレートにはそのテーマ固有のHTMLが記載されているため(たとえばヒーローイメージなど)、完全にすべてがユーザーが入力したものにはならない
テンプレートについて
本プロジェクトで作成するWordPressテーマに標準で用意するテンプレート直下のファイルは以下になります。
※ 現在コアで開発中のFSE(Full Site Editor)の動きで大きな変動がある可能性が高いです
- front_page.php(トップページ用)
- singular.php(固定ページ、および投稿ページなどの個別ページ用)
- archive.php(投稿タイプアーカイブ、およびタクソノミーアーカイブなどの一覧ページ用)
- 404.php(404ページ用)
- header.php(ヘッダーコンポーネント)
- footer.php(フッターコンポーネント)
- search.php(検索ページ用)
- attachment.php(メディアページ用)
- functions.php、index.php、style.css、screenshot.pngなどの必須ファイル
- (必要であれば)embed.php
ひとつのタームにつき、ひとつのURL
デフォルトではそうなっているが、例外もある。
例えばタクソノミーは複数の投稿タイプに設定できる。
本プロジェクトの制約により、タームアーカイブのURLには投稿タイプのスラッグがつくため、それぞれのタームは紐付けされた投稿タイプごとに増えていくことになる(WordPressデフォルトの挙動ではタームには投稿タイプのスラッグがつかないため考慮しなくてもよい)。
そのため、タクソノミーにはひとつの投稿タイプしか紐付けできないようにしている。