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

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

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

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

WordPress

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

PHP

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

1回答

966閲覧

Wordpressのカスタム投稿で閲覧履歴を記事ページやトップページに表示したい

haru-_-ki

総合スコア2

Cookie

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

WordPress

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

PHP

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2021/09/23 02:24

■問題
Cookieを利用して閲覧履歴を表示させるが、single.php でエラーが出てしまい解決できませんでした。
エラー内容はいくつか出ています。

Warning: array_diff(): Expected parameter 1 to be an array, null given (ファイルまでのパス) cookies.php on line 22 Warning: array_values() expects parameter 1 to be array, null given in (ファイルまでのパス) cookies.php on line 23 Warning: count(): Parameter must be an array or an object that implements Countable in (ファイルまでのパス) cookies.php on line 27 Warning: implode(): Invalid arguments passed in (ファイルまでのパス) cookies.php on line 27 Warning: Cannot modify header information - headers already sent by (output started at (ファイルまでのパス) cookies.php:22) in (ファイルまでのパス) cookies.php on line 35

■解決したいこと
Wordpressのカスタム投稿(カスタム投稿スラッグで指定)でユーザーの閲覧履歴一覧をトップページや記事詳細ページなどに表示したい。
エラーの解消。

■該当コード

<head>の直下 cookies.php として以下のコードを作成、テンプレートして読み込み
cookies.php <?php //閲覧履歴設定 global $history; //記事ページのみcookieに登録 if (is_singular('カスタム投稿スラッグ')) { //カスタム投稿スラッグを指定 //閲覧履歴用のcookieが存在する場合 if (isset($_COOKIE['history'])) { //配列にする $history = explode(",", $_COOKIE['history']); //cookieに現在の記事IDがあるかどうか調べる $aruno = in_array($post->ID, $history); //ある場合の処理 if ($aruno == true) { //cookieにある現在の記事IDを削除(順番整理&表示除外用) $history = array_diff($rireki, array($post->ID)); $history = array_values($rireki); } //cookieが5個以上ある場合、4個に減らす if (count($rireki) >= 4) { $set_rireki = array_slice($rireki, 0, 4); } else { $set_rireki = $history; } //cookieに登録 $touroku = $post->ID.','.implode(",", $set_rireki); setcookie('history', $touroku, time() + 7776000, '/'); //cookieに現在の記事IDが無い場合の処理 } else { $touroku = $post->ID; setcookie('history', $touroku, time() + 7776000, '/'); } //記事ページ以外ならcookieの読み込みのみ } else { if (isset($_COOKIE['history'])) { $history = explode(",", $_COOKIE['history']); } } ?>

表示したい箇所に以下を記述(試しにトップページに記述したところ問題なく表示されました)

<?php global $history; if (!empty($history)): ?> <?php $args = array( 'post_type' => 'カスタム投稿スラッグ', 'posts_per_page' => 5, 'post__in' => $history, 'orderby' => 'post__in', ); ?> <?php $the_query = new WP_Query($args); ?> <?php if ($the_query->have_posts()): ?> <?php while ($the_query->have_posts()) : $the_query->the_post(); ?> <!-- ループ処理 --> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); ?> <?php endif; ?>

勉強不足で申し訳ありません。
情報として不足している場合はご指摘ください。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Warning: array_diff(): Expected parameter 1 to be an array, null given (ファイルまでのパス) cookies.php on line 22

22 行目は、

$history = array_diff($rireki, array($post->ID));

ですか?

エラーメッセージからすると 1つ目のパラメータの $rireki が配列ではなくて、null と言っていますが...

変数名の間違いがないか確認することとエラーが出ている行で使用している変数や配列を var_dump で、中のデータを確認しながらデバッグしてみると解決しないでしょうか。


Warning: Cannot modify header information - headers already sent by (output started at (ファイルまでのパス) cookies.php:22) in (ファイルまでのパス) cookies.php on line 35

35行目で、setcookie を実行しようとしたらすでに ヘッダが送信されるから変更できなかったと言っていますね。

header や setcookie 等のHTTPヘッダを変更する関数を使用する場合は、画面出力を行う前に処理する必要があります。

<head>の直下 cookies.php として以下のコードを作成、テンプレートして読み込み

ということですが、 <head> の画面出力が出ているのでエラーになっているのではないでしょうか。

元のファイルの 最初の <?php の後で、画面出力の前に記載するとこのエラーは解決しないでしょうか。

投稿2021/09/23 09:51

CHERRY

総合スコア25171

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

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

haru-_-ki

2021/09/23 11:46

CHERRY さん コメントありがとうございます。 ご指摘の通り cookies.php の $rireki に配列が入っておりませんでした。変数名に誤りがありました。 また、Cookieを設定を<html>の前で実行することでエラーの回避もできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問