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:232Stack 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" errorif ($method == 'ftpext') {$method = 'direct';}return $method;}// wordpress/wp-admin/includes/file.php: 2213add_filter('filesystem_method', 'func_filesystem_method');
これでWordPress管理画面からfavicon生成。
無事完了。
favicon生成するときだけなので、普段はこのhookをコメントアウトしておけばいい。
そのうち修正されていると思う。