WordPressで会員のみPDFを閲覧可能にする
会員サイトを構築しても、限定コンテンツの画像やPDFなどのメディアファイルのURLに直接アクセスされたら見られてしまいますよね。
今回はPDFを会員にしか閲覧できないようにします。
メディアディレクトリに.htaccessを設置してアクセスをブロック
これで拡張子がpdfにアクセスができなくなります。
1 2 3 | <Files ~ "\.(pdf)$"> deny from all </Files> |
しかし、メディアアップロードフォルダに上記.htaccessを設置してしまうと、
会員コンテンツではないpdfも見ることができなくなって、困ります。
特定の投稿タイプのみメディアアップロードディレクトリを変更する
会員専用のカスタム投稿タイプのみアップロードディレクトリを作成して、そのディレクトリだけ.htaccessでブロックしてしまえば良いですね!
こちらの記事で解説しています。
特定の投稿タイプのみメディアアップロードディレクトリを変更する
PHPでPDFを読み込む
まず会員か判定するにはPHP(WordPress)を使うしかないです。
ちなみに下記でWordPressでログイン状態を判定し処理を分岐できます。
1 2 3 4 5 | if ( is_user_logged_in() ){ // ログイン済 処理 } else { // 未ログイン 処理 } |
そして、PDFをPHPで読み込むにはreadfile()
を使います。
引数にファイルのパスを入れたらファイルを読み込みます。
PHP: readfile – Manual
PHPファイルを用意
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php require ($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php'); // wp読み込み $title = htmlspecialchars($_GET['title'], ENT_QUOTES, 'UTF-8'); // pdfタイトル $pdf = htmlspecialchars($_GET['pdf'], ENT_QUOTES, 'UTF-8'); // pdfファイル名 $post_type = htmlspecialchars($_GET['type'], ENT_QUOTES, 'UTF-8'); // 投稿タイプ $upload_dir = wp_upload_dir(); // アップロードディレクトリを取得 $upload_dir = $upload_dir['basedir']."/".$post_type."/"; // 指定した特定のアップロードディレクトリ if ( is_user_logged_in() ){ header("Content-Type: application/pdf"); // headerセット(pdf) header('Content-Disposition: inline; filename="'.$title.'.pdf"'); // headerセット(ファイル名を指定) readfile( $upload_dir.$pdf.".pdf" ); // PDF読み込み exit(); } else { header('Location:/login/'); // ログインページに飛ばすなど } |
PDF読み込み用PHPのファイル名を仮に『pdf.php』とします。
リンクを『pdf.php?title=【pdfのタイトル】&name=【pdfのファイル名】&type=【投稿タイプ名】』にしてアクセスすると会員のみPDFを閲覧することができます!
※会員限定投稿タイプが複数無い場合はtypeは不要です。
$_GETでパラメーターを取得して、渡されたパラメーターに沿ったPDFをPHPで読み込みます。
headerでfilenameを指定する理由
PDFをダウンロードした時用のファイル名に関係があります。
指定しないとデフォルトのものになってしまうのでちゃんと指定してあげると親切です。
これにて、晴れて会員限定のPDFコンテンツを配信することができますね!