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をコメントアウトしておけばいい。
そのうち修正されていると思う。


2024/10/28 追記

別環境でエラー
環境: FreeBSD 14.1-RELEASE-p5, PHP 8.3.6, WordPress 6.6.2, Favicon by RealFaviconGenerator 1.3.36

2024/10/28 08:21:16 [error] 1169#100257: *129 FastCGI sent in stderr: "PHP message: ftpsockets; PHP message: PHP Deprecated:  Creation of dynamic property ftp::$features is deprecated in /home/httpd/gokou-koshigaya-ss/wordpress/wp-admin/includes/class-ftp.php on line 151; PHP message: ; PHP message: PHP Fatal error:  Uncaught Error: Undefined constant "FS_CHMOD_DIR" in /home/httpd/gokou-koshigaya-ss/wordpress/wp-admin/includes/file.php:1781
Stack trace:
#0 /home/httpd/gokou-koshigaya-ss/wordpress/wp-admin/includes/file.php(1657): _unzip_file_ziparchive('/home/httpd/gok...', '/home/httpd/gok...', Array)
#1 /home/httpd/gokou-koshigaya-ss/wordpress/wp-content/plugins/favicon-by-realfavicongenerator/admin/class-favicon-by-realfavicongenerator-api-response.php(205): unzip_file('/home/httpd/gok...', '/home/httpd/gok...')
#2 /home/httpd/gokou-koshigaya-ss/wordpress/wp-content/plugins/favicon-by-realfavicongenerator/admin/class-favicon-by-realfavicongenerator-api-response.php(166): Favicon_By_RealFaviconGenerator_Api_Response->downloadZipFile('/home/httpd/gok...', '/home/httpd/gok...', 'https://realfav...')
#3 /home/httpd/gokou-koshigaya-ss/wordpress/wp-content/plugins/favicon-by-realfavicongenerator/admin/class-favicon-by-realfavicongenerator-admin.php(215): Favicon_By_RealFaviconGenera" while reading response header from upstream, client: 192.168.10.102, server: dev.koshigaya-ss.com, request: "GET /wp-admin/admin-ajax.php?action=fbrfg_install_new_favicon&json_result_url=%2Fapi%2Finteractive-requests%2Fcdd81229-2944-4798-9099-17aa1ddf4c91 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "dev.koshigaya-ss.com", referrer: "http://dev.koshigaya-ss.com/wp-admin/themes.php?page=favicon-by-realfavicongenerator%2Fadmin%2Fclass-favicon-by-realfavicongenerator-admin.phpfavicon_appearance_menu&json_result_url=%2Fapi%2Finteractive-requests%2Fcdd81229-2944-4798-9099-17aa1ddf4c91"


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

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




【関連記事】