ページの分割
投稿本文内で <!--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>',
) );
}
って書くのが親切。