Mimizuku Advent Calendar 2日目の記事です。石川さんの WordPress Theme Lightning & BizVektor 他 Advent Calendar 2016 が少しずつ埋まっているようで羨ましいです!
SaCSS Special08 : WordPress + フロントエンド 鍋パーティー にお声がけしてもらいまして、今日は札幌で書いています。長崎はまだ冷えるなーくらいですが、札幌思った以上に冷たくてビビりました…
ということで本題。
レイアウトファイルとビューファイル
Mimizuku の大きな特徴の1つとして、single.php
、page.php
などのページテンプレートがコントローラーになっており、レイアウトファイルとビューファイルを指定してレンダリングされている、というものがあります。一般的な WordPress テーマのコーディング作法だとページテンプレートは次のような感じが多いかと思います。
<?php get_header(); ?> コンテンツ <?php get_sidebar(); get_footer();
僕もこういう風にやっていたのですが、これには2つ問題があると思っています。
header.php、footer.php の肥大化
上記のようなテンプレートの構成にすると、「ヘッダーだからheader.php
に書く」「フッターだからfooter.php
に書く」というよりは「3つに分割したときにここはメインじゃないからheader.php
に書く」みたいな感じになりがちだと思うんですよね。一見するとメインテンプレートはシンプルですが、header.php
やfooter.php
はどんどん肥大化していき中身はif
だらけになって意味不明みたいな。なので僕は多少ページテンプレート間で重複があるにしても次のように書くことが多いです。
<!DOCTYPE html> <html <?php language_attributes(); ?>> <body <?php body_class(); ?>> <?php get_header(); ?> <div> <main> コンテンツ </main> <?php get_sidebar(); ?> </div> <?php get_footer(); ?> <?php wp_footer(); ?> </body> </html>
header.php
の中は<header />
のみ、footer.php
の中は<footer />
のみ、という感じです。
ページテンプレート間の重複
そうするとやはりページテンプレート間で重複が発生するのでページテンプレートの数が多くなってくると「何回同じHTML登場するんや…」という感情が強くなってきてしまいます。ただ重複しているだけでそのまま納品して、以降一切更新が無いのであればまぁ良いですが、途中で重複部分にレイアウトの修正が入ったりすると全てのページテンプレートに修正を入れなければいけなくなります。超めんどくさい!
レイアウトファイルとビューファイルを作ろう
ではどうするかと考えまして、Mimizuku では、ページテンプレートには HTML は書かずにコントローラー(という言い方が正しいかわかりませんが便宜上…)として使うことにして、そこでレイアウトファイルとビューファイルを指定してレンダリングさせよう、ということにしました。レイアウトファイルは全体のレイアウトを定義したテンプレート、ビューファイルはそのメインテンプレートが出力するコンテンツ部分にあたるテンプレートです。
例えばsingular.php
はこんな感じです。
$controller = new \Mimizuku\App\Controllers\Controller(); $controller->layout( 'right-sidebar' ); $controller->render( 'content/content', get_post_type() );
そしてレイアウトファイルがこんな感じ(わかりやすくするため実際とはちょっと変えています)。
<!DOCTYPE html> <html <?php language_attributes(); ?>> <?php get_template_part( 'template-parts/head' ); ?> <body <?php body_class(); ?>> <div class="_l-container"> <?php get_header(); ?> <div class="_l-contents" role="document"> <main class="_l-main" role="main"> <?php $this->view(); ?> </main> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> </div> <?php wp_footer(); ?> </body> </html>
でビューファイルがこんな感じ。ビューファイルは一般的なcontent.php
と同じです。
<article <?php post_class(); ?>> <h1><?php the_title(); ?></h1> <?php the_content(); ?> </article>
こういう風にレイアウトファイル(とビューファイル)に切り出してしまえば、共通部分に修正が必要になったとしてもレイアウトファイル1つだけを修正すれば良いのです!素晴らしい!
ページテンプレートをコントローラーとして使うとなると、普通の見慣れた感じとはだいぶ違う見た目になってしまうためか、自慢しても結構引かれちゃったりするのですが、Mimizuku はあくまで親テーマ。実際につくるのは子テーマ。レイアウトファイルやビューファイルを呼び出す部分にフックが仕込んでありまして、functions.php
とかでフックして任意の条件でレイアウトファイルやビューファイルを差し替えることができます。つまり子テーマではコントローラー的なコードは一切書かなくても、ほとんどの場合なんとかなってしまうというわけです。上記に記載したレイアウトファイルやビューファイルのコードなら見慣れていますよね。うーん良いアイデアだと思うんですけどねぇ…どうでしょうか。
ということで次回は Mimizuku の基本設計について書きます(Adventar 「 Mimizuku の基本設計」と書いたものの、一体どんな内容を書くつもりだったか思い出せない…)。