WordPressをカスタマイズする時、もっともコードを追加したり、編集したりするのはfunctions.php
になるのではないでしょうか
ネット上の情報でも便利な機能を追加、拡張するために「functions.php
にこのコードを書きます。」という説明によく出会うと思います。
もちろん、それで実現したいことができるので間違いではありません。
しかし、そのままコードを追加していくと管理が難しくなります。
functions.phpに関数を増やすと管理が難しくなる?
WordPressの機能を拡張する方法には大きく分けて2つあります。
- プラグインを入れる
functions.php
にコードを書く
プラグイン
2つを比べると分かると思いますが、1つ目のプラグインを使う方法はとても管理がしやすいです。管理しやすさには以下の点があげられます。
- フォルダで管理されプラグインが何を行なう物か明白に分かれている
- FTPソフトや管理画面からも追加、停止、削除が簡単
- フィルターフックが用意されたプラグインは元のコードはそのままで機能拡張できる
functions.php
対するfunctions.php
で機能を拡張する方法は、まだWordPressのカスタマイズを始めたばかりの方ですと、フォルダやファイルを分けずに機能を追加する関数も全てfunctions.php
に書いてしまっていることと思います。
するとテンプレートファイルに比べてかなり肥大化したファイルになります。そうなると以下の問題ができ管理が難しくなります。
functions.php
を開くまで何が関数として機能が追加されているかわからない- あとから編集、修正を加える時、その箇所を探すのに時間がかかる
- 同じようなコードを書いてしまうかもしれない
- …
これを改善する、編集・修正・管理がしやすくfunctions.php
を書く方法を紹介します。
functions.php 管理方法
functions.php
に書いていたコードは機能ごとにグループ分けして、別のphpファイルを作ります。新しいフォルダを作り、作ったphpファイルを入れ、functions.php
にはそのファイルを読み込むコードを記述します。
すると以下のようなメリットがあります。
- ファイルを開かず新しく作成したフォルダを見ればどんな機能を追加したかわかる
- 編集時、グループ分けしたファイルから修正箇所をすぐ探せる
- 編集時、他のファイルを触らないので誤った入力が減る
- ファイルごとにグループ分けすることで同じようなコードを書くミスをなくす
- オフにしたい機能はfuncutions.phpでインクルードした箇所をコメントアウトするだけ
早速functions.php
を管理しやすい形にしていきましょう。手順は3ステップです。
- 分解するファイルを入れる新しいフォルダ作成
functions.php
を分解してphpファイルを作るfunctions.php
にファイルの読み込むコードを書く
分解するファイルを入れる新しいフォルダ作成
テーマフォルダにはテンプレートファイルが並んでいると思います。そこに一緒に関数を定義したファイルを並べるのは、見た目に関わるテンプレートファイルと区別が付きづらくなるので綺麗ではありません。
なので、別に新しいフォルダを作成しましょう。フォルダの名前は以下に私がベターだと思う候補を5つ上げておきます。
- functions
- library
- lib
- includes
- inc
私はGithubで人気のWordPress starter theme「roots」を参考にlibraryの短縮したlibと名前を付けています。WordPressテーマの「TwentyFourteen」はincにカスタムヘッダーやウィジェットなどをまとめていますね。
ここでは「lib」というフォルダを作成したと仮定して話を進めます。
functions.phpを分解してphpファイルを作る
functions.php
をグループに分解して、先ほど作成した「lib」フォルダに保存していきましょう。私の場合は、以下のファイルに分けています。
上記のようにfunctions.php
内を全てファイルに分けてlibフォルダに保存し、functions.php
内は空にしておきます。
functions.phpにファイルの読み込むコードを書く
functions.php
には分解したファイルを読み込むコードとそのファイルの説明を記述するだけにします。いわばプラグインの管理画面のようにさっと見て何が定義されているか分かる状態です。
以下は、functions.php
にファイルをインクルードしている例です。この記述は先ほどのフォルダ名の時と同じように「roots」を参考にしています。
<?php require_once locate_template('lib/init.php'); // 初期設定の関数 require_once locate_template('lib/cleanup.php'); // 不要なモノを削除する関数 require_once locate_template('lib/titles.php'); // タイトル出力の関数 require_once locate_template('lib/breadcrumbs.php'); // パンくずリストの関数 require_once locate_template('lib/scripts.php'); // CSSやJavascript関連の関数 require_once locate_template('lib/ads.php'); // 広告関連の関数 require_once locate_template('lib/widgets.php'); // サイドバー、ウィジェットの関数 require_once locate_template('lib/custom.php'); // その他カスタマイズの関数
上記のコード、実はrequire_once
を書かなくてもWordPressに用意された関数locate_template
だけでファイルの読み込みができます。
require_once と locate_template
まずは、require_once
とlocate_template
について簡単な説明をします。
- require_once
- ファイルがすでに読み込まれているかどうかを PHP がチェックし、読み込みます。すでに読み込まれている場合はそのファイルを読み込みません。
- locate_template
- locate_templateはテンプレートファイルがあるかチェックするWordPressの関数で、ファイルが見つかった場合はファイルのパス名を返します。見つからなかた場合は
''
を返します。
locate_template
にはパラメータが3つあります。
locate_template( $template_names, $load, $require_once );
locate_template
だけでfunctions.php
に読み込むコードは以下のように書くことができます。
<?php locate_template('lib/init.php', true); // 初期設定の関数 locate_template('lib/cleanup.php', true); // 不要なモノを削除する関数 locate_template('lib/titles.php', true); // タイトル出力の関数 locate_template('lib/breadcrumbs.php', true); // パンくずリストの関数 locate_template('lib/scripts.php', true); // CSSやJavascript関連の関数 locate_template('lib/ads.php', true); // 広告関連の関数 locate_template('lib/widgets.php', true); // サイドバー、ウィジェットの関数 locate_template('lib/custom.php', true); // その他カスタマイズの関数
なぜ、私がrequire_once
を書く方を採用しているか、それはコードを見た時に読み込んでいる必要なコードなんだな、というのが分かりやすいからです。locate_template
だけでは、その関数を知らないと何がtrue
なのか理解するまでに時間がかかるかもしれません。
locate_template
については以下のサイトも参考にしてみてください。
- Function Reference/locate template | WordPress Codex
- locate_template | WordPress私的マニュアル
- 【WordPressで特定のファイルを読み込む場合には「locate_template」をよく使っています】 | 今村だけがよくわかるブログ
まとめ
- テーマフォルダ内に
functions.php
を分解したファイルを入れるフォルダを作る functions.php
をグループに分け分解したファイルを作るfunctions.php
にはインクルードする記述を書く
あとがき
これでfunctions.php
が肥大化している方は少しは管理しやすくなるんじゃないでしょうか、参考になれば幸いです。また、もっといい管理方法があれば教えて下さい。
表示に関するテンプレートファイルの管理方法についてはこちらを参考にしてください。