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

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

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

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

PHP

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

Q&A

解決済

1回答

563閲覧

wpログアウト状態の時phpで$_COOKIEが取得できない

aaaa4

総合スコア2

Cookie

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

PHP

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

0グッド

1クリップ

投稿2023/01/05 06:15

前提

お世話になっております。
wordpressを勉強している者です。
現在ブログ付きwpでお気に入り機能を作ろうとしています。
phpとjsを用いて実装していますが、phpで作った機能だけうまくcookieが取得できません。
2日くらい原因を探っていて、WPアドミンにログインした状態ではうまくcookieが取得できるのにWPをログアウトした状態だと取得できないことまではわかりました。知識が浅いためなかなか原因と探し方もわからず困っています。どうかお助けください。

実現したいこと

wordpressブログのお気に入り機能
①お気に入りボタンが押されるとブラウザのcookieに記事idを保存 ← jsで実装できた。
②ページ再表示時にcookieから記事id情報を取得 ← phpで実装したいがwpにログインした状態の時だけ機能。
③お気に入り記事を一覧で表示 ← wpにログイン状態だけ表示できる

参考にしたページ
https://spreadsheep.net/wp-cookie/
https://dubdesign.net/web/wordpress/favoritebutton-page/#i-5

該当のソースコード

②のコード

<main> <?php
//デバック用dump var_dump($_COOKIE); ←ログアウトした状態だとここがすでに空 //cookieで投稿記事idが入ったcookie取得 $cookieKey = 'favorite_item'; if (array_key_exists($cookieKey, $_COOKIE)) : $checked_items = $_COOKIE[$cookieKey]; $checked_items = json_decode($checked_items);

以下略
?>

</main>

(参考)
var_dump($_COOKIE); で表示される内容 
array(0) { }

試したこと

・ブラウザ間差異なし(chrome,firefox,safari,edge)
・ディベロッパーツールで
「アプリケーション」タブから記事idが含まれるcookieは確認した
「ネットワーク」タブのリクエストヘッダーに記事idが含まれるcookieがあることは確認した
・サーバーはロリポップとxfreeを試したが同じ現象
・WPでログインした状態だと$_COOKIE取得できる。WPログインしていないと$_COOKIE取得できない。
・jsでのクッキー操作はできた(おそらくブラウザ内で完結するcookie操作のため。サーバー側でのcookie操作ではない)
・phpでのcookie操作のサイトをいろいろ回りましたがどれも$_COOKIE['key名']で簡単に取得できると書いてあるのですが、自分のケースだと全然簡単にいかなくて困っています。。。
・よくsetcookieはheadよりも前にかかないとダメとの記載は見かけますが、$_COOKIEは関係ないですよね?一応$_COOKIEの位置を上流にもっていったりもしましたが効果ありませんでした。

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

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

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

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

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

tabuu

2023/01/05 07:34

私の環境(ローカル環境)ではログアウト中も問題なくcookieが取得できています。 functions.phpに下記コードを記述することで確認できました。 var_dump($_COOKIE); cookieの名称がWordPressやプラグインが使っている名称と重複している可能性もあるので変更してみてはいかがでしょうか。
aaaa4

2023/01/05 07:45 編集

ご連絡ありがとうございます。実は自分もローカル環境(local by flywheel)ではログイン状態でも、ログアウト状態でもうまく$_COOKIEを取得できていました。 プラグインを怪しんで、全プラグインを無効にしてためしてみたこともあったのですがそれもうまくいかず。 ローカルと実環境は何が違うというのも鍵かもしれませんが、調べ方もあまり思いつかなくて、、、 上にも書いていますが実環境はロリポップとxfreeで試しています。
tabuu

2023/01/05 09:28

セキュリティソフトやWAFで削除されているかもですね。 いったん無効にして確認してみてください。 リバースプロキシ(利用していたら)やウェブサーバーの設定も合わせてご確認ください。
aaaa4

2023/01/07 15:23

問題解決しました。 結局再度サーバー会社による差異を確認したところロリポップはクッキーを取得することができました。 ちなみにクッキー取得できなかったのはxfreeという無料のサーバーのほうで、getallheadersで取得した内容にクッキーも含まれていませんでした。(無料サーバーなので何か制限がかけられているのもしれません。) 行き詰っていたのでいろいろと助言をいただきありがとうございました。 大変助かりました。
guest

回答1

0

ベストアンサー

WPが$_COOKIEをクリアしているようなら参照はできないでしょうね
ログイン=セッション=$_COOKIE
で管理しているのかもしれません
WPの環境がないので未検証ですが、ちょっとググると「Scripts n Styles」というプラグインを利用するとクッキーが利用できるというページがヒットします

いずれにしろなるべく先頭に近いところで、一旦$_COOKIEを別の変数に受けておけばブラウザが送ってきたクッキーを受け取ることは可能でしょう。

投稿2023/01/05 06:23

yambejp

総合スコア114843

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

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

aaaa4

2023/01/05 07:25 編集

早速ご回答いただきありがとうございます。 ご提案の通り一番先頭にもっていっても$_COOKIEは空でした。 やり方が間違っているのでしょうか。 ***コード <?php $temp = $_COOKIE; var_dump($temp); var_dump($_COOKIE); ?> <!doctype html> <html <?php language_attributes(); ?>> <head> 以下略 ***結果 array(0) { } array(0) { } <!doctype html> <html dir="ltr" lang="ja" prefix="og: https://ogp.me/ns#" > <head> <meta charset="UTF-8"> 以下略 ***その他 ちなみに「Scripts n Styles」はjsを扱うプラグインのようですが、jsはサーバー側でページに表示する投稿を選別する際に使用できないためできればphpでcookieを扱えるようにしたいと考えています。 自分の理解ではwebサイトは下記の順番で動いているため①の時点で記事を選別できれば必要最低限の記事が含まれたhtmlファイルがブラウザに渡されますが、もし②の部分で記事を選別するとなると全記事を含むhtmlファイルをブラウザに渡した後jsで選別しcssで不要な記事をすべて非表示にする必要があるため負荷が大きくロードも長くなってしまうのではないかと考えています。(間違ってたらご指摘ください) ①サーバー側でphpによって記事を選別しhtmlをブラウザに送る ②ブラウザでhtmlを解釈し&jsも適宜適用してページを表示
yambejp

2023/01/05 09:24

なるべく先頭の方でheader情報を確認してみてください print_r(getallheaders()); クッキーはあくまでブラウザ側の技術ですから、これで送られてきていれば情報が確認できますし 確認できなければクライアント側でクッキーの受け渡しができない仕組みになっているのかもしれません
aaaa4

2023/01/07 15:22

問題解決しました。 結局再度サーバー会社による差異を確認したところロリポップはクッキーを取得することができました。 ちなみにクッキー取得できなかったのはxfreeという無料のサーバーのほうで、getallheadersで取得した内容にクッキーも含まれていませんでした。(無料サーバーなので何か制限がかけられているのもしれません。) 行き詰っていたのでいろいろと助言をいただきありがとうございました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問