teratail header banner
teratail header banner
質問するログイン新規登録
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

JavaScript

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

Q&A

解決済

1回答

3754閲覧

【WordPress】PHPからjsにJSONで値を渡したいのですが、エラーが出ます。

nao_tyrol

総合スコア16

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

JavaScript

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

0グッド

0クリップ

投稿2022/08/17 09:52

編集2022/08/22 14:21

0

0

前提

ワードプレスを使ってイベントページを作成しており、
そのsingleページにContactForm7のフォームを挿入しています。
フォームの中にデイトピッカーを設けており、最小日・最大日を設定したいと考えています。

各記事ごとに選択できる日付の範囲を変えたいので、
カスタムフィールドで最小・最大の日付を選択し、これを反映できるようにしたいです。
js内にあるデイトピッカーの中で、PHPで取得した日付を出力することが希望です。

発生している問題・エラーメッセージ

■single.php

PHP

1//デイトピッカーに日付選択範囲を追加する 2<?php 3 $jsonString = json_encode($dataArray, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); 4 $date_start = [date_format(date_create(get_field('イベント開始日')), 'Y,m,d')]; 5 $date_end = [date_format(date_create(get_field('イベント終了日')), 'Y,m,d')]; 6 if($date_end){ 7 $ads_s = json_encode($date_start); 8 $ads_e = json_encode($date_end); 9 }else{ 10 $ads_s = json_encode($date_start); 11 $ads_e = json_encode($date_start); 12 } 13 ?>

■script.js

js

1$(function () { 2 let $ads_s = JSON.parse('<?php echo $ads_s; ?>'); 3 let $ads_e = JSON.parse('<?php echo $ads_e; ?>'); 4 console.log($ads_s); 5 console.log($ads_e); 6 7 $("#custom-datepicker").datepicker({ 8 language: 'ja', 9 dateFormat: 'yy年mm月dd日(D)', 10 minDate: new Date(JSON.parse("<?php echo $ads_s[0]; ?>")), 11 maxDate: new Date(JSON.parse("<?php echo $ads_e[0]; ?>")) 12 }); 13});

single.php内では、「echo $ads_s」 で、["2022, 08, 01"]のような形で配列が出力できていることを確認しています。
しかし、jsファイルにJSONを用いたphpの配列が出力されません。

console.logで確認したところ、下記のようなエラーが出ております。

Uncaught SyntaxError: Unexpected token '<', "<?php echo"... is not valid JSON

検証モードでjsを確認したところ、
理想は下記のようになっていてほしいのですが、

js

1let $ads_s = ["2022, 08, 01"];

このようになってしまいます。

js

1 let $ads_s = JSON.parse('<?php echo $ads_s; ?>');

どのようにすれば、エラーが解消できるかお力添えいただきたいです。

最終的に下記のコードで解決しました!

忘備録として記載します。
▼footer.php

php

1<?php 2 //カスタムフィールドで開始日と終了日を取得 3 $jsonString = json_encode($dataArray, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); 4 $date_start = date_format(date_create(get_field('イベント開始日')), 'Y/m/d'); 5 $date_end = date_format(date_create(get_field('イベント終了日')), 'Y/m/d'); 6 if(get_field('イベント終了日')){ 7 $ads_s = json_encode($date_start); 8 $ads_e = json_encode($date_end); 9 }else{ 10 $ads_s = json_encode($date_start); 11 $ads_e = json_encode($date_start); 12 } 13 14 // スマートカスタムフィールドで除外日をデイトピッカーを使って記載したものを、新しい配列に格納する 15 $get_group = SCF::get('deleteDayArray'); 16 $get_delete_day = []; 17 $i = 0; 18 foreach ($get_group as $fields) { 19 $event_time = esc_html($fields['deleteDay']); 20 $get_delete_day[$i] = date_format(date_create($event_time), 'Y/m/d'); 21 $i++; 22 } 23 24 $today = date("Y/m/d"); 25 //除外日の入力がないとき、今日の日付が自動的に入力されていたため本日の日付で分岐 26 if($get_delete_day[0] !== $today){ 27 $get_delete_day_array = json_encode($get_delete_day); 28 }else{ 29 //昨日以前の日付は選択に含めないため、除外日の入力がないときは昨日の日付を入れる 30 $get_delete_day_array[0] = date("Y/m/d",strtotime("yesterday")); 31 $get_delete_day_array = json_encode($get_delete_day); 32 } 33?> 34<?php if (is_singular("event")): ?> 35 <script> 36 $(function (){ 37 var disableDates = JSON.parse('<?php echo $get_delete_day_array; ?>'); 38 // ContactForm7のデイトピッカーにカスタムフィールドで設定した最大・最小日を設ける 39 $("#custom-datepicker").datepicker({ 40 language: 'ja', 41 dateFormat: 'yy年mm月dd日(D)', 42 beforeShowDay : function(date) { 43 var disableDate = $.datepicker.formatDate('yy/mm/dd', date); 44 if (disableDates.indexOf(disableDate) !== -1) { 45 return [false, '']; 46 }else{ 47 return [true, '']; 48 } 49 }, 50 minDate: new Date(JSON.parse('<?php echo $ads_s; ?>')), 51 maxDate: new Date(JSON.parse('<?php echo $ads_e; ?>')), 52 }); 53 }); 54 </script> 55<?php endif; ?> 56

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

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

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

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

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

guest

回答1

0

ベストアンサー

PHPタグが使えるのは(設定しなければ)拡張子が.phpのファイルだけで通常は.jsが拡張子のJavaScriptファイルに書いても反映されません。
.js拡張子でもPHPが実行されるように設定を変える(非推奨)か、そのJavaScriptファイルの拡張子を.phpにするか、
その部分だけPHP(HTML)のscriptタグに直接JavaScriptコードを書くかどれかですかね。

とりあえずこんな感じのテストコードを動かしてみましたが、動きました。
提示の範囲ではなぜコメントのようになるのかちょっとわからないです。

php

1<?php 2//デイトピッカーに日付選択範囲を追加する 3/* 4$jsonString = json_encode($dataArray, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); 5$date_start = [date_format(date_create(get_field('イベント開始日')), 'Y,m,d')]; 6$date_end = [date_format(date_create(get_field('イベント終了日')), 'Y,m,d')]; 7*/ 8$date_start = [date_format(date_create('2017-04-01'), 'Y,m,d')]; 9$date_end = [date_format(date_create('2018-03-31'), 'Y,m,d')]; 10 11if ($date_end) { 12 $ads_s = json_encode($date_start); 13 $ads_e = json_encode($date_end); 14} else { 15 $ads_s = json_encode($date_start); 16 $ads_e = json_encode($date_end); 17} 18?> 19<!DOCTYPE html> 20<html lang="ja"> 21 22<head> 23 <meta charset="UTF-8"> 24 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 25 <title>Document</title> 26 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.min.css"> 27</head> 28 29<body> 30 <div> 31<?php 32 echo($ads_s.'から'.$ads_e.'の間で選べます'); 33?> 34 </div> 35 <input type="text" id="custom-datepicker"> 36 <script src="https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script> 37 <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> 38 <script> 39 $(function () { 40 let $ads_s = JSON.parse('<?php echo $ads_s; ?>'); 41 let $ads_e = JSON.parse('<?php echo $ads_e; ?>'); 42 console.log($ads_s); 43 console.log($ads_e); 44 45 let test = JSON.parse('<?php echo $ads_s; ?>'); 46 console.log(test); 47 console.log(test[0]); 48 49 $("#custom-datepicker").datepicker({ 50 language: 'ja', 51 dateFormat: 'yy年mm月dd日(D)', 52 minDate: new Date((JSON.parse('<?php echo $ads_s; ?>'))[0]), 53 maxDate: new Date((JSON.parse('<?php echo $ads_e; ?>'))[0]) 54 }); 55 }); 56 </script> 57</body> 58 59</html>

投稿2022/08/17 10:14

編集2022/08/18 04:56
RiaFeed

総合スコア2703

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

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

nao_tyrol

2022/08/17 14:21

ありがとうございます!試してみます!
nao_tyrol

2022/08/18 02:19

ご回答ありがとうございました!アドバイスをいただいた通り PHPのscriptタグに直接JavaScriptコードを書いてみました。 すると、また別のエラーが出てしまいました。 Uncaught SyntaxError: Unexpected end of JSON input 検証ツールで該当のjs部分を確認すると、下記のようにphpの部分が全て消えてしまっています。 let $ads_s = JSON.parse(""); let $ads_e = JSON.parse(""); PHP内でechoをしてみると、データ自体は格納されているようです。 何か表記がおかしいでしょうか…?
nao_tyrol

2022/08/18 11:34

わざわざテストコードでも試していただきありがとうございました…! RiaFeed様の検証モードではjs内のPHPは表示されているのですね…。 何がおかしいのかもう少し試行錯誤してみます。
nao_tyrol

2022/08/22 00:55

色々と試して、エラーが解消されました! single.phpに記述していたコードを footer.phpに記載したscript.jsの直前に記載すると動きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問