wordpressPHP8の不具合を
CatGPTが怪傑
Custom Field Suiteのエラー
Deprecated: Creation of dynamic property
をCatGPTが怪傑

image: wordpressPHP8の不具合をCatGPTが怪傑
Solving Wordpress Problem in PHP8

『デフォルトで動的なプロパティの追加が非推奨』を解決する

 | 2024/06/18

当サイトでも使用しているWPのプラグインに不具合続出

PHP8以降になり、新機能が増えたのはいいんだが、不具合も非常に増えている。
まずデフォルトのエラーレポートレベルが変更されて、より多くのエラーや警告が表示されるようになったそうだ。
私はいつもdefine( 'WP_DEBUG', true )に設定しているので大量のエラーに脳みそを突っつきまくられている。

特に、custom field suite、All-in-One WP Migration、MW WP Formにエラーが大量に吐き出されている。
特に不良動作が起きているわけではないが、やはり対処する必要がありそうだ。

それではひとつ目Custom Field Suite。

管理画面で次の様なエラーが”Deprecated: Creation of dynamic property Custom_Field_Suite::$group_ids is deprecated in ~”

CatGPTで調べるとエラーの内容は「PHP 8.2では、デフォルトで動的なプロパティCustom_Field_Suiteの追加が非推奨(Deprecated)になっています。」ということらしい。
さらに調べると、PHP 8.2で新たに導入された属性(アノテーション)で「#[AllowDynamicProperties]というものがあり、クラスに対して動的なプロパティの追加を許可するものだそうだ。「この属性を使用することで、特定のクラスに対してその制約を緩和することができます。」とある。

その修正方法は?

CatGPTに聞いてみた。
つまり、8.2未満では下記で問題なかったコードが8.2以降ではエラーなるため

<?php

class MyClass {
    public $existingProperty;
}

下記のように修正する必要があるそうだ。

<?php

#[AllowDynamicProperties]
class MyClass {
    public $existingProperty;
}

1行追加するだけだ

では対象のコードはどこにあるか

修正方法はわかったが、肝心のcustom field suiteの動的プロパティCustom_Field_Suiteはどこにあるんだ?
調べるとあった。cfs.phpの最上段に記述されている。なので次の様に修正することでエラーを無くせた。

<?php

#[AllowDynamicProperties]
class Custom_Field_Suite
{

やることは簡単だがこの解決方法を見つけるのには、ほんとかなり苦労した。
残りのプラグインエラーの解消方法は次回で解説する。

https://studio-happyvalley.com/wp/wp-content/uploads/fig1-18.png

おまけ
フィールドグループの編集画面でもエラーがでた。
修正方法は上と同じだ。

今後のことを考えると、アトリビュートによる一過性の修正ではなく根本的な解決を適用したい

動的プロパティをなくす
これまで行ってきた#[AllowDynamicProperties] による修正は、動的プロパティを使用するレガシーコードを動作させるための一時的な手段です。つまり、 今後PHP9などになると、必ず修正する必要が出てくると思われます。
したがって、 #[AllowDynamicProperties] を使用することは、コードのモダナイゼーションの過程における一時的な対策と見なすべきです。長期的には、コードベースを改善し、動的プロパティを使用しないようにすることが望ましいです。
そのためには動的プロパティを見つけて読み込み元のクラスへプロパティとして定義することが問題解決へとなります。
まず、警告文をみてみます。

https://studio-happyvalley.com/wp/wp-content/uploads/fig1-21.png

動的プロパティをクラスのプロパティとして定義する
ここでは$group_idsが動的プロパティとありadmin_head.phpで使われているとあります。
admin_head.phpの指示場所をみるとたしかに$group_idsが使われています。
なのでおおもとのクラスclass Custom_Field_Suiteへプロパティとして定義します。
以上で修正完了です。あとはエラーの数だけ同じことをやればよいです。
これでPHPのバージョンが上がっても安心です。

https://studio-happyvalley.com/wp/wp-content/uploads/fig2-15.png

https://studio-happyvalley.com/wp/wp-content/uploads/fig3-11.png

PHP8.2以降の不具合は、怪傑CatGPTに聞け

『wordpress.PHP8の不具合をCatGPTが怪傑』関連のお薦め

このページで紹介しているプログラムやビジュアルなどご依頼いただければ実装を賜ります。
お問い合わせはこちら