仕様
- カテゴリーのスラッグが private の場合はWordPressにログインしないと記事の閲覧ができない
- ログイン後は直前に見ていたページにリダイレクトする
- ただし、権限グループが管理者の場合はダッシュボードにリダイレクトさせる
- 記事一覧、フィードでは本文を特定の文言に置き変える
ソース
条件を追加したい場合はよしなに。
このコードはテーマに追記するよりもプラグインにしたほうが良い。
my-must-login-pages.php
<?php
function my_must_login_pages() {
if ( is_feed() ) // フィードの時は除外
return;
$loginflg = false; // 条件が増えてもいいようにフラグを作っておく。 デフォルトはfalse
if ( has_term( 'private', 'category' ) ) {
$loginflg = true;
}
if ( ! is_user_logged_in() && $loginflg ) {
/*
* $loginflg が true で WordPress にログインしてなかったら
* ログイン画面へ遷移させ、ログイン後の戻り先はその直前に見ていたページ
*/
auth_redirect();
}
}
/*
* my_must_login_pages()は get_header よりもはやい段階で実行。
* クエリからWPオブジェクトが作られて(表示する内容が決まって)、テンプレートが表示される前
*/
add_action( 'wp', 'my_must_login_pages' );
/*
* このままだと管理者もそのページにリダイレクトされるので
* 管理者はダッシュボードにリダイレクトさせるよう以下を実行
*/
function my_login_redirect( $redirect_to, $request, $user ) {
// is there a user to check?
global $user;
if ( isset( $user->roles ) && is_array( $user->roles ) ) {
// 管理者かどうかチェック
if ( in_array( 'administrator', $user->roles ) ) {
// ダッシュボードにリダイレクト
return admin_url();
} else {
// redirect them to the default place
return $redirect_to;
}
} else {
return $redirect_to;
}
}
add_filter( 'login_redirect', 'my_login_redirect', 10, 3 );
/*
* 未ログインの場合、記事一覧では本文を特定の文言に置き変える
*/
function my_the_content_filter( $content ) {
$loginflg = false;
if ( has_term( 'private', 'category' ) ) {
$loginflg = true;
}
if ( !is_user_logged_in() && $loginflg ) {
$content = 'must login';
}
return $content;
}
add_filter( 'the_content', 'my_the_content_filter' );
add_filter( 'get_the_excerpt', 'my_the_content_filter' );
/*
* フィードでは本文を特定の文言に置き変える
*/
function my_content_feed( $content ) {
if ( has_term( 'private', 'category' ) ) {
$content = 'must login';
}
return $content;
}
add_filter('the_content_feed', 'my_content_feed', 10, 2);
add_filter('the_excerpt_rss', 'my_content_feed', 10, 2);
今回は本文を特定の文言に置き換えたけど、以下の記事の「ページ分割部分を改変して、ログイン部分をつくる」を応用してログイン枠を作ってもいいかもね。