ログイン/ログアウト後に遷移元のページにリダイレクトする方法―WP-Members

2019年4月22日WordPressプラグインの設定&カスタマイズ

WordPressで会員制サイトを作ったときに、ログインの流れをカスタマイズしたくなったことはありませんか?

WP-Membersのプラグインで会員制サイトを作ったけど、ログインした後の動作が思うようにいかない…。

「ログインしてから入力してください」というようなフォームを作りたい。

こんなときは簡単なカスタマイズでログイン後に、遷移元のページに戻ったり、指定したページに移動させることができます。

ログイン リダイレクト 遷移元 ページ

ログイン/ログアウトした元のページのデータをセッション(SESSION)に保存

ログインウィジェット以外でログインする場合は、単純な元のページに戻るリダイレクトではログイン元のページに戻ることができません。

一旦ログインページに移動するので、ページを移動してもデータを保持できるセッション(SESSION)を使います。

header.php<header>の下にコードを記述

<?php  //ログインページ以外でセッションにページのURLを保存
  if(is_page('1603')){ //is_page('★')←★にログインページのidを入れる
  } else {
  session_start();
  unset($_SESSION['gopage']);
 	$_SESSION['gopage'] = $_SERVER["REQUEST_URI"];
}
 ?>

これでどこのページからログインしたか、ログアウトしたかをサーバーが覚えていてくれます。

途中のページをスキップして何個か前のページに戻りたい場合などでは、ログインページのidを入れたところを配列(array)にしてスキップしたいページのidを指定することで対応できますね。

<?php  //ログインページ以外でセッションにページのURLを保存
  if(is_page(array(3343,785,787,2076,3488,3484,276,4674))){ //スキップしたいページのidを指定
  } else {
  session_start();
  unset($_SESSION['gopage']);
 	$_SESSION['gopage'] = $_SERVER["REQUEST_URI"];
}
 ?>

ログイン後に元のページに戻るリダイレクト

元いたページに戻りたい場合と、指定したページに戻りたい場合をIF文で条件分岐します。

セッションにはホームURL(https://saya-to.com/)以降のスラッグが保存されているので、スラッグを使って条件分岐します。

functions.phpにコードを記述

// ログイン後のリダイレクト
add_filter( 'wpmem_login_redirect', 'my_login_redirect', 10, 2 );
function my_login_redirect( $redirect_to, $user_id ) {
$ref = $_SESSION['gopage']; //セッションに保存された遷移元のページ
if($ref == '/session-redirect-page/' || $ref == '/login-redirect-page/' || $ref == '/previous-page/'){
return $ref; //元のページに戻る
}
elseif (strstr($ref, '/include-this-word')) {
return $ref;
}
return 'https://saya-to.com/mypage/';
// 条件に一致しない場合ではマイページに移動する
}

1つめの条件ifでは、セッション(SESSION)に保存したURLが指定したページのURLと一致するかどうかで条件分岐しています。

単純なページならこれで振り分け可能です。||で区切っていくつでも追加することができます。

==を2つの等号にするのを忘れるミスに注意。

2つめの条件elseifでは、セッション(SESSION)のURL内に指定したスラッグが含まれているかどうかで条件分岐しています。

カスタム投稿などをまとめて全て対象にしたい場合や、親子関係のあるページ、フォームのGETなどでURLに変数(場合によって変わる文字列)が含まれている場合にこの方法を使います。

条件を増やしたい場合はelseifでいくつでも追加することができます。

単語や数字だけではなくスラッグの記号を含んだ形(/word)にした方がエラーが出にくいのでおすすめです。

最後に、if文の外にログイン後の基本的なリダイレクト先のURLを指定します。

ログイン後なので、マイページを指定するか、CTA(お問合せや商品購入ページなど、してほしいアクション)、ホームページを指定するなどユーザーの動きを意識して指定しましょう。

全てのページでログインした元のページに戻したい場合は、if文を削除して最後の行のURLの所に$refを指定するか、直接$_SESSION['gopage’]を指定するだけです。

ログアウト後に元のページに戻るリダイレクト

ログアウト後のリダイレクトも、フィルターフック名が違うだけで、中身は同じです。

// ログアウト後のリダイレクト
add_filter( 'wpmem_logout_redirect', 'my_logout_redirect' );
function my_logout_redirect(){
$ref = $_SESSION['gopage'];
if($ref == '/session-redirect-page/' || $ref == '/loout-redirect-page/' || $ref == '/previous-page/'){
return $ref;
}
elseif (strstr($ref, '/include-this-word')) {
return $ref;
}
return 'https://saya-to.com/mypage/';
}

上手く行かないときにエラーをわかりやすくするための方法

上記の作業をしたのにうまくリダイレクトしない場合は、どこかの記述を間違えている可能性が高いです。

どの段階で間違えてしまったのかを確認するために、ログインページでセッション(SESSION)に保存されているURLを確認できるようにします。

page-login.phpを作成し、子テーマに追加します。

<?php get_header(); ?>

<?php get_template_part('module_pageTit'); ?>
<?php get_template_part('module_panList'); ?>
<div class="section siteContent">
<div class="container">
<div class="row">
<div id="main" class="col-md-8 mainSection" role="main">
<div class="myp">

<h2><?php echo $_SESSION['gopage']; ?></h2><!-- ここにセッションに保存したURLを表示させる -->

<!-- このループで固定ページの内容を出力 -->
<?php if(have_posts()): while(have_posts()): the_post(); ?>
<?php the_content(); ?>
<?php endwhile; endif; ?>

</div>
</div>
<div class="col-md-3 col-md-offset-1 subSection sideSection">
<?php get_sidebar(get_post_type()); ?>

</div><!-- [ /.subSection ] -->

</div><!-- [ /.row ] -->
</div><!-- [ /.container ] -->
</div><!-- [ /.siteContent ] -->
<?php get_footer(); ?>

テーマの基本的な固定ページのテンプレートを使い、メインセクション(mainSection)の中でループを作ると固定ページで表示されるはずのコンテンツをそのまま表示させることができます。

Lightningを使っている人はコピペでOK。

コンテンツの上に見出しタグ(h2)を作り、中身にPHPのechoセッション(SESSION)に入れたURLを表示させています。

このページを作った後に動作をテストします

見出しタグの中に何も入っていない場合や、意図したページのURLが入っていない場合はセッションを入れる段階(header.php)のエラー。

正しいURLが入っているのに、意図したページに移動できない場合は。リダイレクトの指定(functions.php)のエラーです。

大体この作業で何を間違えてしまったかの推測ができると思います。

正しく動作していることが確認できたら、FTPソフトでpage-login.phpを削除するのを忘れないようにしましょう。