PHP8.1でCMS「freo」

freo.jpg

お世話になっているレンタルサーバー(リトルサーバー)でPHP 8.1が使えるようになったので重い腰を上げてローカル環境でもPHP8.1を使えるようにし、愛用CMS「freo」もPHP8.1で使えるように対応しました。ちなみにリトルサーバーさんは去年秋くらいから利用してますがなかなかいいサーバーです、お問い合わせへのお返事も迅速丁寧ですし。有料サーバ使ってみようかなって方・移転先をお探しの方、ぜひ候補に入れてみてください。

CMS「freo」をPHP8.1で使うには

公式配布元 freo.jpで配布されている最新版は残念ながらPHP7~8.1に対応していません。有志の方が配布してくださっている対応版を使うのが一番手っ取り早いです。

どちらを使うかはお好みで。どちらも有志の方がご厚意で公開配布されているものだということを留意してお使いください。また、上記のものを使っても一部プラグインの使用でエラーが出る場合があります。その時は

php.iniで
display_errors=Off

php.iniが触れない場合はfreoを置いてあるディレクトリの.htaccessに以下を追記
php_flag display_errors Off

とすることで当面は問題なく運用が可能だと思います。(2022/10/31追記)ここでの表記を最初は「PHP8」としていましたがPHP8ではエラーにならなかった部分もPHP8.1だとエラーになる場合があるようなので訂正します。詳しくはfreoTIPS ~ phpバージョン別、freoの対応状況(非公式確認) ~ ― 龍の棲む場所をご覧ください。
aleviritaさんのdream.php ver.5 freoプラグインもPHP8/Smarty3対応に更新されています!!(ここまで追記)

把握済みのエラーが出るプラグインとその修正

2022/10/29時点で私が確認した部分・修正できたものについてはそれについてを書いておきます。

  • freo設置ディレクトリをルートURLで表示させたとき
  • ページ一括表示プラグイン
  • フォーム管理プラグイン
  • サークルタグクラウド表示プラグイン
  • クエリストリングパラメータ化プラグイン(配布元:龍の棲む場所
  • サークルカップリングタグクラウド表示プラグイン(配布元:虹色ミツバチ

freo設置ディレクトリをルートURLで表示させたとき

freo設置ディレクトリをルートURLで表示させる」で紹介した.htaccessを用いてリダイレクトさせる方法を採用していた時にルートURL(サイトトップ)でエラーが出ました。

libs/freo/common.php 300行目あたり

if ($request_uri[$i] == $script_name[$i]) {

を以下のように書き換えます。

if (isset($request_uri[$i]) && isset($script_name[$i]) && $request_uri[$i] == $script_name[$i]) {

こちらは龍の棲む場所の南方かおりさんにご教示いただきました。ありがとうございます!

ページ一括表示プラグイン

libs/freo/plugin/display.page_all.php 75行目

$pages[$id]['text']      = str_replace('[$text]', $pages[$id]['text'], $freo->config['page']['filter_text']);

を以下のように書き換えます。

$pages[$id]['text']      = str_replace('[$text]', $pages[$id]['text'] ?? '', $freo->config['page']['filter_text']);

フォーム管理プラグイン

「件名」をフォームタグの書き方で任意にしたときに入力せず送信しようとしたときにエラー発生。

libs/freo/plugin/page.form.php 1174行目(該当箇所付近だけ抜粋しています)

if ($_POST['plugin_form']['__type'][$id] and mb_strlen($_POST['plugin_form'][$id], 'UTF-8')

を以下のように書き換えます。

if ($_POST['plugin_form']['__type'][$id] and mb_strlen($_POST['plugin_form'][$id] ?? '', 'UTF-8')

同 1178行目

} elseif (mb_strlen($_POST['plugin_form'][$id], 'UTF-8')

を以下のように書き換えます。

} elseif (mb_strlen($_POST['plugin_form'][$id] ?? '', 'UTF-8')

同 1186行目

if (isset($_POST['plugin_form']['__type'][$id]) and $_POST['plugin_form'][$id] != '')

を以下のように書き換えます。

if (isset($_POST['plugin_form']['__type'][$id]) and isset($_POST['plugin_form'][$id]) and $_POST['plugin_form'][$id] != '')

クエリストリングパラメータ化プラグイン(Ver.2.1.0)

(2022/11/06追記)配布元の龍の棲む場所さんでPHP8.1に対応したver.2.2.0が配布されています。(追記ここまで)

libs/freo/plugin/security_entry_query_param.php 14行目

function freo_security_plugin($mode, $plugins, $exceptions = array(), $plugin_name, $plugin_database_names)

を以下のように書き換えます。

function freo_security_plugin($mode, $plugins, $exceptions = array(), $plugin_name=null, $plugin_database_names=null)

libs/freo/plugin/init.entry_query_param.php 2278行目

if (preg_match('/\A(date|tag|user|word)\z/', $query_data)) {

を以下のように書き換えます。

if (preg_match('/\A(date|tag|user|word)\z/', $query_data ?? '')) {

いずれのエラーも現時点では前述の方法でdisplay_errorsをオフにしていればエラー表示はされず運用にも問題はないと思います。