ManusのWordPressテーマ有効化前のエラー解消完全ガイド|関数の重複・PHPエラーを一つずつ潰す方法


はじめに

前回の記事ではManusを使ってWordPressテーマ一式をプロンプトで生成し、Localに配置するまでの手順を解説しました。今回はテーマを有効化する前に発生するエラーの解消方法を解説します。AIが生成したコードには関数の重複宣言・テンプレートの不整合・プラグインの依存関係など複数のエラーが含まれることがあります。「ライブプレビューでエラーを確認しながら一つずつ解消して、エラーが出なくなってから有効化する」という安全な手順を実践的に解説します。


1. なぜライブプレビューで先に確認するのか

1.1 有効化せずにライブプレビューで確認するメリット

WordPressのテーマには「有効化する前にプレビューで確認する」機能があります。管理画面「外観」→「テーマ」でサムネイルにマウスを乗せると「ライブプレビュー」ボタンが表示されます。

方法エラーが起きたとき
そのまま有効化するサイト全体が白画面になって管理画面にも入れなくなるリスクがある
ライブプレビューで確認してから有効化する現在のテーマは維持されたままプレビュー画面でエラーを確認できる

💡 AIが生成したコードは必ずライブプレビューで確認してから有効化しましょう: 本番環境で直接有効化すると白画面(WSoD:White Screen of Death)になった際に管理画面にアクセスできなくなり、FTPでファイルを修正する必要が生じます。Localであれば被害は限定的ですが、習慣として安全な手順を身につけておくことが大切です。


2. 今回発生したエラーの全体像

2.1 関数の重複宣言エラー(Cannot redeclare)

前回のManusが生成したパッケージで最初に発生するエラーはこのようなものです。

Fatal error: Cannot redeclare luxury_japanese_theme_body_classes()
(previously declared in
C:\Users\...\wp-content\themes\wp-theme-luxury-japanese\functions.php:292)
in C:\Users\...\wp-content\themes\wp-theme-luxury-japanese\inc\template-functions.php
on line 14

このエラーを日本語で読み解くと:

致命的なエラー:luxury_japanese_theme_body_classes() を
再宣言できません。
(以前に functions.php の292行目で宣言されています)
inc/template-functions.php の14行目で発生しています。

エラーの原因: Manusが functions.phpinc/template-functions.php の両方に同じ名前の関数を書いてしまっています。PHPでは同じ名前の関数を2回定義することができないためエラーになります。


3. 関数の重複宣言エラーの解消手順

3.1 基本的な解消の考え方

解消の方針:
エラーメッセージが示す「後から宣言している方」の関数名を変更する
(先に宣言されている方はそのままにする)

例:
functions.php:292 → luxury_japanese_theme_body_classes()  ← 先に宣言(触らない)
template-functions.php:14 → luxury_japanese_theme_body_classes()  ← 後から宣言(名前を変える)

3.2 VSCodeでファイルを開いて修正する

  1. LocalのサイトパネルでサイトフォルダをVSCodeで開きます。
  2. エラーメッセージに書かれているファイルを開きます。
  3. 該当行に移動して関数名を変更します。
// 変更前(template-functions.phpの14行目)
function luxury_japanese_theme_body_classes( $classes ) {

// 変更後(末尾に2を追加して重複を回避)
function luxury_japanese_theme_body_classes2( $classes ) {

⚠️ 関数名を変更したら、その関数を呼び出している箇所も同じ名前に変更してください: 関数の定義だけ名前を変えても、呼び出し元が古い名前のままだと今度は「未定義の関数を呼び出している」というエラーになります。VSCodeの検索機能(Ctrl+Shift+F)でテーマフォルダ全体から古い関数名を検索して、呼び出し元も一緒に変更しましょう。

// 例:functions.phpまたはtemplate-functions.phpの中の呼び出し箇所
// 変更前
add_filter( 'body_class', 'luxury_japanese_theme_body_classes' );

// 変更後(呼び出し元も同じ名前に合わせる)
add_filter( 'body_class', 'luxury_japanese_theme_body_classes2' );

3.3 エラーが連続する場合は一つずつ対処する

最初のエラーを解消してプレビューをリロードすると、今度は別の関数で同じ Cannot redeclare エラーが出ることがあります。これは正常な状態で、一つ解消するたびに次のエラーが表示されます。

エラー解消の繰り返しパターン:

1回目:luxury_japanese_theme_body_classes の重複 → 関数名を変更
         ↓
2回目:luxury_japanese_theme_setup の重複 → 関数名を変更
         ↓
3回目:luxury_japanese_theme_enqueue_scripts の重複 → 関数名を変更
         ↓
...
エラーが出なくなる → サイトが表示される → テーマを有効化

💡 根気よく一つずつ対処しましょう: 多い場合は5〜10個程度の重複エラーが連続することがあります。一つ解消するたびにリロードして次のエラーを確認するという作業を繰り返します。


4. 重複を根本的に解消する方法

4.1 function_exists() でガードする

関数名を変更し続ける方法以外に、function_exists() チェックを追加する方法があります。これはより根本的な解決策です。

// 変更前(重複エラーが発生するコード)
function luxury_japanese_theme_body_classes( $classes ) {
    // 処理
    return $classes;
}

// 変更後(function_exists()で二重定義を防ぐ)
if ( !function_exists( 'luxury_japanese_theme_body_classes' ) ) {
    function luxury_japanese_theme_body_classes( $classes ) {
        // 処理
        return $classes;
    }
}

function_exists('関数名') は「この関数がすでに定義されているか」を確認します。!function_exists() は「まだ定義されていなければ」という意味になり、二重定義を安全に防げます。

💡 function_exists() でガードする方法が長期的に管理しやすいです: 関数名を変更する方法は変更漏れが起きるリスクがあります。function_exists() でガードしておくとManusが同じ関数をどこに書いても安全に動作します。

4.2 重複している箇所を一括で確認する

VSCodeの全文検索(Ctrl+Shift+F)でテーマフォルダ内の全ファイルを対象に function luxury_japanese と検索すると、同じ名前の関数が定義されている箇所を一覧で確認できます。

VSCodeの検索ショートカット:
・Ctrl+Shift+F(Mac:Command+Shift+F):フォルダ全体を検索
・検索欄に:function luxury_japanese
→ 同じ関数名が複数ファイルで使われている箇所が一覧表示される

5. その他のよくあるエラーと解消策

5.1 ファイルが存在しないエラー(require once / get_template_part)

エラー例:
Warning: require_once(C:\...\inc\customizer.php): 
Failed to open stream: No such file or directory

原因: functions.php でインクルードしているファイルが実際には生成されていない。

解消方法:

// functions.phpを確認して存在しないincファイルの呼び出しをコメントアウトする

// 変更前
require_once get_template_directory() . '/inc/customizer.php';

// 変更後(ファイルが存在しない場合はコメントアウト)
// require_once get_template_directory() . '/inc/customizer.php';

// または存在確認を追加する
$customizer_file = get_template_directory() . '/inc/customizer.php';
if ( file_exists( $customizer_file ) ) {
    require_once $customizer_file;
}

5.2 未定義の定数・変数エラー

エラー例:
Notice: Undefined index: luxury_menu_location in
C:\...\functions.php on line 45

解消方法:

// 変更前(存在しない可能性がある変数を直接使う)
$menu_location = $args['luxury_menu_location'];

// 変更後(isset()で確認してからアクセスする)
$menu_location = isset( $args['luxury_menu_location'] )
    ? $args['luxury_menu_location']
    : 'primary';

5.3 クラスの重複宣言エラー

関数と同様に、クラスが重複して定義されているケースもあります。

エラー例:
Fatal error: Cannot redeclare class Luxury_Customizer

解消方法:

// class_exists()でガードする
if ( !class_exists( 'Luxury_Customizer' ) ) {
    class Luxury_Customizer {
        // クラスの内容
    }
}

5.4 add_action / add_filter の重複

関数の重複とは別に、同じフックに同じ関数が複数回登録されているケースがあります。

// functions.phpに同じ記述が2箇所ある例
add_action( 'wp_enqueue_scripts', 'luxury_japanese_theme_enqueue_scripts' );
// ...(省略)...
add_action( 'wp_enqueue_scripts', 'luxury_japanese_theme_enqueue_scripts' ); // ← 重複

// 解消:片方を削除する

💡 重複する add_action はエラーにはなりませんが、関数が2回実行されてCSSが二重に読み込まれる問題が起きます: wp_enqueue_scripts に登録している場合は同じスタイルシートが2回読み込まれてパフォーマンスが低下します。VSCodeで検索して重複している行を削除しましょう。

5.5 PHPのシンタックスエラー

エラー例:
Parse error: syntax error, unexpected token "}" in
C:\...\template-functions.php on line 87

解消方法:

AIが生成したコードに括弧の閉じ忘れ・セミコロンの漏れがある場合です。エラーメッセージの行番号付近を確認します。

// よくある構文エラーの例

// 括弧の閉じ忘れ
function my_function() {
    if ( $condition ) {
        echo 'hello';
    // ← ここで } が必要
}

// 正しい形
function my_function() {
    if ( $condition ) {
        echo 'hello';
    }
}

💡 VSCodeのPHP拡張機能を入れると構文エラーをリアルタイムに検出できます: VSCodeの拡張機能「PHP Intelephense」または「PHP Intelligence Server」をインストールすると、保存前にコードの問題を波線で表示してくれます。

5.6 スタイルシートが読み込まれないエラー

状況:サイトは表示されるがCSSが一切当たっていない(デザインが崩れている)

原因と解消方法:

// functions.phpのwp_enqueue_styleのパスを確認する

// 誤ったパスの例
wp_enqueue_style( 'luxury-style', get_template_directory_uri() . '/css/styles.css' );
// → 実際のファイルは /css/style.css(sがない)なのにtypoしている

// 確認手順:
// 1. テーマフォルダの中のCSSファイルの実際のパスを確認する
// 2. functions.php内のパスと一致しているか照合する
// 3. ファイル名・フォルダ名が完全一致しているか確認する(大文字・小文字も区別される)

5.7 メニューが表示されないエラー

状況:ヘッダーのグローバルナビが何も表示されない

確認と解消手順:

1. 管理画面「外観」→「メニュー」を開く
2. 「メニューを作成」してページを追加する
3. 「メニューの位置」でテーマが登録したメニュー場所に設定する
4. それでも表示されない場合はfunctions.phpのregister_nav_menus()のスラッグと
   header.phpのwp_nav_menu()の'theme_location'が一致しているか確認する
// functions.phpでの登録
register_nav_menus( array(
    'primary-menu' => 'グローバルナビゲーション',  ← スラッグ:primary-menu
) );

// header.phpでの呼び出し
wp_nav_menu( array(
    'theme_location' => 'primary-menu',  ← 同じスラッグを指定する
) );

6. エラー解消を効率化するコツ

6.1 wp-config.phpでデバッグモードを有効にする

Localの場合、デバッグモードを有効にするとエラーメッセージが詳細に表示されます。

// LocalのWordPressフォルダ内のwp-config.phpを開いて変更する
// (app/public/wp-config.php)

// デバッグを有効にする(開発中のみ)
define( 'WP_DEBUG',         true  );
define( 'WP_DEBUG_LOG',     true  );  // エラーをログファイルに保存する
define( 'WP_DEBUG_DISPLAY', true  );  // エラーを画面に表示する

⚠️ WP_DEBUG は本番環境では必ず false にしてください: デバッグモードが有効な状態で本番公開すると、PHPエラーがサイト訪問者に丸見えになりセキュリティリスクになります。

6.2 エラーログを確認する

エラーログの場所(Local使用時):
app/public/wp-content/debug.log

→ ブラウザに表示されないエラーもこのファイルに記録されている
→ VSCodeでこのファイルを開くとエラーの履歴が確認できる

6.3 エラーメッセージの読み方

エラーメッセージには必ず解消のヒントが書かれています。

エラーメッセージの構造:

[エラーの種類] : [エラーの内容]
in [ファイルパス] on line [行番号]

例:
Fatal error: Cannot redeclare luxury_japanese_theme_body_classes()  ← エラー内容
(previously declared in ...functions.php:292)                        ← 最初の宣言場所
in ...inc/template-functions.php on line 14                          ← エラーが起きた場所・行
エラーの種類深刻度内容
Fatal error最も深刻処理が止まる。必ず解消する
Parse error深刻構文エラー。必ず解消する
Warning中程度動作するが問題がある
Notice軽微推奨されない書き方をしている

7. エラーが全部解消したらテーマを有効化する

7.1 有効化前の最終確認

有効化前チェック:

✅ ライブプレビューでエラーメッセージが一切表示されていないか
✅ トップページのデザインが崩れていないか
✅ スマートフォン表示でレイアウトが崩れていないか
✅ Chrome DevToolsのConsoleタブにエラーが出ていないか
✅ Networkタブで404エラーになっているリソースがないか

7.2 テーマを有効化する

  1. 管理画面「外観」→「テーマ」を開きます。
  2. Manusが生成したテーマにマウスを乗せます。
  3. 「有効化」ボタンをクリックします。
  4. 有効化後にサイトのトップページを開いて正しく表示されるか確認します。

8. エラー解消のチェックリスト

ライブプレビューでエラーを確認してから有効化したか

Cannot redeclare エラーは後から宣言している側の関数名を変更したか

関数名を変更した場合、呼び出し元も同じ名前に変更したか

根本的な解決策として function_exists() のガードを追加したか

存在しないインクルードファイルをコメントアウトまたは file_exists() でガードしたか

VSCodeで全文検索して同名の関数が複数定義されていないか確認したか

WP_DEBUGtrue にしてエラーログを確認したか

CSSが読み込まれない場合はファイルパスのtypoを確認したか

メニューが表示されない場合は register_nav_menus()wp_nav_menu() のスラッグが一致しているか確認したか

すべてのエラーを解消した後に有効化したか


まとめ

今回はManusが生成したWordPressテーマのエラー解消方法を解説しました。ポイントをまとめると:

  • テーマは必ず「ライブプレビュー」でエラーを確認してから有効化する習慣をつける
  • Cannot redeclare エラーは後から宣言している側の関数名を変更して重複を解消する
  • 関数名を変更したら add_actionadd_filter などの呼び出し元も同じ名前に変更する
  • 根本的な解決策は function_exists() でガードすること
  • 存在しないインクルードファイルは file_exists() チェックを追加するかコメントアウトする
  • WP_DEBUGtrue にするとエラーが詳細に表示されてデバッグがしやすくなる
  • エラーは連続して出ることがあるので、一つ解消してリロード→次のエラーを解消を繰り返す
  • CSSが当たらない場合はファイルパスのtypoと大文字小文字の不一致を確認する

これまでの連載でPHPの基本・WordPressの構造・セキュリティ対策を学んできたことで、AIが生成したコードのエラーを読み解いて自分で修正できるようになっています。AIツールを安全に使いこなすためには、コードを理解できる力が何より大切だと実感できる場面です。次の記事でも引き続き実践的なテーマをお届けします。お楽しみに!

コメント

タイトルとURLをコピーしました