functions.phpを編集するときに気をつけること

2013年6月24日

先週金曜日(6月21日)にWordPressのバージョン3.5.2がリリースされましたね。
複数の脆弱性を修正するセキュリティアップグレードなので、早めにバージョンアップさせたほうが良さそうです。
Version 3.5.2 – WordPress Codex 日本語版

さて今日は、取り扱いには十分注意すること!と私も散々ビビらされたfunctions.phpについて書いていきます。

functions.phpの編集で気をつけること

header.phpなどの他のphpファイルと違い、子テーマでfunctions.phpを編集する場合は、親テーマの内容をコピペしたりはせず、カスタマイズする部分だけを書き足していきます。なのでファイルの中身が0の状態から始まって、自分の好みに合わせて修正する度にどんどん続きに書き足されていくわけですが、書き方を間違えるととんでもないことになったりするんですよね。
  • functions.phpファイルの中身が文字化けする
  • サイト画面が真っ白になる
  • 管理画面にログインできなくなる など
ちなみに私は経験済みです。サイト真っ白とか超焦ります。
真っ白というか、phpの構文エラーは出ているのだけどもそれを表示させない設定になっていることが多いので、画面では白く見えているだけなんですけど。

ファイルはローカルで編集する

WordPress管理画面の「テーマ編集」から直接style.cssやfunctions.phpなどのファイルを編集することができますが、書き換えに失敗してサイトが真っ白になり管理画面にすら入れなくなったら、管理画面から修正し直しはもちろんできません。
その場合はサーバーに直接ログインしてファイルを救出しないといけないので、FTPソフトでもターミナルでもいいですが、サーバーへのログイン情報は忘れないようにしておきましょう。
普段からローカルに置いたファイルをエディタで編集するようにしたほうが安全ですね。

UTF-8形式でファイル保存する

気がついたらShift JIS、なんてこともたまにあるのですが、ファイルはUTF-8(BOM無し)形式で保存しないとエラーの原因になります。ファイルの中の日本語も文字化けしちゃいますし。
BOM無し保存ができないWindowsの「メモ帳」などは使わないほうが良いです。
UTF-8(BOM無し)で保存ができるエディタはフリーウェアでも沢山あると思いますが、Windowsではサクラエディタ、MacだとCotEditorが個人的におすすめ。

改行やスペースに注意

不要なスペース挿入や改行は表示エラーを引き起こす原因になります。
どれが不要なのかというと、例えば↓

 
 
下の行に無駄に改行が入ってますね。こんな感じで、開始&終了タグの前後に改行が入ってしまうと正しく表示されないことがあります。ですのでこんなのもアウトです↓



 
6行目や12行目の空白行は消しましょう。
終了タグ「?>」で閉じなければ途中に空白を入れても大丈夫。

閉じなければ大丈夫、ということで終了タグ自体を書かなくしちゃったほうが安心だと思います。Twenty Twelveのデフォルトでも終了タグついてないですし。
/**
 * Binds JS handlers to make Theme Customizer preview reload changes asynchronously.
 *
 * @since Twenty Twelve 1.0
 */
function twentytwelve_customize_preview_js() {
        wp_enqueue_script( 'twentytwelve-customizer', get_template_directory_uri() . '/js/theme-customizer.js', array( 'customize-preview' ), '20120827', true );
}
add_action( 'customize_preview_init', 'twentytwelve_customize_preview_js' );
↑最後の行、「?>」がないけど問題なし。

バックアップは必ずとる

編集してアップロードしたら失敗しちゃった!でも上書き保存したからすぐに元に戻せない!
なんてことのないように、正常に動いている状態でのファイルはバックアップしておきます。エラーが出たらバックアップから元に戻せば大丈夫。

何でもかんでも書き足せばいいわけではない

話す順番が逆になってしまったかもしれませんが、通常子テーマを作成すると、まずは親テーマが読み込まれ、その上から子テーマの情報が上書きされます。
でもfunctions.phpの場合は別で、子テーマの内容が先に読み込まれます。

子テーマ→親テーマの順に読み込んだとき、同じ名前の関数があると、子テーマで編集しているにも関わらず親テーマの内容が反映されてしまったり、関数の再定義ができずにエラーを起こすことがあるそうです。
新規に関数を追加するのは問題ありませんが、すでに親テーマで定義されている関数を子テーマのfunctions.phpで編集するときには注意したほうが良さそう。
親テーマを直接編集してしまうのが1番楽な方法ではありますが、それでは親テーマがアップデートされたときにまた初期状態に戻ってしまうし。

function_exists()で条件分岐されていれば大丈夫

親テーマのfunctions.phpの9行目にこんなことが書かれています。
 * When using a child theme (see http://codex.wordpress.org/Theme_Development and
 * http://codex.wordpress.org/Child_Themes), you can override certain functions
 * (those wrapped in a function_exists() call) by defining them first in your child theme's
 * functions.php file. The child theme's functions.php file is included before the parent
 * theme's file, so the child theme functions would be used.
 *
 * Functions that are not pluggable (not wrapped in function_exists()) are instead attached
 * to a filter or action hook.
意訳: 親テーマの中で「function_exists()」でくくられている関数に関しては、子テーマでそれらを上書きして定義することができる。くくられていないものに関しては、フィルターフックやアクションフックをかけることで対応する。

ということは237行目とか
if ( ! function_exists( 'twentytwelve_content_nav' ) ) :
function ..... {
}
endif;
258行目とか
if ( ! function_exists( 'twentytwelve_comment' ) ) :
function ..... {
}
endif;
322行目とか
if ( ! function_exists( 'twentytwelve_entry_meta' ) ) :
function ..... {
}
endif;
この中にくくられているものに関しては子テーマで上書きできるので、編集したい部分をそのまま書き足すだけで大丈夫だけれども、それ以外の部分はadd_filterとかadd_actionとかで書き直さないといけないということですよね。
php超初心者のサトにはすぐに例が書けないので…フック、勉強します(,,-_-)

ここで一般論は書くべきではない、うちのサーバーを使って体験したことだけを書くべきだ、とシノブ氏に言われてしまったのでこのへんにしておきますが(爆)、他にも何か気付いたら書いていこうと思います。


——————–

先週末のSaaSes飲み会にて。名物の男の娘。