【WordPress】KUSANAGIでWP_Filesystemが動作せずファイルの内容を取得できないときの対処方法

【WordPress】KUSANAGIでWP_Filesystemが動作せずファイルの内容を取得できないときの対処方法

2020.11.11

私が開発・配布しているyStandardで「KUSANAGI環境でSVGアイコンが表示されない」というお問い合せがあり、調べてみるとWP_FilesystemでSVGファイルを取得する部分が動いていなかったようなので、その対処方法についてのメモとなります。

※この記事はWP_Filesystemを使ってファイルの内容を「取得」するための対処を記載しています。ファイルのやディレクトリの作成・削除については別の対処方法が必要になるかもしれません。あくまでヒントとして参考にしてみてください。

KUSANAGIではサーバー上のファイル操作にFTPの接続情報が必要

KUSANAGIでは、セキュリティ対策のため各ディレクトリのアクセス権限等に制限がかけられています。

そのため、プラグイン・テーマ等の追加や各種更新を行う際にFTPの接続情報を入力する必要があります。
(初めてKUSANAGIを触った時は管理画面から簡単にテーマのアップロードができずに戸惑いました…)

WP_Filesystemを使った処理がその接続情報を受け取らないとfalseを返してしまうため、KUSANAGI環境だけファイル取得の処理が期待通りに動いてくれない現象に陥りました。

request_filesystem_credentialsで認証情報を取得

ざっと調べてみると「request_filesystem_credentials」では

  • ファイルの操作権限を取得
  • もし認証が必要であればwp-config.php等から認証情報を取得
  • 認証情報が取得できなければ認証情報を表示するフォームを表示する

…といった流れの処理をしているようで、戻り値をWP_Filesystemに渡すことで取得した認証情報でファイル操作が出来るようになるようでした。

wp-config.php等から認証情報を取得」についてはFTP_HOSTFTP_USERFTP_PASSの各定数から取得してます。

KUSANAGI環境ではFTP_HOSTFTP_USERまでは初期設定でwp-config.phpに書き込まれていたので、FTP_PASSを追加してあげればひとまず準備は完了です。

WP_Filesystem周りの処理を調整

WP_Filesystem周りの処理を調整したサンプルを…

まずは調整前

// 調整前
function my_filesystem() {
	global $wp_filesystem;
	if ( empty( $wp_filesystem ) ) {
		require_once ABSPATH . '/wp-admin/includes/file.php';
		WP_Filesystem();
	}
	// ファイル取得など
	$content = $wp_filesystem->get_contents( '/path/to/file' );
}

request_filesystem_credentialsを使って認証情報を取得するように調整します▼

// 調整後
function my_filesystem() {
	global $wp_filesystem;
	if ( empty( $wp_filesystem ) ) {
		require_once ABSPATH . '/wp-admin/includes/file.php';
		if ( ( defined( 'FTP_HOST' ) && defined( 'FTP_USER' ) && defined( 'FTP_PASS' ) ) || is_admin() ) {
			$creds = request_filesystem_credentials( '', '', false, false, null );
		}
		WP_Filesystem( $creds );
	}
	// ファイル取得など
	$content = $wp_filesystem->get_contents( '/path/to/file' );
}

FTP_HOSTFTP_USERFTP_PASSの各定数があれば認証情報を取得します。仕様によってはこのチェックは必要ないかもしれないです。

フロント側で動作する処理の中でrequest_filesystem_credentialsが動作する、かつ、認証情報が足りない場合、認証フォームが表示される恐れがあるのでチェックをかけている…といった感じです。

is_adminについては、管理画面側であれば認証情報のフォームが表示されても問題ないろうという気持ちで追加しています。(会員サイトなど管理者以外が管理画面に入れる仕様のサイトの場合は加えて権限チェックなども必要になるかと思います。)

他にも方法はあるかも

filesystem_methodの戻り値がdirectになるようにフックを足す方法などいろいろあるようですので、引き続き調査してみたいと思います。

環境に左右される部分になるのであまりじっくり調査もしづらく、他の方法があれば少しずつ記事に書き足していこうと思います。

ではまた。