LoginSignup
9
8

More than 5 years have passed since last update.

WordPress で特定のカテゴリーの記事はログインしないと見られないけど記事一覧などでは特定の文言に置き換えるパターン

Last updated at Posted at 2016-06-28

仕様

  • カテゴリーのスラッグが 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);

今回は本文を特定の文言に置き換えたけど、以下の記事の「ページ分割部分を改変して、ログイン部分をつくる」を応用してログイン枠を作ってもいいかもね。

あわせて読むといいかも

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8