いつもお世話になっております。WordPressのユーザーカスタムフィールドについての質問です。
宜しくお願い致します。
###実現したいこと
下記問題にあるように、fuctions.phpから配列を保存しようとすると、配列が文字列になってしまいますが、これを配列のままで保存したいです。
###発生している問題
これはそもそものWordpress仕様なのでしょうか。
update_user_meta()
で配列を保存する際の挙動ですが、保存場所によって保存値に下記の違いが生じてしまい、統一した保存ができません。
保存場所 | 保存値 |
---|---|
header.phpでの保存 | 配列 |
fuctions.phpでの保存 | 文字列 |
どうすればfuctions.phpからの更新でも、配列のままで保存できるでしょうか。
###該当のソースコード
こちらがheader.phpに書かれている、読み込み時に保存する処理です。
php
1$ucf_key = 'user_meta_test_1'; 2$test1 = [ 3 ['date' => 2019,'id' => 10], 4 ['date' => 2019,'id' => 20] 5]; 6 7/* 後述のようにここで $test1 を error_log() をしました */ 8 9update_user_meta( get_current_user_id(), $ucf_key, $test1 );
続いてこちらがfunctions.phpに書かれている、管理画面から保存する処理です。
php
1add_action( 'profile_update', 'save_prof_fields_test1' ); 2function save_prof_fields_test1( $user_id ) { 3 4 $ucf_key_arr = ['user_meta_test_1']; 5 foreach( $ucf_key_arr as $ucf_key ){ 6 7 /* 後述のようにここで $_POST[$ucf_key] を error_log() をしました */ 8 9 update_user_meta( $user_id, $ucf_key, $_POST[$ucf_key] ); 10 } 11}
###試したこと
上のheader.phpとfunctions.phpについて、それぞれerror_log()
を出して送信値を確認してみました。
まずheader.phpの送信値$test1
について、error_log()
した結果です。
これはサイト読み込み時に出力されます。
error_log( '$test1 :' . json_encode( $test1, JSON_UNESCAPED_UNICODE ) );
$test1 :[{"date":2019,"id":10},{"date":2019,"id":20}]
続いてfunctions.phpの送信値$_POST[$ucf_key]
について、error_log()
した結果です。
これは管理画面で「プロフィールを更新」をクリックしたときに出力されます。
error_log( '$_POST[$ucf_key] :' . json_encode( $_POST[$ucf_key], JSON_UNESCAPED_UNICODE ) );
$_POST[$ucf_key] :"a:1:{i:0;a:2:{i:0;a:2:{s:4:\\"date\\";i:2019;s:2:\\"id\\";i:10;}i:1;a:2:{s:4:\\"date\\";i:2019;s:2:\\"id\\";i:20;}}}"
このように、functions.phpの方では送信の時点で文字列になってしまうようという仕様のようです。
どのようにすればこれを配列で保存できるのかご教授頂けましたら幸いです。
###補足
ちなみにfunctioins.phpでの保存の場合にだけ文字列として保存される。ということの確認は次のとおりです。
まずheader.php読み込み時の管理画面の表示が【あ】で、その後管理画面で「プロフィールを更新」をクリックして表示されるのが【い】となっており、【い】が文字列になっていることが確認できました。
尚、【あ】【い】の表示コードは次のとおりです。
($cf_data_arr
をループしているために、値が配列である【あ】ではピンク色のテーブルが表示されていますが、文字列になってしまった【い】ではループができずエラーが表示されています。)
php
1add_action( 'show_user_profile', 'prof_fields_test1', 10, 1 ); 2add_action( 'edit_user_profile', 'prof_fields_test1', 10, 1 ); 3function prof_fields_test1( $user ) { 4 $u_id = $user->ID; 5 $ucf_key_arr = ['user_meta_test_1']; 6 echo '<h3>テスト情報</h3>'; 7 foreach( $ucf_key_arr as $ucf_key ){ 8 echo '<h4>'.$ucf_key.'</h4>'; 9 echo '<table>'; 10 echo '<tbody>'; 11 echo '<tr>'; 12 $cf_data_arr = get_user_meta( $u_id, $cf_name, true ); 13 $i=0; 14 foreach( $cf_data_arr as $cf_data ){ 15 echo '<td>'; 16 echo '<input type="text" name="'.$cf_name.'['.$i.'][date]" value="'.$cf_data['date'].'">'; 17 echo '<input type="text" name="'.$cf_name.'['.$i.'][id]" value="'.$cf_data['id'].'">'; 18 echo '</td>'; 19 $i++; 20 } 21 echo '</tr>'; 22 echo '</tbody>'; 23 echo '</table>'; 24 $textarea = maybe_serialize($cf_data_arr); 25 echo '<textarea>'.$textarea.'</textarea>'; 26 } 27}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。