ワードプレスでカスタマイズする場合、functions.phpに新たに関数を追加することがありますが、この追加するコードが長くなったり複数追加する時、以下のようにしたい場合がありますね。
- functions.phpが見づらい!なんとかしたい
- 追加するものを分けて見やすくしたい!
ということで、ここでは functions.php のファイルを分けて外部ファイルとして追加する方法、その違いや使い分けをご紹介したいと思います。
Contents
外部ファイルの読み込み方
functions.php を別ファイルに分けるのは非常に簡単で以下の2手順のみ。
- 手順1)追加コードを外部ファイルとして別ファイルに保存
- 手順2)functions.php にその外部ファイルの読み込みコード記述をする
たとえば以下のように functions.php と同じ階層に
外部ファイル(例:functions-test1.php)を置いたとした場合。
テーマのフォルダー
├ images
├ css
├ plugins
├ single.php
├ index.php
├ functions.php
├ function-test1.php
├ ・・・・
この functions-test1.php を functions.php 内で読み込むには
以下のように、include, require, get_template_part を使った記述の仕方がありますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 1-1)include を使う場合 include( 'function-test1.php' ); // 1-2)include_once を使う場合 include_once( 'function-test1.php' ); // 2-1)require を使う場合 require( 'function-test1.php' ); // 2-2)require_once を使う場合 require_once( 'function-test1.php' ); // 3)get_template_part を使う場合 get_template_part( 'function-test1' ); |
(※ get_template_part では、拡張子はなしで指定)
また以下のように、分けたファイルを別のフォルダにまとめたい、という場合。
テーマのフォルダー
├ images
├ css
├ plugins
├ my-func
├ function-test1.php
├ function-test2.php
└ function-test3.php
├ single.php
├ index.php
├ functions.php
├ ・・・・
functions.php と同じ階層に「my-func」というフォルダーを作り、
その中に追加の外部ファイルをまとめておく、といった例。
この場合には先ほど見たコードは、単に「my-func/」を付ければよいですね。
1 2 3 |
include( 'my-func/function-test1.php' ); include( 'my-func/function-test2.php' ); include( 'my-func/function-test3.php' ); |
これは include の例ですが、 require でもその他の場合も同じようにすればOK。
1 2 3 |
require( 'my-func/function-test1.php' ); require( 'my-func/function-test2.php' ); require( 'my-func/function-test3.php' ); |
1 2 3 |
get_template_part( 'my-func/function-test1' ); get_template_part( 'my-func/function-test2' ); get_template_part( 'my-func/function-test3' ); |
(※ get_template_part では「拡張子はなしで指定」に注意)
違いや使い分けの早見表
外部ファイルを読み込むには、
include, include_once, require, require_once, get_template_part と
5つの方法が出てきて混乱しそう。
(というか、私は大いに混乱しました笑)
どういった使用ケースではどれを使うのが良さそうかまずまとめてみると、
以下のようになるでしょうか。
使用ケース | 使い分け |
単に独自関数を追加したい | ・ファイル指定に問題ある場合も動作は続行したい ⇒ include_once ・ファイル指定に問題ある場合は中断したい ⇒ require_once ・ファイル指定に問題があっても気にしたくない ⇒ get_template_part |
1連のプログラムの中の1部を 外部ファイルに分けたい |
・ファイル指定に問題ある場合も続行したい ⇒ include ・ファイル指定に問題ある場合は中断したい ⇒ require |
私のように、独自関数を作る場合も一人でやってるよ、という場合には、
何か問題があればすぐわかるように、include_once か require_once を使っておけば良さそうです。
ただテスト環境以外での開発、他の人に配布をする想定のテーマやプラグイン開発では、動作が中断するとサイト運営者が何もできなくなるので include または include_once、 get_template_part を使っておくのが良さそうです。
さらに詳しくは以下。
include, require, get_template_part の違いと使い分け
include, require, get_template_part の違いや使い分けを見ておきましょう。
(include_once, require_once はひとまず横に置いておく)
一番の違いは、単に場所が少し移動した、となるか、全然別物となるかどうか。
プログラムを町に例えると、以下のようなイメージ。
- include / require:
町の一部が少し横にズレただけ。
道は今まで通りつながっていて日々の日常には何も変化なし。 - get_template_part:
道はつながっているけど、全然別の町として独立してしまった。
- ① 元のコード:
- 変数 $a の初期値を 0。
- 1を足してるので最後の echo では「 a = 1」が表示される
- ② 一部をfunc1.phpと別ファイルにして include:
- 見かけは変わったけど、実態は元のコード①と同じ。
- 変数 $a も何事もなかったかのように func1.php の中で 1が足されて、
最後の echo では①同様「 a = 1」が表示される
- ③ 一部をfunc1.phpと別ファイルにして get_template_part:
- 見かけも変われば、あなたの町とはおさらばよ。
私は私で独立するもんね。 - 元のコードにある $a と、func1.php 内の $a は別物扱い。
(元の町では a は人物を指し、独立した町では a と言えばリンゴを指す、みたいな感じ。func1.php の中で改めて初期値とか決めないと、そんな変数知らないよ、とエラーが表示されるのだ) - 別ファイルにした箇所はなきものとされるので、最後の echo では
「a = 0」と表示される
- 見かけも変われば、あなたの町とはおさらばよ。
これらの違いから考えられる使い分けは以下のようになりそうです。
別ファイルの読み込み | 使い分け |
1)include / require | 前後と何か関連していて、その場に追加したい場合 |
2)get_template_part | 前後の流れとは独立していて、何かを追加したい場合 |
include, require は、前後と関係しない場合にももちろん使えるので、
単に自作の関数を追加する場合には、どれを使っても良いことになりますね。
指定ファイルに対する違い
その他の違いをまとめると以下の通り。
外部ファイル読み込み | 指定ファイルがない場合 |
include | エラー表示:処理は続行 |
require | エラー表示:処理は中断 |
get_template_part | エラー表示なし:処理は続行 |
独自関数を作成する、追加するという場合では、以下のように使い分けすればよいでしょうか。
- ファイル指定があってるか明確にしたい、問題があっても継続したい:
指定が間違ってても途中で処理が中断すると他の部分を見るのに支障が出るから、
処理は継続してね
⇒ include - ファイル指定があってるか明確にしたい、問題があったら中断したい:
指定が間違ってたらそこを明らかにしたいのでその時点で処理を中断したい
⇒ require - ファイルの削除とかするし、追加予定のファイルを先に指定しておきたい:
(ので、ファイルが見つからなくても何事もなく処理進めてね)
⇒ get_template_part
独自関数の作成では、
指定したつもりのファイルがそもそも読み込まれてなかったりして、
何が悪いのか全然わからなかった、なんてことにならないよう、
include か require か、どちらかにしておくと良さそう。
テスト環境以外での開発や、テーマ、プラグイン開発では、動作が中断するとサイト運営者が何もできなくなるので、include、get_template_part が良さそうです。
includeとinclude_once、requireとrequire_once の違い
「_once」がついてる場合には、外部ファイルは最初の1度だけ読み込まれ、
単に「include」「require」の場合には、呼ばれれば何度でも読み込まれます。
※)「get_template_part」も呼ばれれば何度でも外部ファイルを読み込みます
独自の関数を追加するだけなら1度呼ばれればそれで十分ですし、意図せず複数回読み込まれると変に何かが再定義されるなんてこともあるかもしれないので、_once をつけて、include_once, または require_once で読み込むのが良さそう。
上の方で見たように前後に関係する場合(一連のプログラムの中身を部分的に外部ファイルにする場合)には、単に「include」「require」でなくてはダメなケースもあるので、そこは注意して使い分けを考えましょう。
たとえばループ処理の中身を別ファイルにする、なんて場合には、
include_once にしてたら変数の値がなぜか変わらない、なってことにもなるので、そこは普通に include になるでしょうし、前後に関係せず独立して何度も呼び出したいなら、get_template_part を使っても良いですね。
今回のポイント
functions.phpを別ファイルに分けるポイントは、
- 関数の一部を別ファイルにするなら include か require
- 関数を単に追加するなら、include_once か require_once、または、get_template_part
- テスト環境以外では、include, include_once、または get_template_part
色々カスタマイズで関数を追加しだすと、いつの間にか functions.php の内容も長くなり、どこに何が書いてあるのかがとても分かりづらくてイライラする!何て場合も出て来るかと思います(私がそうです(笑))
私のような日曜プログラマーなどは、勘違いやうっかりミスなどが連発するもので、そうなると、余計に「この関数だけ別のファイルにしてそれだけ修正対象にしたい」といったこともありがち。
関数が長くなったら、分かりやすく区切って別ファイルにしたりして管理していくと、後々が楽にもなりますね。
また、ブログで収益をあげたいがどうすれば良いか分からない、ネットビジネスの収入の増やし方を筋道を立てて学びたい、などあれば、是非以下のメルマガにも登録してみてくださいね。