【WordPress】functions.phpでエラーを出さない書き方の基本と安全な編集手順

functions.php は WordPress テーマの中でもっとも触る機会が多く、同時にエラーを出しやすいファイルでもあります。
セミコロンの抜けや閉じタグの位置など、たった1つのミスでサイト全体が真っ白になることも珍しくありません。
この記事では、**functions.php を安全に編集するための「エラーを出さない書き方の基本」**を、初心者でも確実に身につくように丁寧に解説します。
テーマカスタマイズをこれから始める方も、すでに触れている方も、この記事を読みながら手順通りに進めれば安心して作業できます。
Contents
1. そもそも functions.php とは?
functions.php は、テーマが読み込まれるたびに実行される「テーマ専用の機能ファイル」です。
テーマごとに1つ用意されており、主に以下のようなカスタマイズを担います。
- CSS・JavaScript の読み込み
- アイキャッチ画像やメニューなどのテーマ機能の追加
- 管理画面のカスタマイズ
- ショートコードの追加
- 条件分岐を使った制御
💡本格的にカスタマイズするなら、親テーマではなく
子テーマの functions.php を使うのが安全です。
→ 子テーマの作り方とfunctions.phpを安全に編集する手順
2. エラーを出さないための大原則
functions.php はほんの1文字のミスでもサイトが落ちます。
まずは共通ルールを押さえましょう。
2-1. 「少し書いて、すぐ動作確認」を徹底する
大量にコピペ → まとめて保存 は危険です。
- 数行だけ追加する
- 保存する
- フロントと管理画面で動作確認
- 問題なければ続きのコードを書く
この繰り返しで事故率が劇的に下がります。
2-2. PHPの基本構文を確実に守る
- 文末の
;を忘れない {と}、(と)は正しく閉じる'と"の閉じ忘れに注意- 全角スペースを混入させない
<?php
// OK
function my_theme_setup() {
add_theme_support( 'post-thumbnails' );
add_theme_support( 'title-tag' );
}
add_action( 'after_setup_theme', 'my_theme_setup' );<?php
// NG:; が抜けている
function my_theme_setup() {
add_theme_support( 'post-thumbnails' )
add_theme_support( 'title-tag' );
}2-3. 文字コードは「UTF-8 / BOMなし」
エディタ側の設定が原因で
「ヘッダーを送信できません」エラーが出ることがあります。
- UTF-8
- BOMなし(UTF-8N)
で保存するのが必須です。
2-4. PHP閉じタグ ?> を書かない
WordPress公式推奨です。
閉じタグ後に余計な空白や改行が入るだけでエラーの原因になります。
2-5. 管理画面のテーマエディターは極力使わない
テーマエディターで functions.php を壊すと
管理画面ごと真っ白 → 何もできない
という最悪パターンに。
編集は必ず
- FTP
- またはローカル環境
で行うのが安全です。
→ WordPressテーマカスタマイズの基本と安全な作業手順
3. よくある致命的エラーと対処法
▼ functions.php のエラー一覧表
| エラーの種類 | よくある原因 | 対処のポイント |
| Syntax error(構文エラー) | セミコロン抜け、カッコの閉じ忘れ、クォートの閉じ忘れ | 行番号付近を確認し、「;」「{」「}」「’」「\”」の閉じ忘れを修正する |
| Call to undefined function | 存在しない関数の呼び出し、フックのタイミング違い | 関数が定義されているか、読み込み順やフックのタイミングを確認する |
| Cannot redeclare function | 同じ名前の関数を複数回定義している | function_exists() で二重定義を防ぐ、関数名をユニークにする |
| Headers already sent | PHP閉じタグの後の空白・改行、BOM付きファイル | 閉じタグを削除し、UTF-8 / BOMなしで保存し直す |
| White screen of death(真っ白画面) | 致命的エラーの非表示状態 | FTPでfunctions.phpを戻す or WP_DEBUGを有効化して原因を特定する |
4. 安全に書くための基本パターン
4-1. 必ず「関数+フック」で書く
処理をいきなり書くのではなく、
関数化 → フック登録がWordPressの基本です。
<?php
function yagi_enqueue_scripts() {
wp_enqueue_style( 'yagi-style', get_stylesheet_uri(), array(), '1.0.0' );
wp_enqueue_script( 'yagi-js', get_template_directory_uri() . '/assets/js/script.js', array(), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'yagi_enqueue_scripts' );4-2. function_exists() で二重定義を防ぐ
同名関数がすでにあった場合のエラー防止に必須。
<?php
if ( ! function_exists( 'yagi_custom_excerpt_length' ) ) {
function yagi_custom_excerpt_length( $length ) {
return 80;
}
}
add_filter( 'excerpt_length', 'yagi_custom_excerpt_length' );4-3. 条件分岐を書くときの注意点
- 条件式はなるべく1行にまとめる
- 意味が似ている処理は関数にまとめる
<?php
function yagi_example() {
if ( is_single() && ! is_user_logged_in() ) {
// ログインしていないユーザーだけに表示させる処理
}
}
add_action( 'wp', 'yagi_example' );→ functions.phpに条件分岐を書くときの注意点
→ is_user_logged_in()の使い方
5. 権限チェック・セキュリティ系は特に慎重に
5-1. current_user_can() を必ず使う
管理画面カスタマイズは権限を確認しないと危険。
<?php
function yagi_admin_customize() {
if ( ! current_user_can( 'manage_options' ) ) {
remove_menu_page( 'tools.php' );
}
}
add_action( 'admin_menu', 'yagi_admin_customize', 99 );→ current_user_can()の使い方
5-2. セキュリティは基本的にプラグインで行う
functions.phpで自作するより、
AIOSなどのセキュリティプラグインの方が安全です。
→ ログイン試行回数をAIOSで制限する方法
→ AIOSファイアウォール設定
6. 事故ったときの復旧手順
6-1. 真っ白画面になった場合
- FTPでテーマフォルダへ接続
- functions.php をリネーム(例:
functions-broken.php) - WordPressが自動で動作するテーマに切り替わる
- バックアップと差し替え or 問題箇所を修正して再アップロード
6-2. WP_DEBUG でエラー内容を確認
<?php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );wp-content/debug.log にエラーが出力されます。
7. 最終チェックリスト
| チェック項目 | 確認内容 |
| 構文エラーはないか | セミコロンやカッコの閉じ忘れがないかWP_DEBUGで確認した |
| 文字コードは正しいか | UTF-8 / BOMなしで保存されている |
| 閉じタグを削除したか | ファイル末尾に「?>」がない |
| 関数名はユニークか | 接頭辞を付け、function_exists() を使っている |
| 条件分岐の整理は十分か | ネストが深くなりすぎていない |
| 権限チェックは適切か | current_user_can() を使っている |
| バックアップはあるか | 編集前のfunctions.phpを保存している |
まとめ
- functions.php はテーマの心臓部
- 1文字のミスでサイト全体に影響する
- 「少し書く→確認」の徹底で事故率が大幅に下がる
- 関数+フック+権限チェックが基本
- セキュリティ系はプラグインに任せる
- 失敗しても WP_DEBUG と FTP で確実に復旧できる

