LoginSignup
12
11

More than 5 years have passed since last update.

WordPressでページ分割して2ページ目以降はログインしないと見れないパターン

Last updated at Posted at 2016-06-10

ページの分割

投稿本文内で <!--nextpage--> 使う(デフォルト)。
あるいは プラグイン Custom Nextpage を使う。

2ページ目以降に直アクセスされた時

投稿がページ分割されている場合、2ページ目以降は未ログインのユーザは閲覧できないように1ページ目に戻す。

<?php
add_action( 'pre_get_posts', 'mytheme_single_login' );
function mytheme_single_login( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( $query->is_single() ) {
        if ( ! empty( $query->query_vars['page'] ) ) {
            if ( ! is_user_logged_in() ) {
                wp_redirect( get_permalink( $query->query_vars['p'] ) );
                exit;
            }
        }
        return;
    }
}

ページ分割部分を改変して、ログイン部分をつくる

  • ページが分割されていない場合は何もしない。
  • ページ分割されていてもログインしている場合はページのリンクが出る。
    • Custom Nextpage は wp_link_pages をオーバーライドするので特にPHPを書く必要はない。
  • プラグイン Gianism を使うとSNSアカウントでのログイン可能。WordPressのユーザー情報との連携も可能なのでお手軽。そうじゃない場合はよしなに実装。
    • ログインしたあとはどこにリダイレクトさせるかは gianism_login の第3引数で。

single.php あたりにある wp_link_pages()mytheme_multipage_must_login() に置き換える。

<?php
function mytheme_multipage_must_login() {
    global $multipage;
    if ( ! empty( $multipage ) ) { // multipage
        if ( is_user_logged_in() ) {
            wp_link_pages( array(
                'before'      => '<div class="page-links">',
                'after'       => '</div>',
                'link_before' => '<span class="page-num">',
                'link_after'  => '</span>',
            ) );
        } else {
            if( function_exists( 'gianism_login' ) ){
                gianism_login( '', '', get_permalink() );
            } else {
                // Gianism 使っていない場合はこの辺にログイン処理なりリンクなり入れておく
                // @link : https://codex.wordpress.org/Function_Reference/wp_login_form
                wp_login_form();
            }
        }
    }
}

管理バーの処理

権限グループが閲覧者の場合は管理バーを出さない(お好みで)

<?php
add_filter( 'show_admin_bar', 'mytheme_show_admin_bar' );
function mytheme_show_admin_bar( $show_admin_bar ) {
    if ( current_user_can( 'subscriber' ) ) {
        $show_admin_bar = false;
    }
    return $show_admin_bar;
}

ログアウトの処理

権限グループが閲覧者の場合はHOMEに戻す(お好みで)

<?php
add_filter( 'logout_redirect', 'mytheme_logout_redirect', 10, 3 );
function mytheme_logout_redirect( $redirect_to, $requested_redirect_to, $user ) {
    if ( isset( $user ) && in_array( 'subscriber', $user->roles ) ) {
        $redirect_to = home_url( '/' );
    }
    return $redirect_to;
}

なお、これらのコードはテーマの fucntions.php に書くよりはプラグイン化したほうがいいでしょう。
その場合、テーマの wp_link_pages() を置き換える場合は

<?php
if ( function_exists( 'mytheme_multipage_must_login' ) ) {
    mytheme_multipage_must_login();
} else {
    wp_link_pages( array(
        'before'      => '<div class="page-links">',
        'after'       => '</div>',
        'link_before' => '<span class="page-num">',
        'link_after'  => '</span>',
    ) );
}

って書くのが親切。

12
11
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
12
11