web-dev-qa-db-ja.com

マルチサイトインストールの1つのサブサイトで、ログインしていないユーザーからカスタム投稿タイプに関連する投稿添付ファイルを保護する方法

私は、クライアントが自分のメンバーのためにファイルを投稿できるようにするという唯一の目的で、Webサイト内に単純な「メンバー専用」のセクションを作成しています。私はすぐにポストの添付ファイル自体がWordPress内でいかなる方法でも保護されていないことに気づくようになりました。たとえば、ユーザーがログインしておらず、ファイルへの直接のURLを知っている場合は、アクセスしたり他のユーザーと共有したりできます。文書はクライアントのビジネスにかなり敏感なので、これは大きな問題です。

メンバーの領域は、current_user_can条件付きのカスタムページテンプレート、wp_redirects、メンバープラグインを使用したカスタムロール、および「ファイル」投稿用のカスタム投稿タイプなど、期待するすべてのツールを使用して構築されています。カスタム投稿タイプ内の各ファイル投稿には、クライアントがファイル/ドキュメントを添付するために使用できるメタボックスがあります(.jpg、.gif、.pdfなど)。 WPAlchemy を使用していますが、メタボックス要件を満たすためにMedia Accessクラスです。

メンバーのエリアは、マルチサイトインストール内の1つの特定のサイトで実行され、合計3つのサイト(すべて同じ会社に関連しています)で構成されます。

誰かが私を正しい方向に操縦することができれば私は非常に感謝したいと思います。私は物事を単純にして、コードが実際に何をしているのか知りたいので、プラグインの配列を使用する必要がないことを望みます。また、これは必ずしもWordPressの質問ではなく、.htaccessの質問でもないことがわかります(私が出くわした質問とその回答からわかるように)が、私は自分の質問が違うと考えるのをやめられませんそれはそれがマルチサイトに関連しているという点で、そして別のアップロードフォルダの必要性の可能性です。

添付ファイルを保護することについてのこれまでの私の考えはここにあります:

  1. メタボックスがカスタム投稿タイプ内の各投稿からファイルをアップロードするためのメディアアップロードディレクトリを別に作成することができます。これらのファイルは他のサイトのメディアアップロードから分離されているため(メンバーの添付ファイルのみを保護する必要があります)、.htaccessを使用してそのフォルダーだけを保護するのが簡単になります。

    1.1。ある種の.htaccessの変更は間違いなくここへ行く道ですか?

    1.2。実際にどのようにして個別のメディアアップロードディレクトリを作成し、WPAlchemyのメタボックスにここにファイルをアップロードさせることができますか?私はuploads_dirフィルタフックを見ましたが、それをどのように使うかはわかりません。

  2. 上記のように別のメディアアップロードディレクトリを作成するのではなく、私のカスタム投稿タイプに属する添付ファイルのみを保護することをお勧めします。しかし、それでは、それが.htaccessソリューションとどのように結び付いているのかわかりません。別のフォルダを用意するほうが簡単なようです….

私は自分の質問と非常によく似た以下の質問を見ました。

  1. ユーザーがログインしていない場合、アップロードを保護するにはどうすればいいですか?

    それはWPの非マルチサイトインストールを扱うように見えます、そしてまた全サイトは私のサイトのセクションに対してメンバーエリアです。覚えておいて、私はすべてのアップロードを保護したくない、カスタム投稿タイプに添付されているものだけを保護したい。私は phpスクリプトを介してリクエストを渡すという考えが好きですか ?多分私はこのスクリプトを使用して私のマルチサイトインストール内の1サイトの別のアップロードディレクトリを使用するようにそれを修正することができますか?

  2. マルチサイトでアップロードを保護する

    そして..

  3. アップロードしたファイルへのアクセスを制限するにはどうすればいいですか?

更新:

this thread が見つかりましたが、解決策はありません。私がそれを働かせることができれば行くべきよりよい方法のように思えます。サイトのすべてのファイルを保護できたら、ファイルを新しいuploadsディレクトリにアップロードする方法を考えます。

1
Andrew

アンドリュー、

カスタム投稿タイプがMulti Siteインストールの1つのサブサイトにしか存在しない場合は、カスタム投稿タイプの表示と出力を制御するテンプレートファイルで、次のような単純な条件付き関数を使用できます。

  • is_singular( 'post_type_name');
  • is_user_logged_in();

...そして実際、それは同じくらい簡単かもしれません。

<?php if(is_user_logged_in()) : ?>

<?php echo wp_get_attachment_url( 12 );?>

<?php else : ?>

//Do what you want here, such as nothing or redirect to login page or alert user that some content is hidden etc.

<?php endif;?>

うまくいけば、これはあなたが探しているもののラインに沿っています。それが解決策のためのそれほど単純でないならば私に知らせてくださいそして我々はより深く掘り下げます。

PS。 wp_get_attachment_url()をあなたの目的に合ったものに置き換えてください。

  • wp_get_attachment_metadata()
  • wp_read_image_metadata()
  • wp_get_attachment_image()
  • wp_get_attachment_image_src()
  • wp_get_attachment_thumb_file()
  • wp_get_attachment_thumb_url()
  • wp_get_attachment_link()
  • wp_get_attachment_url()

@Codex ... ここ

注意

または... WPAlchemyを使用している場合は、上記のwp_get_attachmentなどを代わりにカスタムメタボックスコードに置き換えることになります。

<?php custom_metabox->the_field('name'); ?>
1
userabuser