Blog スタッフブログ

WEB制作

[WordPress]メディアフォルダにBasic認証を追加

WordPressで会員向け資料や限定公開のPDFを扱う場合、投稿または固定ページにBasic認証をかけただけでは不十分です。

PDFファイルのURLに直接アクセスされると閲覧できてしまいます。

例えば、カスタム投稿で「冊子」ページを作成し、その中にPDFリンクを設置している場合でも、PDFのURLが以下のようなメディアファイル直リンクになっていると、投稿ページの認証とは別扱いになるためです。

https://example.com/wp/wp-content/uploads/sample.pdf

そこで今回は、例を元にACFでアップロードしたPDFだけを専用ディレクトリに保存し、そのディレクトリにもBasic認証を設定する方法を紹介します。

カスタムフィールドでアップロードしたファイルを格納する専用フォルダを作成

カスタムフィールドにはプラグイン「Advanced Custom Fields」を使用します。

まず、ACFのファイルフィールドからアップロードしたPDFだけを専用フォルダに保存します。

今回は、ACFのフィールドキーを指定して、該当フィールドからアップロードされたファイルだけ保存先を変更します。

/* ACFの冊子PDFアップロード時だけ専用フォルダへ変更 */
function my_acf_booklet_upload_prefilter($errors, $file, $field)
{
	add_filter('upload_dir', 'my_acf_booklet_upload_dir');
	return $errors;
}
add_filter('acf/upload_prefilter/key=field_6a5066b63c6d2', 'my_acf_booklet_upload_prefilter', 10, 3);
/* アップロード先ディレクトリを /uploads/booklet_file/ に変更 */
function my_acf_booklet_upload_dir($uploads)
{
	$uploads['subdir'] = '/booklet_file';
	$uploads['path'] = $uploads['basedir'] . $uploads['subdir'];
	$uploads['url'] = $uploads['baseurl'] . $uploads['subdir'];
	if (!file_exists($uploads['path'])) {
		wp_mkdir_p($uploads['path']);
	}
	return $uploads;
}

このコードを functions.php に追加します。

上記のコードの中で、ACFのフィールドキー「field_6a5066b63c6d2」は環境にあわせて変更が必要です。

自身の環境のACFでフィールドキーを確認してください。

保存される場所

上記の設定を行うと、対象のACFフィールドからアップロードされたPDFは、通常の年月フォルダではなく、以下のような専用フォルダに保存されます。

/wp-content/uploads/booklet_file/

PDF保存フォルダにもBasic認証を設定する

作成したフォルダの中に .htaccess を設置します。

/wp-content/uploads/booklet_file/.htaccess

中身は以下です。

AuthUserFile "/home/example/www/wp-content/uploads/booklet_file/.htpasswd"
AuthName "Restricted Area"
AuthType Basic
Require valid-user

これで、PDFのURLへ直接アクセスした場合にもBasic認証が表示されます。

AuthUserFileは自身の環境にあわせて変更してください。

.htpasswd を用意

次に.htpasswdを用意します。

/wp-content/uploads/booklet_file/.htpasswd

.htpasswd には、Basic認証で使用するユーザー名と暗号化されたパスワードを記述します。

例:user:$apr1$xxxxxxxxxxxxxxxxxxxxxxxx

.htpasswd はサーバーの管理画面や、htpasswdコマンド、またはhtpasswd生成ツールなどで作成できます。

以上がメディアの特定フォルダにBasic認証を設定する方法です。