🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

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

PHP

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

Q&A

1回答

841閲覧

WP:$_POSTされる値が同じなのに、保存される値が変化してしまう

ringorin

総合スコア40

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/09/26 03:05

編集2019/09/26 13:24

たびたびのご質問恐れ入ります。Wordpressのユーザーカスタムフィールドについてお詳しい方いらっしゃいましたら、ご回答宜しくお願いいたします。

###実現したいこと
プロフィール更新時に発動するフックprofile_updateですが、ここで配列を$_POSTしたときに、そのままの配列が保存されるようにしたいです。

###発生している問題
こちら【save_1】ですが、
入力値は[["age"=>20,"name"=>"smith"]]なのに(←タイプミスでした)
入力値は[{"age":20,"name":"smith"}]なのに
なぜか保存値が変化してしまい、下図のように意味不明な"H"なる値が保存されます。

▼【save_1】

php

1add_action( 'profile_update', 'save_1' ); 2function save_1( $user_id ) { 3 $cf_key_arr = ['user_meta_test']; 4 foreach( $cf_key_arr as $cf_key ){ 5 $post_striped_decoded = json_decode( stripslashes( $_POST[$cf_key] ) ); 6 update_user_meta( $user_id, $cf_key, $post_striped_decoded ); 7 } 8} 9 10

▼【save_1の保存値】
"H"
イメージ説明

###試したこと
保存したい値は[["age"=>20,"name"=>"smith"]]という配列なので、【save_1】のときみたいに入力せず、コードに直に$test_arrと書いてみました。こちらの【save_2】です。

すると下図のとおり無事保存されました。これと同じ値を$_POSTを用いて保存したいというのが目的です。

▼【save_2】

php

1add_action( 'profile_update', 'save_2' ); 2function save_2( $user_id ) { 3 $cf_key_arr = ['user_meta_test']; 4 foreach( $cf_key_arr as $cf_key ){ 5 $test_arr = [["age"=>20,"name"=>"smith"]]; 6 update_user_meta( $user_id, $cf_key, $test_arr ); 7 } 8}

▼【save_2の保存値】
[{"age":20,"name":"smith"}]
イメージ説明

###さらに試したこと
上の【save_1】と【save_2】で保存値が違うということは、送信値が違うのだと考えました。

そこで次の【save_log】ようにerror_logをかけてみたところ、なんと、同じ送信値だったのです。

コメントアウトしてあるように、
➄の$post_striped_decodedをエンコードした$post_striped_decoded_encoded
➅の$test_arrをエンコードした$tset_arr_encoded
同じ値だと確認できます。

よって、それぞれエンコードする前の
【save_1】の$post_striped_decoded
【save_2】の$test_arr
同じ送信値だということです。

▼【save_log】

php

1add_action( 'profile_update', 'save_log' ); 2function save_log( $user_id ) { 3 4 $cf_key_arr = ['user_meta_test']; 5 foreach( $cf_key_arr as $cf_key ){ 6 7 // ➀送信値をエンコードしてログに出す 8 $post_init_encoded = json_encode( $_POST[$cf_key] ); 9 error_log( '$post_init_encoded :' . $post_init_encoded ); 10 11 // ➁送信値からスラッシュを削除してログに出す 12 $post_striped = stripslashes( $_POST[$cf_key] ); 13 error_log( '$post_striped :' . $post_striped ); 14 15 // ➂送信地からスラッシュを削除したものを、エンコードしてログに出す 16 $post_striped_encoded = json_encode( stripslashes( $_POST[$cf_key] ) ); 17 error_log( '$post_striped_encoded :' . $post_striped_encoded ); 18 19 // ➃送信値からスラッシュを削除したものを、デコードしてログに出す 20 $post_striped_decoded = json_decode( stripslashes( $_POST[$cf_key] ) ); 21 error_log( '$post_striped_decoded :' . $post_striped_decoded ); // 779行目 22 23 // ➄送信値からスラッシュを削除してデコードしたものを、エンコードしてログに出す 24 $post_striped_decoded_encoded = json_encode( $post_striped_decoded ); 25 error_log( '$post_striped_decoded_encoded :' . $post_striped_decoded_encoded ); 26 27 // ➅普通の配列を、エンコードしてログに出す 28 $test_arr = [["age"=>20,"name"=>"smith"]]; 29 $tset_arr_encoded = json_encode( $test_arr ); 30 error_log( '$tset_arr_encoded :' . $tset_arr_encoded ); 31 32 33 /* 34 35 ■ 管理画面からの入力値 36 [{"age":20,"name":"smith"}] 37 38 ■ 管理画面で更新をクリックしたときのerror_log出力結果 39 [26-Sep-2019 13:01:34] $post_init_encoded :"[{\\"age\\":20,\\"name\\":\\"smith\\"}]" 40 [26-Sep-2019 13:01:34] $post_striped :[{"age":20,"name":"smith"}] 41 [26-Sep-2019 13:01:34] $post_striped_encoded :"[{\"age\":20,\"name\":\"smith\"}]" 42 [26-Sep-2019 13:01:34] PHP Notice: Array to string conversion in /wordpress/wp-content/themes/test/functions.php on line 779 43 [26-Sep-2019 13:01:34] $post_striped_decoded :Array 44 [26-Sep-2019 13:01:34] $post_striped_decoded_encoded :[{"age":20,"name":"smith"}] 45 [26-Sep-2019 13:01:34] $tset_arr_encoded :[{"age":20,"name":"smith"}] 46 47 */ 48 49 } 50} 51

###状況のまとめ
つまり
【save_1】の$post_striped_decoded
【save_2】の$test_arr
同じ送信値であるにも関わらず、

それなのに【save_2】の保存値だけが、意味不明な"H"なる値になってしまうということです。別にそこまでエッチじゃないのに笑…困ります。

どのようにすれば$_POSTの値を用いて【save_2の保存値】と同じ[{"age":20,"name":"smith"}]という値を保存することができるようになりますでしょうか?

解決策に留まらず、原因や考えられる問題点など広くご意見頂戴できましたら幸いです。
不足情報等ございましたら仰ってください。

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

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

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

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

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

guest

回答1

0

入力値がJSONでないからです。

PHP

1[["age"=>20,"name"=>"smith"]] 2```↓ 3```JSON 4[{"age":20,"name":"smith"}]

【JSON】
https://www.json.org/json-ja.html

投稿2019/09/26 03:10

編集2019/09/26 03:11
kei344

総合スコア69596

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

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

ringorin

2019/09/26 03:53 編集

すみません、そちらは質問時のタイプミスですので、どうか気にしないでください。
ringorin

2019/09/26 11:55

他にはいかがでしょうか、気になる点や陥りがちなことなど、もしお心あたりがございましたら。普通は配列など送りませんか?ネットにもこのような事例が見当たらず、手詰まりな感じです。
kei344

2019/09/28 17:51

1. DBに保存された値を確認する(問題の切り分け) 2. 表示のコードに問題がある可能性 3. profile_update フックに複数の関数が登録されている可能性
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問