SWELL 致命的なエラー:ステップブロックと多数の画像の組み合わせ
PHP8のサーバーにあるSWELLのサイトで特定の記事だけ致命的なエラーが発生しました。
Fatal error: Uncaught Error: count(): Argument #1 ($value) must be of type Countable|array, bool given
in /wp-includes/formatting.php on line 3508
その特定の記事では、stepブロックを使い、ステップ数は10、各ステップに画像を張っている状態でした。
SWELLの問題というよりもWorpdressコアの問題だと思います。
特定の記事だけ発生する現象で、発生するとダッシュボードで記事の修正もできなくなるので、同じ現象で困っている人もいそうです。
この記事で、対応方法をご紹介します。
致命的なエラーの内容
致命的なエラーの内容は、以下のようなものです。
Fatal error: Uncaught Error: count(): Argument #1 ($value) must be of type Countable|array, bool given
in /wp-includes/formatting.php on line 3508
convert_smilies()
wp-includes/class-wp-hook.php:324
if ( get_option( 'use_smilies' ) && ! empty( $wp_smiliessearch ) ) {
// HTML loop taken from texturize function, could possible be consolidated.
$textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Capture the tags as well as in between.
$stop = count( $textarr ); // Loop stuff.
WordPressコアのconvert_smilies()
の中でconunt()
の引数に数値が渡ってこなかったのが原因だそうです。
正直この内容を見てもどこが問題で何を直せばいいのか全く分かりませんでした。
修正方法
まず、テキストをスマイリー画像に置き換える機能について確認しましょう。
ほとんどの人は必要ないと思います。
方法1:スマイリーを画像に置き換える処理を削除する
WordPressコアのconvert_smilies()
の中を直すわけにもいかないので、convert_smilies()
を使わないように修正します。
記事の中身だけ対象外にする
<?php
remove_filter( 'the_content', 'convert_smilies', 20 );
すべてのconvert_smiliesを無効化する
<?php
/**
* Disable WordPress smilies
*/
function ace_disable_smilies() {
remove_filter( 'the_content', 'convert_smilies', 20 );
remove_filter( 'the_excerpt', 'convert_smilies' );
remove_filter( 'the_post_thumbnail_caption', 'convert_smilies' );
remove_filter( 'comment_text', 'convert_smilies', 20 );
remove_filter( 'widget_text_content', 'convert_smilies', 20 );
}
add_action( 'init', 'ace_disable_smilies' );
方法2:スマイリーを画像に置き換えないプラグインを使う
エラーの原因
convert_smilies()
に渡される文字列が長すぎる場合にpreg_split()
が失敗してしまうことがあるようです。
WordPressコアの問題として、4年前から何度か取り上げられていますが、いまだ修正されていないようです。
プライオリティがnormalになっていますので、レアケースの問題なのかもしれません。
自分で直すという解は無いので、convert_smilies()
に渡る文字列の元になる記事の内容を直すか、convert_smilies()
を使わないかのどちらかで対応するしかありません。
ほとんどの人は、convert_smilies()
を知らないので、使わなくてよい機能だと思います。
convert_smilies()
を使わない方が処理は高速化されるはずです。
convert_smilies()
とは?
スマイリーに相当するテキストを画像に変換します。
説明
オプション ‘use_smilies’ が true であり、関数内で使用されるグローバルが空でない場合にのみ、スマイリーを変換します。
パラメーター
$text
必須
テキストからスマイリーに変換するコンテンツ。
戻り値
文字列 テキストのスマイリーが画像に置き換えられた変換されたコンテンツ。
まとめ
1つのブロックに画像を複数含むケースでconvert_smilies()
の致命的なエラーが出る可能性があります。
SWELLではステップブロックを使った時にエラーが発生しました。
といっても、長いことSWELLを使っていて初めて出たエラーなのですが・・・
もしかしたら、SWELLユーザーの中には同じ現象で困っている人がいるかもしれません。
そのときにはこの記事が参考になれば幸いです。
コメント