WordPress6.4にしたタイミングでPHP8に移行した人は多いかもしれません。
でも、古いプラグインで更新されていないものはPHP8に対応していないことが多く、最悪Fatal Errorとなってサイトを破壊します。
SNS Count cacheもPHP8になって非推奨コードの警告が出るようになったのですが、特に問題なく動いているように見えました。
シェア数が更新されない感じがしていたので調べたら、Fatal Errorが出る箇所がありました。
プラグインの更新は停止しているので、自分で修正することにしました。
この記事ではプラグインのソースコードの修正方法をお伝えします。
SNS Count CacheがPHP8でFatal Errorになる場所
SNS count cacheのダッシュボードのキャッシュ状況のキャッシュボタンを押すと以下のエラーが出ます。
Fatal error: Uncaught Error: Object of class CurlHandle could not be converted to string
in /home/xxxx/public_html/xxxxxxx/wp-content/plugins/sns-count-cache/includes/class-scc-http.php on line 112
つまり、SNSカウント数を取得できないということですのでPHP8ではSNS count cacheは動かないということになります。
PHP8からcurl関連関数はCurlHandleオブジェクトを返すように変更されたようで、オブジェクトを文字列にキャストしている箇所がエラーになります。
$handle_to_sns[ (string) $ch[ $sns ] ] = $sns;
ところが、この部分はそれ以降使われていません。
なので、コメントアウトしてしまうとエラーが出なくなります。
キャッシュ状況確認ページでWarningが出る
Warrningが出ないサイトもあるので、コーナーケースなのかもしれないが、以下のようなWarnningが出たサイトがあった。
Trying to access array offset on value of type bool
wp-content/plugins/sns-count-cache/includes/admin-cache-status.php:284
$sns_countsはtransientで保存されたキャッシュなので、キャッシュが無い場合はbool変数と見なされるため、配列としてアクセスすると警告が出る。
284行目付近にあるif文でis_array()関数を追加すると消える。
if ( is_array($sns_counts) && SCC_Cache::has_value( $sns_counts[ self::REF_CRAWL_DATE ] ) && -1 != $sns_counts[ self::REF_CRAWL_DATE ] ) {
// if ( SCC_Cache::has_value( $sns_counts[ self::REF_CRAWL_DATE ] ) && -1 != $sns_counts[ self::REF_CRAWL_DATE ] ) {
echo '<td class="full-cache" data-label="' . esc_attr( __( 'Crawl Date', self::DOMAIN ) ) . '">';
echo esc_html( $sns_counts[ self::REF_CRAWL_DATE ] );
echo '</td>';
}else {
Warrningが出ないサイトもあるので、コーナーケースなのかもしれないが、以下のようなWarnningが出たサイトがあった。
Undefined array key 1
wp-content/plugins/sns-count-cache/includes/class-scc-http.php:140
trim(): Passing null to parameter #1 ($string) of type string is deprecated
wp-content/plugins/sns-count-cache/includes/class-scc-http.php:140
$middleが配列じゃない場合もあるので、配列かどうか確認するコードを追加。
foreach ($data as $part) {
$middle = explode(':', $part, 2);
if (is_array($middle) && count($middle) == 2) { // 追加
$headers[trim(strtolower($middle[0]))] = trim($middle[1]);
}// 追加
}
まとめ
SNS count cahceがシェア数を拾ってこないと思ったら、PHP8でエラーになっている可能性がありますので、この記事の内容を確認してみてください