たびたびのご質問恐れ入ります。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
###試したこと
保存したい値は[["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"}]
という値を保存することができるようになりますでしょうか?
解決策に留まらず、原因や考えられる問題点など広くご意見頂戴できましたら幸いです。
不足情報等ございましたら仰ってください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/26 03:53 編集
2019/09/26 11:55
2019/09/28 17:51