WordPressでログイン時のみPDFをダウンロード可能にする方法を紹介します。
PDFのフィールドを用意
ACFを使って、PDFのカスタムフィールドを用意します。返り値はファイル配列にしましょう。
閲覧制限をかけるPDFを区別するために、ACFのupload_prefilterフィルターにフックして、アップロード先を変更します。
function my_upload_dir( $param ) {
$my_dir = '/uploads/mypdf';
$param['path'] = WP_CONTENT_DIR . $my_dir;
$param['url'] = WP_CONTENT_URL . $my_dir;
return $param;
}
function my_acf_upload_prefilter( $errors, $file, $field ) {
add_filter('upload_dir', 'my_upload_dir');
return $errors;
}
add_filter('acf/upload_prefilter/name=my_pdf', 'my_acf_upload_prefilter', 10, 3 );
PDFへのアクセスを禁止する
何もしないと、アップロードしたPDFはブラウザからアクセスできてしまいます。
https://{domain}/wp-content/uploads/mypdf/{filename}.pdf
これを禁止するために、mypdfディレクトリに.htaccessファイルを設置します。
Deny from all
PDFダウンロード用ページの作成
最後に、PDFダウンロード用の固定ページを作成します。
template_redirectアクションにフックして、閲覧制限をかけましょう。
function my_template_redirect() {
if ( is_page('pdf') ) {
if ( is_user_logged_in() ) {
$my_pdf = get_field('my_pdf', $_GET['post_id']);
header("Content-Type: application/pdf");
readfile(WP_CONTENT_DIR . '/uploads/mypdf/' . $my_pdf['filename']);
} else {
wp_safe_redirect(home_url('/'));
}
exit;
}
}
add_action('template_redirect', 'my_template_redirect', 10);
以上で実装完了です。ログイン時のみ、以下URLでアクセスできるようになりました。
https://{domain}/pdf/?post_id={post_id}
コメント