bluditでブログをひとつ下の階層に分けたいとき

Posted by nogajun - 2022/02/27

今、bluditのテーマを作っています。

bluditのサイト構成は、トップページがあって、その下に各記事がぶら下がるのが通常構成です。例外はタグとカテゴリでこれは(設定を変更しなければ)tagとcategoryの下に記事がぶら下がります。こんな感じです。

    トップページ
    │ └ ブログ各記事
    ├ /category/
    │ └ カテゴリ別の記事
    └ /tag/
     └ タグ別の記事

ですが、下のようにblogだけを独立した階層にしたい場合があります。たとえば、企業ページで随時更新するニュースをblogに割り当てたい場合などです。

    トップページ
    ├ /blog/
    │ └ ブログ各記事
    ├ /category/
    │ └ カテゴリ別の記事
    └ /tag/
        └ タグ別の記事

bluditの[設定] >[ 一般]にある「高度な設定」から特定のページをトップページに割り当てられるので静的ページをトップページに指定すれば、この形は簡単にできます。しかし、問題はトップページが通常ページになってしまうことです。

これをどうやったら分けられるのか考えていましたが、答えはものすごく簡単。テーマ内のホームとページのファイル読み込みの判定をするときに合わせてスラッグ名も判定して切り替えればOKです。(残念ですが設定だけではできません)

テーマで自分が今、どこのページを見ているか調べるには変数$WHERE_AM_Iを使います。

$WHERE_AM_Iは、トップページを見ているときは「home」、通常ページを見ているときは「page」を返すので、いつもはこれでデザイン(PHPファイル)の振り分けます。ですが、トップページにページを割り当てると両方とも「page」が返ってきます(このとき、割り当てられたblogにアクセスすると「blog」が返ってきます)。

トップページも通常ページもどちらも「page」なので困ってましたが、$page->slug()でスラッグ名も調べられるので、スラッグ名「home」をトップページにしたなら、$WHERE_AM_Ipage$page->slug()homeだったらトップページのファイルを読み込めばいいということです。こんな感じです。

if ($WHERE_AM_I == 'blog'):
  include(THEME_DIR_PHP.'blog.php');
elseif($WHERE_AM_I == 'page' && $page->slug() != 'home'):
  include(THEME_DIR_PHP.'page.php');
else:
  include(THEME_DIR_PHP.'home.php');
endif;

解決すれば拍子抜けだけど、頭の中で「調べるのは$WHERE_AM_I」で固まってたので気がつくのに時間がかかってしまった。

ちなみに、通常ページ、固定ページ、静的ページなどのページの属性は、$page->type()で調べられるので、厳密に調べるなら合わせてチェックするといいと思います。