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

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

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

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

WordPress

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

PHP

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

Q&A

1回答

413閲覧

ワードプレスサイト内で記事閲覧履歴を表示したい

tell_tell

総合スコア6

Cookie

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

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/05/01 12:27

編集2018/05/01 12:27

前提・実現したいこと

ワードプレスサイト内の特定の記事を閲覧した履歴を表示させたい。

初めて利用させていただきます。
知識経験とも乏しいフリーランスですので、言葉足らずや至らない点ございましたら申し訳ありません。

某企業サイトに表題のような新機能を実装させる、という案件を受けました。
製作、管理者が多忙なためはみ出た案件との事。
post_typeを複数持つサイトで、それに応じてsingle.phpも複数持つサイトです。
(例 single-a.php single-b.phpなど)

特定のpost_typeで投稿された記事(仮にsingle-s.php)の閲覧履歴をサイト内で表示させる事により回遊率を上げたい、との事で、最初はプラグインで対処しようとしましたが、上手く稼働させられませんでした。

その為、テーマに直接書いていこうと試みています。
まず、single-s.phpの最上部に以下のように記述を加えました。ちなみにこのPHPファイルには<?php get_header( $name ); ?>がなく、その部分は直書きされています。

ここから
$id = get_the_ID();

if ($_COOKIE['visit']) {
$arr = $_COOKIE['visit'];
array_push($arr, $id);
$_COOKIE['visit'] = array_reverse(array_values(array_unique($arr)));
$count = $_COOKIE['visit'];
}
else {
$count = array($id);
}
setcookie("visit", $count);
ここまで

変更を保存したのち記事ページを見に行ってもエラーは出ていないのですが、ブラウザのクッキーを見ても保存されていません。

記述に間違いがあればエラーが返ってくるかと思いますが、それがない為、どこに間違いがあってクッキーが保存されないか突き止められない状況です。

記事個別のIDをクッキーに保管、履歴表示をしたいページにクッキーからIDを呼び出しタイトルやパーマリンクを呼び出そうと考えていたのですが、ままなりません。

どなたか、動作させる知恵を拝借できれば幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

プログラムの全体がわかりませんので、的確な回答はできませんが...
質問内容は PHP で Cookie をセットしたいという内容だと理解しました。

setcookie には、

setcookie() は、その他のヘッダ情報と共に 送信するクッキーを定義します。 ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。 <html><head> タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければなりません。

とありますが、HTML の出力より前に この部分を記載されているのでしょうか?


(追記)

WordPress のテンプレートであれば、おそらく get_header(); より前に記載していないと Cookie のセットはできないと思います。


(追記・訂正)

WordPress のドキュメントを読んでみました。

Plugin API/Action Reference

send_headers : Allows customization of HTTP headers (ref array)

と書かれていますので このアクションフック内で記述するのが良さそうです。

Plugin API/Action Reference/send headers の例を参考にして、

add_action( 'send_headers', 'add_header_setcookie' ); function add_header_setcookie() { header( 'Set-Cookie: <cookie-name>=<cookie-value>' ); }

のように Cookie をセットする感じでしょうか。

投稿2018/05/01 12:53

編集2018/05/01 14:17
CHERRY

総合スコア25171

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

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

tell_tell

2018/05/01 12:58

ご返信ありがとうございます。 通常、シングルページは<?php get_header( $name ); ?>から始まるかと思いますが、その記載はなく代わりにその部分の内容が直に書かれている状態です。 なので、一番冒頭に件の記述をした次第です。
tell_tell

2018/05/01 14:49

追記修正ありがとうございます。 リンク先を確認しましたが、英語なためすぐには読み取れなさそうです。 で、ご指摘いただいてる記述ですが、どのファイルのどこに書けばよいでしょうか?
CHERRY

2018/05/01 15:02

記載する場所は、 functions.php ですね。 もし、特定のテンプレートファイル内だけ有効にしたいとかの条件があれば、 add_header_setcookie の関数の中で、if 等で条件判断を行い、header 出力を振り分ける必要があります。 (なお、 WordPress の開発者向けドキュメントは、日本語に翻訳されてないものが結構あるので、英語に慣れておいた方が良いと思います。)
tell_tell

2018/05/01 15:20

ご丁寧な回答、ありがとうございます。 おっしゃる通り、特定のテンプレートファイル内だけ有効にしたいので「if 等で条件判断を行い、header 出力を振り分ける必要があります。」を実装しなければならないのですが、これも私のスキルでは難しいです。 厚かましくて恐縮ですが、cookieを使わずに特定記事閲覧時の履歴を表示させる方法だと、どんな方法が考えられますか?
miyabi_takatsuk

2018/05/02 05:31

横槍失礼します。 なんかかしらで、ユーザーの情報閲覧記録を、こちらで保持できればいいんですよね? セッションを使うか、 記事のカスタムフィールドに、IPを記述していくとか・・・でしょうかね。 あとは、DBに直接、IP別レコードに、閲覧記事のIDを増やしていくテーブル作って記述していくとか・・・。 セッション以外は、サーバー負担けっこうかかると思いますが。
tell_tell

2018/05/02 09:05

新たなご返信ありがとうございます。 セッションを使う方法、検討致します。 無知で申し訳ありませんが、セッションはデータをサーバーに格納するんですよね? その場合、サーバー側に設定が必要ですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問