WPで会員フローをさくっと実装しようとしたら割と大変

大まかなお話。

まずは、とにかくフロントエンドで完結したユーザーフローを実装したい!と思ったらtheme my loginというプラグインを入れるだけでほぼ解決する。

ただし、このプラグインは固定ページを生成して各フォームを出力しているので、きめ細かくカスタマイズしようとすると限界が見えてくる。

例えば、ユーザー登録時に確認画面が必要なケースなどは、自分でロジックを作らないと目的が達せられない(jsでやればいいのかな・・・)

それで、このフローだけ自分で作ろうとすると、TMLがまだ何やら裏で動いていて、エラーに悩まされることになる。

今思うと、TMLの中のテンプレートをカスタマイズして行けば、エラーは出ないが、問題はロジック。
(ひょっとしたら、TMLの固定ページとは別の固定ページを使えばよかったのか・・・未検証)

もうひとつ、ログイン失敗時に必ずWPの管理画面に連れて行かれる。これは大変困る。
以下のアクションを加えて、パッチする。

//ログイン失敗時のリダイレクト
add_action( 'wp_login_failed', 'my_front_end_login_fail' );  // hook failed login

function my_front_end_login_fail( $username ) {
   $referrer = $_SERVER['HTTP_REFERER'];  // where did the post submission come from?
   // if there's a valid referrer, and it's not the default log-in screen



   if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') ) {
      wp_redirect( $referrer . '?login=failed'/*.$errcode[0] */);  // let's append some information (login=failed) to the URL for the theme to use
      exit;
   }
}

■実は一番ハマったのは、登録終了時の自動ログインの実装。このような挙動の是非は別として、これが少々厄介であった。

WPでログインさせるためには
・ユーザーとパスワードをチェックしてuserオブジェクトを得る・・・wp_authentication($user , $pass);
・ユーザーcookieをセットする・・・wp_set_auth_cookie($user->ID, $creds[‘remember’]);
この二段階が必要。

ただしこの処理はWPの処理の一番頭でやらないと上手くいかない。
つまり、add_actionでかなり頭の方にフックして、実行させる必要があり、このためにjsでパラメータを付けてリダイレクトさせることにした。
ちなみにフックは’after_setup_theme’を使った。

ロジック全体を頭にフックさせればサーバリダイレクトが使えたかも知れないが、後の祭り・・・

しかしjsでリダイレクトした時点では、サーバ側ではログインされたつもりでも、クッキーがセットされていないし、URLにはヤバイパラメータがくっついている。

そこでもう一度リダイレクト。

そうすると、一応ログインされた状態で表示されることになる。

ショートコードを使った処理の場合、httpヘッダーなどはすでに出力しているので、wp_redirectなどは使い物にならない。
ショートコードなどは、ビューの中で使うヘルパーみたいなものなので、ロジックを書き込むべきではないのだ。
フックの使いこなしが足りなかったと大反省。

コメント

タイトルとURLをコピーしました