LION BLOG(WordPressテーマ)をPHP8に対応させた話の巻

はじめに

このブログではLION BLOGというWordPress テーマを使っていまして、PHP7.4.33で動かしていました。ところがここ最近、ダッシュボードに「PHP8へのバージョンアップせんかい!」というふうな警告が出てきました。いよいよ重い腰をあげるかと。。。

ブログはXサーバーで運用しており、管理画面からPHP8への切り替えが簡単にできるようになっています。

んが、LION BLOGはとうの昔にサポートが終了しているため、PHP8に未対応の部分があり、PHP8にアップデートするといくつかの不具合が発生するのでした。

中にはクリティカルなエラーもあり、そのままだとサイトが動かなくなっちゃう状態なのでした。

「いっそ他のテーマに乗り換えようかしら?」とも考えましたが、いやいや、とりあえず原因を調べてみようと。

すると対応可能そうだったので、結局テーマのコードを修正してPHP8でも動くようにすることができたのでした。

この記事では、PHP8への対応のやり方をまとめました。

もしかしたらどなたかの参考になればうれしいです。

(あ、もし試されるなら自己責任でお願いします。)

PHPバージョンの切り替え方法(Xサーバーの場合)

最初にPHPのバージョンの切り替え方です(Xサーバーの場合)。

ちなみにPHPのバージョンの切り替えは、下に記載の「エラーの対応方法」のうち、create_function()についての対応をしてから行いました。

やり方は、

  • 「XServer レンタルサーバー」の管理画面で、「サーバー」の「サーバー管理」に行って、サーバーパネルの「PHP」の「PHP Ver.切替」で変更する(簡単。。。)

今回はPHP8.2.28(推奨)を選択しました。推奨って書いてあったから。。。

PHP8への対応方法

create_function()を無名関数に書き換え

🔍問題の内容

create_function()関数はPHP8で削除されたため、使うと致命的なエラーになりブログサイトが動かなくなります。

✅対応方法

create_function()をPHP8で動く無名関数に置き換えてやればとりあえず動くようになる、と。

修正箇所は2箇所でした。

「ファイル管理」から、ファイルマネージャーに行って、

[WordPressコンテンツへのパス]/wp-content/themes/lionblog/functions.php の中身を修正します

4517 行目(または付近)

add_action( 'widgets_init', create_function( '', 'return register_widget( "AdWidgetItemClass" );' ) );

add_action( 'widgets_init', function() {
    return register_widget( 'AdWidgetItemClass' );
} );

に修正し、
4617行目(または付近)の

add_action( 'widgets_init', create_function( '', 'return register_widget( "Popular_Posts" );' ) );

を、

add_action( 'widgets_init', function() {
    return register_widget( 'Popular_Posts' );
} );

に修正。

これでPHP8でもサイトが動くようになりました。やったね。

Warning: Undefined array key の修正

🔍問題の内容

PHP8.2.28に切り替えてブログが動いていることが確認でき、ほっとしたのも束の間、こんな警告がSNSシェアボタンあたりに出てました。。。

Warning: Undefined array key "google" in /xxxxxxxxxxxxx/wp-content/themes/lionblog/functions.php on line4687 
Warning: Undefined array key "hatebu" in /xxxxxxxxxxxxx/wp-content/themes/lionblog/functions.php on line4689
Warning: Undefined array key "pocket" in/xxxxxxxxxxxxx/wp-content/themes/lionblog/functions.php on line4691
Warning: Undefined array key "line" in/xxxxxxxxxxxxx/wp-content/themes/lionblog/functions.php on line4693

PHP8は未定義の配列キーにアクセスするとWarningが出るんですと。
例: $options['google'] が未定義であった

✅対応方法

?? false で未定義時のデフォルト値を設定して安全にアクセスするようにしてやります。

4687行目付近のここらへんを、

if ( $options['facebook'] || $options['twitter'] || $options['google'] || $options['hatebu'] || $options['pocket'] || $options['line'] ) {...以下略

その下にあるそれぞれのif文も含めて [?? false] を入れてやる

if (
    ($options['facebook'] ?? false) ||
    ($options['twitter'] ?? false) ||
    ($options['google'] ?? false) ||
    ($options['hatebu'] ?? false) ||
    ($options['pocket'] ?? false) ||
    ($options['line'] ?? false)
) {
    echo '<aside>'."\n";
    echo '<ul class="socialList">'."\n";
    if ($options['facebook'] ?? false) {
        echo '<li class="socialList__item"><a class="socialList__link icon-facebook" href="http://www.facebook.com/sharer.php?u='. urlencode(get_permalink()) .'&amp;t='. urlencode(the_title("","",0)) .'" target="_blank" title="Facebookで共有"></a></li>';
    }
    if ($options['twitter'] ?? false) {
        echo '<li class="socialList__item"><a class="socialList__link icon-twitter" href="http://twitter.com/intent/tweet?text='. urlencode(the_title("","",0)) .'&amp;'. urlencode(get_permalink()) .'&amp;url='. urlencode(get_permalink()) .'" target="_blank" title="Twitterで共有"></a></li>';
    }
    if ($options['google'] ?? false) {
        echo '<li class="socialList__item"><a class="socialList__link icon-google" href="https://plus.google.com/share?url='. urlencode(get_permalink()) .'" target="_blank" title="Google+で共有"></a></li>';
    }
    if ($options['hatebu'] ?? false) {
        echo '<li class="socialList__item"><a class="socialList__link icon-hatebu" href="http://b.hatena.ne.jp/add?mode=confirm&amp;url='. urlencode(get_permalink()) .'&amp;title='. urlencode(the_title("","",0)) .'" target="_blank" data-hatena-bookmark-title="'. urlencode(get_permalink()) .'" title="このエントリーをはてなブックマークに追加"></a></li>';
    }
    if ($options['pocket'] ?? false) {
        echo '<li class="socialList__item"><a class="socialList__link icon-pocket" href="http://getpocket.com/edit?url='. urlencode(get_permalink()) .'" target="_blank" title="pocketで共有"></a></li>';
    }
    if ($options['line'] ?? false) {
        echo '<li class="socialList__item"><a class="socialList__link icon-line" href="http://line.naver.jp/R/msg/text/?'. urlencode(the_title("","",0)) .'%0D%0A'. urlencode(get_permalink()) .'" target="_blank" title="LINEで送る"></a></li>';
    }
    echo '</ul>'."\n";
    echo '</aside>'."\n";
}

これで警告が消えました。

Warning: Undefined variable の修正 ($position)

🔍問題の内容

今度はブログのパン屑リスト付近(記事タイトルの上)に

Warning: Undefined variable $position in /xxxxxxxxxxxx/wp-content/themes/lionblog/functions.php on line 4918

を確認。PHP8は未定義の変数に対しても警告を出すようになっているんだと。

✅対応方法

関数の冒頭で変数$positionを初期化する

4918行目(付近)

function fit_breadcrumb( $args = array() ){
global $post;
$str ='';

$position = 0; // ← これ追加

// 以降処理
}

Warning: Trying to access array offset on value of type bool の修正($opt)

🔍問題の内容

今度はブログ内検索ボックスで記事検索をしたら

Warning: Trying to access array offset on value of type bool in /xxxxx/wp-content/themes/lionblog/functions.php on line 3393

とでます。

また、検索結果一覧ページの最上部に、

Warning: Trying to access array offset on value of type bool in /xxxxxxx/wp-content/themes/lionblog/functions.php on line 3370

Warning: Trying to access array offset on value of type bool in /xxxxxxx/wp-content/themes/lionblog/functions.php on line 3370

と出ます。

配列だと思って $opt[‘bar’] のようにアクセスしたけど、実際は変数が true または false(bool型)だった、というエラーなんですと。

✅ 対応方法

3393行目付近の

function fit_archive_title() {
    $opt = get_option('fit_advanced_archive');
    $title = get_bloginfo( 'name' );
    if ( is_category() ) {
        $title = $opt['category']. single_cat_title( '', false );
    } elseif ( is_tag() ) {
       $title = $opt['tag']. single_tag_title( '', false );
    } elseif ( is_author() ) {
        $title = $opt['author']. get_the_author();
    } elseif ( is_year() ) {
        $title = $opt['year']. get_the_date('Y年') ;
    } elseif ( is_month() ) {
        $title = $opt['month']. get_the_date('Y年n月') ;
    } elseif ( is_day() ) {
        $title = $opt['day']. get_the_date('Y年n月j日') ;
    } elseif ( is_search() ) {
        $title = $opt['search'].'「'.get_search_query().'」の検索結果' ;
    } elseif ( is_404() ) {
        $title = 'Hello! My Name Is 404' ;
    }
    return $title;
    }

の、最初の部分を

$opt = get_option('fit_advanced_archive');
if (!is_array($opt)) {
$opt = [];
}

として、必ず配列として扱うようにする。

そして、

$title = ($opt['category'] ?? '') . single_cat_title( '', false );

のように ?? '' で未定義回避。

最終的にここの関数はこう修正

function fit_archive_title() {
    $opt = get_option('fit_advanced_archive');
    if (!is_array($opt)) {
        $opt = [];
    }
    // 以下は元のまま
    $title = get_bloginfo('name');
    if ( is_category() ) {
        $title = ($opt['category'] ?? '') . single_cat_title( '', false );
    } elseif ( is_tag() ) {
        $title = ($opt['tag'] ?? '') . single_tag_title( '', false );
    } elseif ( is_author() ) {
        $title = ($opt['author'] ?? '') . get_the_author();
    } elseif ( is_year() ) {
        $title = ($opt['year'] ?? '') . get_the_date('Y年');
    } elseif ( is_month() ) {
        $title = ($opt['month'] ?? '') . get_the_date('Y年n月');
    } elseif ( is_day() ) {
        $title = ($opt['day'] ?? '') . get_the_date('Y年n月j日');
    } elseif ( is_search() ) {
        $title = ($opt['search'] ?? '') . '「' . get_search_query() . '」の検索結果';
    } elseif ( is_404() ) {
        $title = 'Hello! My Name Is 404';
    }
    return $title;
}

もう1箇所、
3370行目付近も同様のやり方で

function fit_page_title() {
    $opt = get_option('fit_advanced_archive');
    if (!is_array($opt)) {
        $opt = [];
    }
    $title = get_bloginfo( 'name' );
    if ( is_category() ) {
        $title = ($opt['category'] ?? '') . single_cat_title( '', false );
    } elseif ( is_tag() ) {
        $title = ($opt['tag'] ?? '') . single_tag_title( '', false );
    } elseif ( is_author() ) {
        $title = ($opt['author'] ?? '') . get_the_author();
    } elseif ( is_year() ) {
        $title = ($opt['year'] ?? '') . get_the_date('Y年') ;
    } elseif ( is_month() ) {
        $title = ($opt['month'] ?? '') . get_the_date('Y年n月') ;
    } elseif ( is_day() ) {
        $title = ($opt['day'] ?? '') . get_the_date('Y年n月j日') ;
    } elseif ( is_search() ) {
        $title = ($opt['search'] ?? '') . '「' . get_search_query() . '」の検索結果' ;
    } elseif ( is_404() ) {
        $title = 'Hello! My Name Is 404' ;
    }
    return $title;
}

としました。

これで警告が消えました。

新規投稿作成画面への遷移画面でのUndefined array key “custom_css_noncenname”の修正

🔍問題の内容:

新規投稿しようとしたときの遷移画面で一瞬ちらっと次の警告が出ているのが見えました

Undefined array key “custom_css_noncenname” in /xxxxxxxx/wp-content/themes/lionglog-child/functions.php on line 41

このWarningは、$_POST['custom_css_noncenname'] のように 存在しないPOSTデータにアクセスしている ことが原因です。
PHP8では未定義のキーにアクセスすると Warning が出るようになっている、と。

✅ 対応方法

未定義のキーを使うときは、isset() または ?? を使って安全にチェックする。

例えば

処理の前に isset() で囲む。

if ( isset($_POST['custom_css_noncenname']) ) {
    $nonce = $_POST['custom_css_noncenname'];
}

あるいは、

// 修正前(Warningが出る)
$nonce = $_POST['custom_css_noncenname'];

// 修正後(Warningが出ない)
$nonce = $_POST['custom_css_noncenname'] ?? '';

とするとOKである、と。

それでは実際に、

wp-content/themes/lionblog-child/functions.phpの(lionblog-childのほうね)
41行目付近の

if (!wp_verify_nonce($_POST['custom_css_noncename'], 'custom-css')) return $post_id;

を含む関数を、

function save_custom_css($post_id) {
if (
!isset($_POST['custom_css_noncename']) || // ← 存在チェックを追加
!wp_verify_nonce($_POST['custom_css_noncename'], 'custom-css')
) {
return $post_id;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
$custom_css = $_POST['custom_css'] ?? ''; // ← 念のためここも安全に
update_post_meta($post_id, '_custom_css', $custom_css);
}


に修正。

ふう、警告消えました。

投稿プレビューでのWarning: Trying to access array offset on value of type bool in single.phpの修正

🔍問題の内容:

投稿プレビューで

Warning: Trying to access array offset on value of type bool in /xxxxxxxxx/wp-content/themes/lionblog/single.php on line 12

がでました。line 13, line 14も同様。

lionblog/single.phpで、ここ。の$srcの行でエラー。

$thumbnail_id = get_post_thumbnail_id();
$icatch_img = wp_get_attachment_image_src( $thumbnail_id , 'icatch' );
$src = $icatch_img[0];
$width = $icatch_img[1];
$height = $icatch_img[2];

wp_get_attachment_image_src() の返り値が false のまま [0] などにアクセスして配列のように扱おうとしてエラーになる模様。

✅ 修正方法

このように修正。

$thumbnail_id = get_post_thumbnail_id();
$icatch_img = wp_get_attachment_image_src( $thumbnail_id , 'icatch' );

if ($icatch_img !== false) {
    $src = $icatch_img[0];
    $width = $icatch_img[1];
    $height = $icatch_img[2];
} else {
    // 代替画像を使う or 空にする
    $src = get_template_directory_uri() . '/img/img_no.gif';
    $width = 890; // デフォルトの幅
    $height = 500; // デフォルトの高さ
}

エラー消えました。

おわりに

  • LION BLOGのコードで使われているcreate_function() 関数は PHP8 で削除されたため、PHP8にアップデートするとサイトが動かなくなりますが、無名関数に書き換えることで正常に動作するようになりました
  • PHP8ではエラーチェックがより厳格になっていて、いくつかの警告が出ました。各所に存在確認や型チェックを追加することでこれらの警告を消すことができました
  • LION BLOG、まだまだ使うぞ、と


作業日と環境メモ

  • 作業日:2025年7月15日
  • サーバー:Xserver
  • テーマ:LION BLOG(カスタマイズあり)
  • PHPバージョン:7.4.33 → 8.2.28(推奨)

おしまい