web-dev-qa-db-ja.com

パーマリンク構造の変更により、JavaScript cookieが正しく機能しなくなった

私のサイトは、彼が初めてそのサイトにアクセスしたときにユーザーが契約ページに移動するメカニズムを必要としています。彼が契約に同意すると、それはcookieに保存されます。彼はその直後に任意のページを閲覧することができます。

Cookieにjavascriptを使用していますが、パーマリンク設定がデフォルトである限り、問題なく動作していました1(http://mydomain.com/?p=123)。

パーマリンクを変更してpostnamehttp://mydomain.com/sample-post/)にするとすぐに問題が発生し始めました。

(.htaccessファイルの変更はwordpressの推奨どおりに行われました)

問題は、ユーザーが[同意]ボタンをクリックしても、ユーザーが同意ページに何度もリダイレクトされることです。

以下はそのコードです。

header.php

        setCookie("requested_url", document.URL, 4);
        var agreement = getCookie("agreement");

        if(agreement == "yes"){
            var requested_url = getCookie("requested_url");
        }

        else{
            window.location.assign("http://mydomain.com/?page_id=22");
        }

Header.phpでは、agreeという名前のcookieがyesに設定されているかどうかをチェックします。そうであれば何もしません。 yesに設定されていない場合は、同意ページにリダイレクトします(/?page_id = 22)。このページでは契約(cookie)がに設定されています

page_id=22(page-22.php)

       <script type = "text/javascript">

            function yesbutton()
                {
                    setCookie("agreement", "yes", 5);
                    window.location.assign(getCookie("requested_url"));
                }

                </script>

        <div class="agreementButton">
            <input type = "button" onclick = "yesbutton()" value = "Accept">
        </div>

コードを調べた後、header.phpで契約の値が正しくアクセスされていないことがわかりました。

22ページ目でsetCookie("agreement", "yes", 5);は正常に動作しています。私は警告を出して、その値を取得することができます(はい)。

しかし、私がheader.phpで同じクッキーを警告すると、空白が警告されます。 header.phpでは、このコードは空白のポップアップを返します。

        var agreement = getCookie("agreement");
        alert(agreement);

これは明らかにpage-22.phpyesに設定されているクッキー(契約)がheader.phpで正しくアクセスされていないことを意味します。しかし、なぜこれが起こっているのか私は何の手がかりも得られませんでした。パーマリンクがデフォルトのデフォルトの場合、奇妙なことにすべてがうまくいきます。パーマリンクがpostnameに設定されるとすぐに、クッキー(契約)はheader.phpで空白になります。

更新:header.phpとpage-22.phpの両方に存在するsetCookieとgetCookie関数。

        function setCookie(cname, cvalue, exdays) {
            var d = new Date();
            d.setTime(d.getTime() + (exdays*24*60*60*1000));
            var expires = "expires="+d.toGMTString();
            document.cookie = cname + "=" + cvalue + "; " + expires;
        }

        function getCookie(cname) {
            var name = cname + "=";
            var ca = document.cookie.split(';');
            for(var i=0; i<ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1);
                if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
            }
            return "";
        }

これら2つの機能は両方のページでうまく機能しています。

問題は:

      setCookie("agreement", "yes", 5); 

    that is done in page-22.php sets cookie correctly.

しかし、同じcookieがheader.phpで次のようにアクセスされると

       var agreement = getCookie("agreement");

       the value of agreement is blank.

       alert(agreement) returns blank space.

手がかりやヒントは大歓迎です。

1
Sandesh Yadav

コメントから:

あなたの質問に答えるための十分な情報がありません。コードはすべてJavaScriptではなく、PHPです。さらに、JavaScriptには "setCookie"や "getCookie"という名前の関数はありません。また、使用しているライブラリを指定していません。

その答えは、setCookie関数が現在のページパスを使用しているため(クッキーにはURLパスコンポーネントが含まれているため)、URLが異なる他のページはこれらのクッキーにアクセスできませんそうですね。

これらの線に沿ったJSの問題については、あなたは別のスタックを試すべきです。これはWordPress特有の質問ではなく、一般的なJavaScriptの問題です。

1
Otto