web-dev-qa-db-ja.com

特定の投稿/ページを閲覧するには、どうやって認証/ログインが必要ですか?

私は彼の従業員のために内部の「イントラネット」を望んでいる顧客のためにワードプレスサイトに取り組んでいます。基本的なニーズは以下のとおりです。

  1. 社内で物事をやり取りする
  2. 住宅重要企業文書
  3. 従業員にリソースへの迅速なアクセスを提供します。

この情報は機密情報であり、従業員のみを対象としています。彼らは、各従業員にユーザー名/パスワードを与え、ログインした後にのみ情報と文書を閲覧できるようにしたいと考えています。

私はこれらのプラグインを見ました、そしてそれのようなものがいくつかありますが、それらは限られているように見え、そしてもちろんそれらは現在完全に時代遅れです:

個々の投稿/ページをパスワードで保護することができます。カテゴリの投稿全体をパスワードで保護できますか、それともカスタム投稿タイプを保護できますか?基本的に、私はログインの下で一緒にいくつかのページ/投稿をグループ化する必要があります。情報は機密性が高いため、RSSフィードなどでは利用できません。これどうやってするの?

  • 選択肢1(あまり望ましくない):ワードプレス全体をログインウォールの後ろに構築する
  • 選択肢2(より望ましい):ログインウォールの内側に内部ページ/投稿のみを表示する

結論:WAYの方が簡単な場合はオプション1に興味がありますが、オプション2の方が望ましいでしょう。どちらかを引き離す方法。ご協力いただきありがとうございます!

3
timshutes

対応するアーカイブページとシングルページにチェックを入れることができます

しかし、他のすべての解決策と一緒に確実にしなければならないことの1つは、the_postsフィルターを使用することです。 WP_Queryが取得した投稿を除外します。あなたは投稿オブジェクトの配列を取得します。条件を確認し、オブジェクトが存在する場合は設定を解除します。これは他のすべての解決策が迂回される場合のためのものです。何も知らないプラグインが投稿を取得した場合、これが最後の手段になります。

あなたが使用すべきもう一つのことは、クエリ変数をチェックし、必要に応じてそれらを変更するためのpre_get_postsフィルタです。

もう1つはposts_whereフィルタです。これを使用して、mysqlクエリに別のwhere句を追加します。

これは完全に安全というわけではありませんが、ほとんどの場合、さらにはほとんどの外部プラグインもカバーするはずです。

カスタム投稿タイプを使用すると、ずっと簡単になります。そのpost_typeにカスタム機能を設定して、特定の役割を持つユーザーにのみそれらの機能を付与することができます。

あなたはあなたのクライアントに手動で全ての投稿をプライベートに設定するように依頼することができますが、あなたは彼らが今それを忘れていることを確信できます。セキュリティが重要な場合は、それを避けてください。

2
Mridul Aggarwal

これは古いです - しかし、ここで私はこの問題を最終的にどのように解決したかです。

  1. イントラネットページ用のカスタム投稿タイプを作成しました。
  2. Functions.phpに "force_login"関数を追加しました
  3. 必要なすべてのページテンプレートファイルの先頭に強制ログイン機能が含まれています。

これをカスタマイズして、特定のユーザーだけに許可することができます。たとえば、@ Membersに記載されている "Members"プラグインを使用します。

コード:

functions.php /

/* Require Authentication for Intranet */

function my_force_login() {
global $post;

if (!is_user_logged_in()) {
    auth_redirect();
    }
}    

page-intranet.phpとsingle-intranet-pages.phpの先頭に

<?php my_force_login(); ?>

以上です。それは働いています。

セキュリティ上の注意

  • その理由は正確にはわかりませんが、この方法の安全性が完全に保証されているとは思われません。
  • これは私の状況ではうまくいきますが、もしあなたが防弾のセキュリティを必要とするなら、もう少し掘り下げてください。
  • 詳細については、下記の@ Mridulの回答を参照してください。

あなたがより安全なこれのための簡単な方法があるならば、それを下に残してください、そして、私はそれを答えとしてマークします。

2
timshutes

特定のページでコンテンツの表示/非表示を非公開に設定できます。これにより、訪問者はコンテンツを表示するためのWordPressログインおよびアクセス許可レベルを持つ必要があります。私がお勧めするのは、 "イントラネット"ページ用のtemplate-intranet.phpを作成し、イントラネットの一部であるページ用のカスタムメニューを追加して、そのページにリストできるようにすることです。それでも、すべてのページのステータスを非公開に設定する必要があります。

すべてのイントラネットページを非公開にするための回避策はfunctions.phpになります。現在のページが「イントラネット」ページのサブページであるかどうかをチェックするための条件文を書くことができます。ユーザーはログインしており、リダイレクトされていない場合は、続行しない場合。

1
Rezen

手動で認証を管理し、それをWordPress認証にラップする場合は、@ Rezenが正しいアイデアを持ちます。ただし、認証を確認するには、特定のページテンプレートまたはページテンプレートのリストを使用することをお勧めします。

Justin Tadlockの "Members"プラグインを見ることもできます。おそらく、利用できるカスタムの役割管理がたくさんあります。

1
Jason Rhodes

フィルタ:

add_filter('template_include', 'theme_check_user_permissions', 1, 1);
add_filter('logout_url','theme_logout_redirect');
if(!current_user_can('edit_users')) add_filter( 'wp_die_handler', create_function('',"return 'theme_wp_die_handler';"));

ユーザーが登録されていない場合は、サイトのログインページにリダイレクトします(guest.php、ダッシュボードなし)。

function theme_check_user_permissions($template) 
{
    return (is_user_logged_in() ? $template : TEMPLATEPATH.'/guest.php');
}

ログイン後にホームページにリダイレクト

function theme_logout_redirect($url, $redirect = null)
{
    return $url.'&amp;redirect_to='.urlencode(get_bloginfo('url'));
}

Wp die pageを削除する(家にリダイレクトする)

function theme_wp_die_handler()
{
    wp_redirect(get_bloginfo('url'),307);
    exit;
}
1
Vladimir

これは timshutesの回答を修正したものです - 特定のページにログインを要求し、それらをカスタム投稿タイプにしたくない場合は、functions.phpに追加できます。

add_shortcode('need_login', 'shortcode_needLogin');

function shortcode_needLogin() {
    if (!is_user_logged_in()) {
        auth_redirect();
    }
}

そして、あなたがログインを要求したいページの上部で、あなたはただすることができます:

[need_login]
1
Chris Rae