質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

3186閲覧

(WordPress) JavaScriptで保存したCOOKIEをPHPで取得して、次回以降は非表示にできるクッションページを作りたい。

Bonkk

総合スコア10

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/01/10 13:06

編集2022/01/10 21:35

■ やろうとしていること
ここ数日、「次回以降は非表示にできる警告」を外部サイトに飛ぶ際に表示させられるようにコードを組んでいます(こちらは以前に投稿した質問です)。

試行錯誤の末、「cookieの値がなければクッションページを挟む」コードを組むことにしました。
厳密には、cookieが保存されているかどうかによって引数として渡した外部URLを書き換えて表示するテンプレート(ショートコード)を作りました。

機能は以下の通りです:
0. cookieを取得。PHP関数、isset($_COOKIE[cookieの名前])で情報を取得しています。
0. もしcookieが無効・保存されていなければ、渡した外部URLを"(クッションページのURL)/?(外部URL)"と書き換えて表示。リンクをクリックすると一旦クッションページに飛ぶ様になります。
0. もしcookieが保存されていれば、渡した外部URLをそのまま表示。クリックすると直で指定したサイトに飛ぶ様になります。

また、クッションページにはcookieを保存するためのボタンを設置しました。cookieを保存するJavaScriptのコードをボタンで実行する使用です。ボタンを押すと、自サイトを更新した際に直リンクだけが表示されるようにしようと試みています。

やろうとしていることの図解です(見にくくてごめんなさい・・・):
期待している結果
重視しているポイントは、**「ユーザーが任意でCOOKIEを保存できる」**というところです。

■ 困っていること
0. 「初アクセス時、外部URLをクリックしたらクッションページへ飛ぶ」
0. 「クッションページでボタンを押してcookieを保存(JavaScript)」
0. 「次回アクセス時、cookieを取得(PHP)して値があれば直で外部サイトへ飛ぶ」
という流れが動作することは確認済みです。

しかし、ショートコードにして引数を渡せる様に編集を加えたらたらうまく動かなくなってしまいました・・・。cookieを保存しても、外部URLをクリックするとクッションページに移動する様になってしまいました。

以下、テンプレートのショートコードです(開発環境のfunction.phpに貼り付けてあります):

PHP

1<?php 2function rewrite_url($atts){ 3 4$ext_url = $atts[0]; //(外部URL) 5$cushion_url ="https://example-site/cushion/?$atts[0]"; 6 7if(isset($_COOKIE["external"])){ 8?> 9 10<a href=<?php print $ext_url; ?> rel="nofollow noopener" target="_blank">外部サイト直リンク</a> 11 12<?php 13} //if終わり 14 15else{ 16?> 17 18<a href="<?php print $cushion_url; ?>" rel="nofollow noopener" target="_blank">クッションページ経由</a> 19 20<?php 21} //else終わり 22} //function終わり 23 24add_shortcode('template','rewrite_url'); 25?>

以下、クッションページ側のコードです。

HTML

1 2 <p> 3 これより先は、外部サイトです。<br> 4 移動を希望しない場合は、下の「もどる」をクリックしてください。<br> 5 </p> 6 7 <button NAME="dont-show" VALUE="cookieに保存" ONCLICK="SetId('dontshow')">今後このページを表示しない</button> 8 9 <script type="text/javascript"> 10 function SetId(strNum) { 11 var name = "external"; // クッキーの名前 12 var value = strNum; // クッキーの値 13 document.cookie = name + "=" + escape(value); 14 window.alert('cookieを保存しました'); 15 } 16 </script> 17 18 <a href="<?php echo $_SERVER['QUERY_STRING']; ?>">このまま移動する</a> 19 20 <a href="javascript:history.back()">もどる</a>

どこか間違っているのでしょうか・・・?
まとまりのない質問ですみません。
なにかベターなやり方などをご存知でしたらぜひお教えください m(_ _)m

■ 補足
動作環境:Mac
Wordpressのテーマ: Luxeritas
サーバ: Mixhost
ブラウザ: Chrome(Incognito モード)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こんばんわ。

「次回アクセス時、cookieを取得(PHP)して値があれば直で外部サイトへ飛ぶ」

それ、技術的にできないと思います。

ただ、できない話だけするのもどうかと思うので、案を出したいと思います。

ユーザーが外部リンクへの転送を認めた後は、クッションページから外部ページへ

転送するようにします。

これで、クッションページをまたいでいないように「見せかける」ことができます。

コードを以下に示します。

まずはHTMLから。

HTML

1<html> 2<head> 3 <meta charset="UTF-8"> 4 <title>TEST</title> 5</head> 6<body> 7 <p><a href="http://localhost/cushion.php?url=https://www.yahoo.co.jp/">yahoo</a></p> 8 <p><a href="http://localhost/cushion.php?url=https://www.google.co.jp/">google</a></p> 9</body> 10</html> 11

以下はクッションページです。

PHP

1<?php 2 // cushion.php 3 4 $url = filter_input(INPUT_GET,'url'); 5 6 // クッキーのキーに'auto_redirect'がある場合 7 if(isset($_COOKIE['auto_redirect'])){ 8 // auto_redirectがtrueの場合、$urlに転送 9 if($_COOKIE['auto_redirect'] === 'true'){ 10 header('location:'.$url); 11 exit(); 12 } 13 } 14 15?> 16<html> 17<head> 18<meta charset="UTF-8"> 19<title>クッションページ</title> 20<script> 21 // チェックボックスをクリックするとこのコードが実行される 22 function write_cookie(){ 23 if(document.getElementById('auto_redirect').checked) { 24 // チェックされている場合 25 // クッキーに auto_redirect=true と書き込む 26 document.cookie = 'auto_redirect=true'; 27 } else { 28 // チェックされていない場合 29 // クッキーに auto_redirect=false と書き込む 30 document.cookie = 'auto_redirect=false'; 31 } 32 } 33</script> 34</head> 35<body> 36<p><a href="<?php echo $url; ?>">転送先のページ</a></p> 37<input type="checkbox" id="auto_redirect" onclick="write_cookie();" /> 次回から自動的に転送する 38</body> 39</html> 40

チェックボックスにチェックを入れると、以降クッションページから外部リンクへ

自動的に転送するようになります。

動作も確認しています。

こんな感じでどうでしょうか?

投稿2022/01/11 08:33

srsnsts

総合スコア480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bonkk

2022/01/11 12:31

お世話になっております! 度々丁寧なご回答ありがとうございます。 >「次回アクセス時、cookieを取得(PHP)して値があれば直で外部サイトへ飛ぶ」 すみません、少し言葉が足りていませんでした。自分が期待していたものは、「cookieが保存してあれば直リンクを表示、そうでなければクッションページへのリンクを表示」するテンプレートです。ユーザーが警告(クッションページ)を非表示にすることを選択した時、次回以降はそもそもクッションページを経由させたくなかったのです。 自己解決して組んだコードは、思う通りに動いてくれたので今のところ満足しています。 この先組んだコードがネックになってしまったら、ぜひ srsnsts さんの回答を参考にさせてください。
srsnsts

2022/01/11 13:11

コメントありがとうございます。 外部リンクをテンプレートでコントロールできる状況なら、 もう私は何も言うことはないです。 私のコードはあくまで、外部リンクが手作業で入力される場合にのみ有効ですから。 問題は解決したようで何よりです。 あとはあれかな、RSSかな?
guest

0

クッキーは面倒が多いのでセッションで処理してみては?

//mypage.html

javascript

1<script> 2window.addEventListener('DOMContentLoaded',()=>{ 3 let hide; 4 const url="api.php"; 5 const toggleHide=async(flg=null)=>{ 6 const param=(flg!==null)?`?hide=${flg}`:""; 7 hide=await fetch(url+param).then(res=>res.json()).then(x=>x.hide); 8 btn.value=hide?"表示":"非表示"; 9 hoge.toggleAttribute('hidden',hide); 10 } 11 toggleHide(); 12 btn.addEventListener('click',()=>{ 13 toggleHide(!hide); 14 }); 15}); 16</script> 17<div id="hoge">hoge</div> 18<input type="button" id="btn" value="">

//api.php

PHP

1<?PHP 2session_start(); 3$hide=filter_input(INPUT_GET,"hide",FILTER_VALIDATE_BOOL); 4if(!isset($_SESSION["hide"]) and is_null($hide)){ 5 $hide=false; 6} 7if(!isset($_SESSION["hide"]) or !is_null($hide)){ 8 $_SESSION["hide"]=$hide; 9} 10$data=["hide"=>$_SESSION["hide"]]; 11print json_encode($data);

クッキーのsamesite設定は必要そうですね

投稿2022/01/11 05:23

編集2022/01/11 05:37
yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bonkk

2022/01/11 12:23

ご回答ありがとうございます! 大変お恥ずかしいのですが、そもそもセッションというのは何かを理解しきれていませんでした・・・。 もうすこし調べてから改めて実装を検討してみようと思います。
guest

0

自己解決

自己解決しました!
問題は、クッションページ側のコードにありました。
今回は document.cookie の path を設定していなかったのですが、自分のブラウザに保存された cookie を確認したところ path が勝手に /cushion(クッションページのスラッグ)となっていました。これにより、保存した cookie はクッションページでのみ有効となってしまったため、うまくいかなかったのだと思われます。

JavaScriptの部分を以下のコードに変更したところ、思う様に動いてくれました:

JavaScript

1function SetId() { 2 document.cookie = "name=value; path=/;" 3 window.alert('cookieを保存しました。'); 4 }

主な変更点は:
0. cookie の値を変数で設定することをやめたこと。
0. document.cookie に path オプションを追加し、path=/ と明記したこと。

以上です。

「もっといいやり方があるよ」、「そもそもクッションページ作らない方がいいよ」といった方はぜひぜひお教えください!宜しくお願いします m(_ _)m

投稿2022/01/10 16:50

編集2022/01/10 21:27
Bonkk

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問