WordPressでPDFに閲覧制限をかける

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}

コメント