👻

PDFダウンロード販売サイトを実際に制作して思ったこと

2023/10/12に公開

今回は、wordPressのプラグインのSimple WordPress MembershipとSimple Download Monitorの組み合わせで、会員がログインしていないとダウンロードできないウェブサイトを作ることができました。
その過程は、こちらのスクラップを読んでください。
https://zenn.dev/masaru21/scraps/d41eb605db692d

また、こちらのnoteにも、書きました。
https://note.com/masaru21/n/n4efc46f3db73

wordPressのプラグインを使うことで、容易にPDFのダウンロード販売サイトを作ることができると思いました。
でも、実際には、苦労したことがあります。

Simple Download Monitorは、ログインしているユーザーと、ログインしていないユーザーの二つのレベルしかないため、Simple WordPress Membershipで設定した会員ランクに応じてダウンロードボタンの動作を変えることができないのです。

色々調べて、Simple WordPress Membershipを使っているときに、ログインしているユーザーの状態や情報を知ることができる方法があることを知りました。
この情報を基にして、コードを作りました。

でも、ダウンロードのラインキングなどの一覧表示と、3カラムの表での一覧表示とでは、空ラス名が違うため、それぞれに合う形でコードを作る必要があります。

Simple Download Monitorのリストを表のように表示したいとき

最初にSimple Download Monitorの3カラムで表のように一覧を表示したいときは、こちらのコードです。

[sdm_popular_downloads category_slug="download" number="12" fancy="2"]

ダウンロードというカテゴリのスラッグを、任意のものに変えてください。
fancy="2"の指定で、表のように一覧を表示できます。

PDFの直リンクアクセスを防ぐ方法

PDFファイルのページの時は、こちらの有料のアドオンを導入すると、ダウンロードのURLを隠すことができます。
https://simple-download-monitor.com/hidden-downloads-for-simple-download-monitor/#installing-the-hidden-downloads-addon

このアドインは、単体のページでのみ使えますので、一覧表示では使えないのです。
今回は、一覧表示でURLを隠すことは、諦めています。
対策としてSimple Download Monitorの設定で、ログインしているときにダウンロードできる設定にしておけば、ログインしていないユーザーは、直リンクでのアクセスができないことが分かりました。

こちらの設定をしておくと、ログインしていないユーザーが直接ファイルのURLにアクセスしたときに、ログインしていないユーザーはアクセスできないという内容のページが表示されました。
そのため、一応直リンクでのアクセス対策になると思いました。

ファイルの一覧表示でも、ダウンロードのURLを隠すことができたら一番良いのにと思いました。
自分でプラグインを作りダウンロードの販売サイトを作るのが、確実なように思います。

ダウンロードを会員ランクに合わせて行う工夫

下記の記事が、参考になりました。
https://wp-labo.com/simple-membership-contents-switch/

https://wp-labo.com/simple-membership-login-user-membership-level/

トップページにカスタムHTMLのボックスを使ってコードを入力しようとしましたが、PHPは、使えないです。
そのため、ショートコードを作ってトップページに設置する作戦で行いました。

function membership_download_shortcode() {
    ob_start();  // Output bufferingを開始
    ?>

    <div>
        <!-- Simple WordPress Membership の会員ランクに応じて、Simple Download Monitorのダウンロードボタンの制御 -->

        <?php // Simple Membershipのインスタンスを生成
        $auth = SwpmAuth::get_instance();

        // ログインしている場合
        if ($auth->is_logged_in()) {
            // 会員ランクを取得
            $membership_level = $auth->get('membership_level');
            // javascriptに変数を渡す
            echo "<script>var membershipLevel = $membership_level;</script>";
        }
        ?>

        <script>
          // membershipLevelが定義されている場合
          if (typeof membershipLevel !== 'undefined') {
            // sdm_fancy2_download_dl_linkクラスの要素を取得
            var buttons = document.getElementsByClassName('sdm_fancy2_download_dl_link');
            // ボタンの数だけ繰り返す
            for (var i = 0; i < buttons.length; i++) {
              // 説明テキストを取得
              var descriptionElement = buttons[i].closest('.sdm_fancy2_wrapper').querySelector('.sdm_fancy2_download_title');
              var description = descriptionElement ? descriptionElement.innerText : '';
              // 説明テキストを基にアクションを変更
              if (description.includes('無料') && membershipLevel == 2) {
                // 無料会員の場合、無料ダウンロードを許可
                // (何もしない)
              } else if (description.includes('有料') && membershipLevel == 2) {
                // 無料会員の場合、有料ダウンロードをブロック
                buttons[i].addEventListener('click', function(e) {
                  e.preventDefault();
                  alert('このコンテンツは有料会員のみダウンロードできます。');
                });
              }
            }
          }
        </script>
    </div>

    <?php
    return ob_get_clean();  // Output bufferingを終了し、バッファの内容を返す
}
add_shortcode('membership_download', 'membership_download_shortcode');  // ショートコードを登録

このコードで、こちらのショートコードをトップページに設置して使うことができます。

[membership_download]

このコードを使うと、先のショートコードで3カラムの表形式でラキングを表示しているときに、無料会員ランク(数字2)のユーザーは、ファイルのタイトルに有料と書いてあるファイルのダウウンロードは、できません。
この会員ランクは、適宜運用するウェブサイトに応じて修正してください。
無料会員は、無料とタイトルに書かれているファイルをダウンロードできます。

サイドバーにランキング一覧を表示しているとき

ランキング一覧でリスト表示の時は、クラス名が変わりますのでコードも修正が必要です。
私は、テンプレートファイルを作り、トップページ以外に対応できるようにしました。
でもテンプレートファイルを作った後に、ショートコードを自作した流れなので最初にショートコードを実装していたら、個別にテンプレートファイルを作らなくても対応できると思います。
ただしサイドバーなどでリスト表示するときは、コード修正したものを使ってください。

実際にPDFダウンロード販売サイトを作って思ったこと

wordPressのプラグインの組み合わせで、かなり悩みました。
今回は、Stripeの決済でサブスクリプションの方式だったので、何とかなったように思います。
会員管理のプラグインのSimple WordPress MembershipでStripeのサブスクリプションでの決済ができますので、お勧めのプラグインだと思います。
ただPDFだけでなく物販が伴う際に、ランキング一覧の表示があると、とても苦労すると思います。
また表形式で一覧を表示したい場合も、苦労すると思います。
自分でプラグインを作って対応した方が早かったかなと思うくらい大変でしたので、記事にまとめました。
ダウンロードのURLは、隠せるように工夫すると良いです。
有料のファイルをタダで不正にダウンロードされてしまうリスクを抑えることができるとおもいますので、Simple Download MonitorのURLを隠すことができるアドオンを採用されることをお勧めします。
ただしファイル一覧では、URLを隠せないので気を付けてください。

2023年10月14日追記
wordPressのSimple wordPress Membershipプラグインで、新規登録のユーザー名の欄に、プレイスホルダを設定して、入力例を表示する方法です。

WordPressのインストールディレクトリにアクセスし、simple-membership > views > add.php の順にアクセスします。

add.php ファイルをテキストエディタで開き、約17行目あたりにある input 要素を見つけます。この input 要素は、id 属性が user_name となっているはずです。

この input 要素の末尾に placeholder 属性を追加し、プレイスホルダとして表示したいテキストを設定します。たとえば、placeholder="yamada0123" のように設定することができます。

こちらが実装例です。

<td><input type="text" id="user_name" class="validate[required,custom[noapostrophe],custom[SWPMUserName],minSize[4],ajax[ajaxUserCall]]" value="<?php echo esc_attr($user_name); ?>" size="50" name="user_name" placeholder="例:yamada0123" <?php apply_filters('swpm_registration_form_username_input_attributes', ''); ?> /></td>

Discussion