会員ログイン情報を記憶時の長さ変更について

2016 年 2 月 1 日

ホーム フォーラム 使い方全般 会員ログイン情報を記憶時の長さ変更について

このトピックには9件の返信が含まれ、2人の参加者がいます。1 年、 1 ヶ月前 xd さんが最後の更新を行いました。

10件の投稿を表示中 - 1 - 10件目 (全10件中)
  • 投稿者
    投稿
  • #77155

    xd
    Participant

    会員ログイン画面でログイン情報を記憶した場合、その長さを変えたいと考えています。
    該当箇所がclasses/uscshop.class.php内の

    function set_cookie($values){
    $value = serialize($values);
    $timeout = time()+7*86400;
    $domain = $_SERVER[‘SERVER_NAME’];
    $res = setcookie(‘usces_cookie’, $value, $timeout, USCES_COOKIEPATH, $domain);
    }

    のようなのですが、見ると1週間有効のようでした。
    これを変えるにはフィルタなどがあるのでしょうか?

    #77181

    nanbu
    Participant

    こんにちは

    time()とやっていますが、サーバーのtimeで良いの鼓動かも微妙なので、フィルタで対応できるように修正しようと思います。次期バージョンにて、下記の様に修正いたします。

    
    function set_cookie($values, $key='usces_cookie'){
    	$value = serialize($values);
    	$timeout = time()+7*86400;
    	$timeout = apply_filters( 'usces_filter_set_cookie_timeout', $timeout, $values, $key);
    	$domain = $_SERVER['SERVER_NAME'];
    	$res = setcookie($key, $value, $timeout, USCES_COOKIEPATH, $domain);
    }
    
    
    #77183

    xd
    Participant

    対応有難うございます。

    ところで、Cookieの有効期限なのですが、マイページログイン時に情報を記憶しているのですが、ブラウザを閉じて、もう一度開くとログアウトしています。

    Cookieに有効期限を設けない場合はクッキーの有効期限がブラウザを閉じるまでだと思うのですが、コード的に有効期限が指定されているにも係わらず、ブラウザを閉じるとCookieがなくなっているのはなにが原因なのでしょうか。

    ——————————————-
    WordPress のバージョン:4.4.1
    Welcart のバージョン:1.6.6.1512212
    ご利用のテーマ:オリジナル
    症状を確認したブラウザ:Chrome,Firefox
    サーバー(会社名、サービス名):wpx
    SSLの利用: なし
    WordPress のパーマリンク設定:カスタム /%category%/%post_id%/
    ——————————————–

    試しにfunctions.phpに以下のコードを追加して調べてみました。

    add_filter( 'usces_filter_member_login', 'WELCART_MEMBER_LOGIN' , 1 );
    function WELCART_MEMBER_LOGIN( $member )
    {
    	//Cookieを取得する
    	$values = isset($_COOKIE['usces_cookie']) ? unserialize(stripslashes($_COOKIE['usces_cookie'])) : NULL;
    
    	$values['test'] = date( 'Y-m-d H:i:s' , time() );
    
    	//中身をシリアライズする
    	$value = serialize( $values );
    
    	//1年間有効
    	$timeout = time() + 365 * 86400;
    
    	$domain = $_SERVER[ 'SERVER_NAME' ];
    
    	//クッキーをセットする
    	$res = setcookie( 'usces_cookie' , $value, $timeout , USCES_COOKIEPATH , $domain );
    
    var_dump($values);
    
    	return $member;
    }

    Cookieの有効期限を一年間にし、「test」というキーを独自に追加して現在の時刻をCookieに加えました。
    ログイン後に$_COOKIE[‘usces_cookie’]でCookieの中身を調べると現在時刻が追加されています。

    その後、「test」というキーの行はコメントアウトして、Cookieの現在時刻が更新されないようにしました。

    一回ブラウザを閉じてログイン情報が記憶されている前提で、マイページやログイン条件判定を試すと、ログインしていないことになります。

    再度ログインページを開いてログインすると独自に追加した「test」というキーとさきほどの現在時刻は変わっていません。Cookieには有効期限が設定されているようです。

    そこで推測されるのが、セッションが切れるとログイン情報も一緒になくなるのではないか? ということです。
    カートの中身はブラウザを閉じてなくなってもいいのですが、ログイン状態については維持したいと考えています。
    アドバイスお願いします。

    #77196

    nanbu
    Participant

    こちらでは、Chromeでの検証ですが、ブラウザを閉じてもログイン情報を保存されており、問題なく動作いたしております。

    #77201

    xd
    Participant

    回答有り難うございます。
    本来であればブラウザを閉じてもログイン情報が保存されているということですね。
    iPhone6のChromeでも同じ現象となってしまいます。

    それでは質問を変えさせていただきます。
    ログイン情報が保存されないとしたら、どんな原因が考えられるのでしょうか?

    私の誤解もあるかもしれないので、期待しているフローについて書きます。

    1.ショップ会員ページにアクセス
    2.ログイン画面でメールアドレスとパスワードを入力
    3.ログイン情報を記憶にチェックを入れログイン
    4.会員のマイページが表示される
    5.ブラウザを閉じる
    6.再びショップ会員ページにアクセス
    7.ログインせずに会員のマイページが表示される

    という流れを期待しています。
    しかし、実際には、7番ではなく2番となってしまいます。

    ログイン情報を記憶にチェックを入れても、必ず2番の画面が表示されるけれど、ログイン状態は維持されているのでしょうか?
    一応ログイン状態を判定する関数で調べてみても、ログインはしていないことになっています。
    しかし、Cookieは保存されています。

    なのでセッションが切れると同時に、「ログイン情報を記憶」が保存されているCookieを読みに行かず、ログアウトとみなされているのかなと推測しています。
    アドバイスよろしくお願いします。

    #77241

    nanbu
    Participant

    すみません、「ログイン情報を保存している」という言葉に語弊があったかもしれません。ログイン情報を記憶した場合は、ログイン状態を保持するのではなく、次回はログインする事無くマイページにアクセスできるというのが正しい言い方になります。

    ログイン状態を保持している訳ではありませんので、ブラウザを閉じると、次にトップページにアクセスしてもログイン状態ではありません。ただ、このまま会員ページのURLに行きますと、ログインする事無くマイページが見れるはずです。

    従いまして、cookieには残っているが、セッションは切れているというのは正常な動作です。マイページもしくはログインページにアクセスすることでログイン状態となります。

    なお、ログインウィジェットで、「記憶」にチェックを入れないでログインすると、ログイン情報はクリアされます。

    #77252

    xd
    Participant

    お忙しい中返答ありがとうございました。

    > ブラウザを閉じると、次にトップページにアクセスしてもログイン状態ではありません。

    ということですので仕様ということで理解しました。
    としますと、ブラウザを閉じた後はログイン状態ではないため、ログイン状態を判定するとやはりログインしていないということになり、ログインユーザーの分岐は出来ないということですね。

    当ショップでは、ログインユーザーだけのサービスを実施しているのですが、一度ログインしないといけないため、結構離脱率が多くて困っています。
    ブラウザを閉じた後もユーザー側には無手順でログインユーザーと認識させたいと考えています。

    なにか用意されているフィルタなどを使って、できそうでしょうか?

    とりあえず、今思いついたのは、ログイン情報のCookieは残っているので、ログイン状態の判定はwelcartの関数ではなくCookieで行うというものです。
    いかがでしょうか?

    #77395

    nanbu
    Participant

    usc-e-shop/classes/usceshop.class.php に、member_login()という関数が有ります。こちらを見ていただけたら、どの様にすれば良いかヒントが有るかと思います。

    #77434

    xd
    Participant

    member_login() を見ましたがやはりセッションと連動しているためブラウザを閉じるとダメなようです。
    継続的にログインしていることを判定するにはCookieを使うことで解決しました。
    コード置いておきます。

    //Welcartの会員ページログイン時間を変更する/////////////////////////////////////
    add_filter( 'usces_filter_member_login', 'WELCART_MEMBER_LOGIN' , 1 );
    function WELCART_MEMBER_LOGIN( $member )
    {
    	//Cookieを取得する
    	$values = isset($_COOKIE['usces_cookie']) ? unserialize(stripslashes($_COOKIE['usces_cookie'])) : NULL;
    
    	//中身をシリアライズする
    	$value = serialize( $values );
    
    	//1年間有効
    	$timeout = time() + 365 * 86400;
    
    	$domain = $_SERVER[ 'SERVER_NAME' ];
    
    	//クッキーをセットする
    	$res = setcookie( 'usces_cookie' , $value, $timeout , USCES_COOKIEPATH , $domain );
    
    	return $member;
    }
    //Welcartを会員制にする////////////////////////////////////////////////////////
    add_filter( 'usces_filter_single_item_inform' , 'SHOP_IS_MEMBERS_ONLY' , 1 );
    function SHOP_IS_MEMBERS_ONLY( $html )
    {
    
    	//Cookieを取得する
    	$values = isset($_COOKIE['usces_cookie']) ? unserialize(stripslashes($_COOKIE['usces_cookie'])) : NULL;
    
    	global $post , $usces;
    
    	//価格のパターンをセット
    	$pat = '{(<div\s?class\s?=\s?"field_price">)(.*?)(<\/div>)}i';
    
    	//フォームのパターンをセット
    	$pat2 = '{(<input\s?name\s?=\s?"inCart)}i';
    
    	//会員としてログインしていなければ
    	if(! usces_is_login() or $values[ 'rme' ] != 'forever' )
    	{
    
    		$html = preg_replace( $pat , '<div class="member-attention"><a href="' . USCES_MEMBER_URL . '" target="_blank">ログイン</a>していないため価格が表示されません</div>' , $html );
    
    		$html = preg_replace( $pat2 , '<div class="member-attention"><a href="' . USCES_MEMBER_URL . '" target="_blank">ログイン</a>していないためカートへ入れることができません</div>$1' , $html );
    
    		$html .= '<style>.field_price , .field_cprice , .itemGpExp , .skubutton{ display: none; }</style>';
    	}
    
    	return $html;
    }
    
    #77435

    xd
    Participant

    あっ訂正です。
    以下はorではなくandでした。

    //会員としてログインしていなければ
    if(! usces_is_login() and $values[ 'rme' ] != 'forever' )
10件の投稿を表示中 - 1 - 10件目 (全10件中)

このトピックに返信するにはログインが必要です。