WordPressの「Favicon by RealFaviconGenerator」エラー対応

WordPressのプラグイン「Favicon by RealFaviconGenerator」がfavicon生成時にエラーになるようになったので調査しているときの覚書。

環境: CentOS Stream 8, PHP 8.0.20, WordPress 6.2.2, Favicon by RealFaviconGenerator 1.3.27

エラー内容

2023/08/04 09:37:36 [error] 1826#1826: *51 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught TypeError: ftp_pwd(): Argument #1 ($ftp) must be of type resource, null given in /home/httpd/saitama-nougeka/wordpress/wp-admin/includes/class-wp-filesystem-ftpext.php:232
Stack trace:
#0 /home/httpd/saitama-nougeka/wordpress/wp-admin/includes/class-wp-filesystem-ftpext.php(232): ftp_pwd()
#1 /home/httpd/saitama-nougeka/wordpress/wp-admin/includes/class-wp-filesystem-ftpext.php(459): WP_Filesystem_FTPext->cwd()
#2 /home/httpd/saitama-nougeka/wordpress/wp-admin/includes/file.php(1569): WP_Filesystem_FTPext->is_dir()
#3 /home/httpd/saitama-nougeka/wordpress/wp-content/plugins/favicon-by-realfavicongenerator/admin/class-favicon-by-realfavicongenerator-api-response.php(203): unzip_file()
#4 /home/httpd/saitama-nougeka/wordpress/wp-content/plugins/favicon-by-realfavicongenerator/admin/class-favicon-by-realfavicongenerator-api-response.php(166): Favicon_By_RealFaviconGenerator_Api_Response->downloadZipFile()
#5 /home/httpd/saitama-nougeka/wordpress/wp-content/plug" while reading response header from upstream, ...

なぜかftp接続のカレントディレクトリを参照しようとしている。

ソースを追ってみると、$wp_filesystemを生成するときに
extension_loaded( 'ftp' )
でphpのftpモジュールが有効かどうか判断していた。

phpモジュールをコマンドで確認してみる。
# php -m

ftpモジュールを無効化してみる。
# cd /etc/php.d/
# mv 20-ftp.ini 20-ftp.ini.bak

確認してphp-fpm再起動。
# php -m
# systemctl reload php-fpm

これでWordPress管理画面からfavicon生成。

今度はftpsocketsを使うようになってエラーになった。
socketsモジュールは無効化したくないので、get_filesystem_method関数の「filesystem_method」フィルタにフックすることにした。

まずはftpモジュールを有効化して元に戻す。
# mv 20-ftp.ini.bak 20-ftp.ini
# systemctl restart php-fpm


テーマのfunctions.phpに下記追記。

function func_filesystem_method($method) {
// this hook for "Favicon by RealFaviconGenerator v1.3.27" error
if ($method == 'ftpext') {
$method = 'direct';
}
return $method;
}
// wordpress/wp-admin/includes/file.php: 2213
add_filter('filesystem_method', 'func_filesystem_method');

これでWordPress管理画面からfavicon生成。
無事完了。

favicon生成するときだけなので、普段はこのhookをコメントアウトしておけばいい。
そのうち修正されていると思う。


【関連記事】