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

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

ただいまの
回答率

88.92%

WP:カスタムフィールドを管理画面から更新する場合だけ、勝手に配列が文字列になってしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 288

ringorin

score 9

いつもお世話になっております。WordPressのユーザーカスタムフィールドについての質問です。
宜しくお願い致します。

実現したいこと

下記問題にあるように、fuctions.phpから配列を保存しようとすると、配列が文字列になってしまいますが、これを配列のままで保存したいです。

発生している問題

これはそもそものWordpress仕様なのでしょうか。
update_user_meta() で配列を保存する際の挙動ですが、保存場所によって保存値に下記の違いが生じてしまい、統一した保存ができません。

保存場所 保存値
header.phpでの保存 配列
fuctions.phpでの保存 文字列

どうすればfuctions.phpからの更新でも、配列のままで保存できるでしょうか。

該当のソースコード

こちらがheader.phpに書かれている、読み込み時に保存する処理です。

$ucf_key = 'user_meta_test_1';
$test1 = [
    ['date' => 2019,'id' => 10],
    ['date' => 2019,'id' => 20]
];

/* 後述のようにここで $test1 を error_log() をしました */

update_user_meta( get_current_user_id(), $ucf_key, $test1 );


続いてこちらがfunctions.phpに書かれている、管理画面から保存する処理です。

add_action( 'profile_update', 'save_prof_fields_test1' );
function save_prof_fields_test1( $user_id ) {

    $ucf_key_arr = ['user_meta_test_1'];
    foreach( $ucf_key_arr as $ucf_key ){

        /* 後述のようにここで $_POST[$ucf_key] を error_log() をしました */        

        update_user_meta( $user_id, $ucf_key, $_POST[$ucf_key] );
    }
}

試したこと

上の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をループしているために、値が配列である【あ】ではピンク色のテーブルが表示されていますが、文字列になってしまった【い】ではループができずエラーが表示されています。)

add_action( 'show_user_profile', 'prof_fields_test1', 10, 1 );
add_action( 'edit_user_profile', 'prof_fields_test1', 10, 1 );
function prof_fields_test1( $user ) {
    $u_id = $user->ID;
    $ucf_key_arr = ['user_meta_test_1'];
    echo '<h3>テスト情報</h3>';
    foreach( $ucf_key_arr as $ucf_key ){
        echo '<h4>'.$ucf_key.'</h4>';
        echo '<table>';
        echo '<tbody>';
        echo '<tr>';
        $cf_data_arr = get_user_meta( $u_id, $cf_name, true );
        $i=0;
        foreach( $cf_data_arr as $cf_data ){
            echo '<td>';
            echo '<input type="text" name="'.$cf_name.'['.$i.'][date]" value="'.$cf_data['date'].'">';
            echo '<input type="text" name="'.$cf_name.'['.$i.'][id]" value="'.$cf_data['id'].'">';
            echo '</td>';
            $i++;
        }
        echo '</tr>';
        echo '</tbody>';
        echo '</table>';
        $textarea = maybe_serialize($cf_data_arr);
        echo '<textarea>'.$textarea.'</textarea>';
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

表示されているのは、シリアライズされた文字列ですね。

WordPress の場合、カスタムフィールドに配列を保存すると自動的にシリアライズされます。

カスタムフィールドから値を読み出す場合は、必要に応じて maybe_unserialize で、アンシリアライズを実行する必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • WP:カスタムフィールドを管理画面から更新する場合だけ、勝手に配列が文字列になってしまう