私が開発・配布している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_HOST
、FTP_USER
、FTP_PASS
の各定数から取得してます。
KUSANAGI環境ではFTP_HOST
、FTP_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_HOST
、FTP_USER
、FTP_PASS
の各定数があれば認証情報を取得します。仕様によってはこのチェックは必要ないかもしれないです。
フロント側で動作する処理の中でrequest_filesystem_credentials
が動作する、かつ、認証情報が足りない場合、認証フォームが表示される恐れがあるのでチェックをかけている…といった感じです。
is_admin
については、管理画面側であれば認証情報のフォームが表示されても問題ないろうという気持ちで追加しています。(会員サイトなど管理者以外が管理画面に入れる仕様のサイトの場合は加えて権限チェックなども必要になるかと思います。)
他にも方法はあるかも
filesystem_method
の戻り値がdirect
になるようにフックを足す方法などいろいろあるようですので、引き続き調査してみたいと思います。
環境に左右される部分になるのであまりじっくり調査もしづらく、他の方法があれば少しずつ記事に書き足していこうと思います。
ではまた。