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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

1回答

763閲覧

WordPressのカスタムフィールドを配列で更新する方法について

ogyougi

総合スコア60

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/04/30 00:49

###実現したいこと
WordPress初心者です。ユーザーのカスタムフィールドを更新するにあたって、その法則に悩まされています。

ユーザーのカスタムフィールド(user_meta「'c_user'」)に次のような「氏名と年齢」の配列を入れたいと思っているのですが、➀と➁の問題が発生し実現できない状況です。

php

1array ( 2 array( 3 'name' => 'a', 4 'age' => '26' 5 ), 6 array( 7 'name' => 'b', 8 'age' => '21' 9 ), 10); 11

###発生している問題
2点あります。

➀1回目の追加で空の配列が存在すること。
➁2回目の追加で配列の形式が変わること。

これらの問題が生じる処理をご説明させて頂きます。

###試したこと
問題が生じる処理はこうです。

php

1$id = 1; 2 3// 現状のデータを取得し、 4$c_user = get_user_meta( $id, 'c_user' ); 5 6// 追加するデータを作り、 7$add = array ( 8 'name' => 'c', 9 'age' => '19' 10); 11 12// 現状のデータに追加し、 13$c_user[] = $add; 14 15// 情報を更新する 16$new = serialize($c_user); 17update_user_meta( $id, 'c_user', $new );

上の処理によってまず1つ目の問題➀が生じます。
つまり、まだデータが空の状況で処理すると、次のように空の配列が存在するということです。

php

1array(2) { 2 [0]=> 3 string(0) "" 4 [1]=> 5 array(2) { 6 ["name"]=> 7 string(1) 'c' 8 ["age"]=> 9 string(2) "19" 10 } 11} 12

さらに上に続いて同じ処理を行うと、今度は2つ目の問題➁が生じます。
つまり、配列の形式が変わって次のようになるということです。

PHP

1array(2) { 2 [0]=> 3 string(65) "a:2:{i:0;s:0:"";i:1;a:2:{s:4:"name";s:1:"c";s:3:"age";s:2:"19";}}" 4 [1]=> 5 array(2) { 6 ["name"]=> 7 string(1) 'c' 8 ["age"]=> 9 string(2) "19" 10 } 11} 12

正直この仕様に戸惑っており訳がわからないのですが、如何様にして冒頭のような配列が実現されるのでしょうか?

原因と正しいソースコートについて教えていただけましたら幸甚に存じます。
何卒、宜しくお願い申し上げます。

###バージョン
wordPress 5.0.3
PHP 7.3.4

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

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

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

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

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

guest

回答1

0

まず、update_user_meta / get_user_meta は内部的に serialize 処理がされるので、特にユーザーがする必要がありません。
また、複数の情報を同じキーで登録すれば、配列で取り出せるので、わざわざ配列に入れて渡す必要もありません。

PHP

1$add = array ( 2 'name' => 'c', 3 'age' => '19' 4); 5update_user_meta( $id, 'c_user', $add ); 6$add = array ( 7 'name' => 'c', 8 'age' => '19' 9); 10update_user_meta( $id, 'c_user', $add ); 11 12$c_user = get_user_meta( $id, 'c_user' ); 13var_dump( $c_user ); // これを見てみてください。

配列を入れるなら、こんな感じだと思います。

PHP

1// 既に値が入っている場合結果が変わる可能性が有るので、メタキーを変えています 2$x_user = get_user_meta( $id, 'x_user', true ); // 一つだけの値として取り出す 3if ( !$x_user ) $x_user = []; 4$add = array ( 5 'name' => 'c', 6 'age' => '19' 7); 8$x_user[] = $add; 9update_user_meta( $id, 'x_user', $new ); 10 11$x_user = get_user_meta( $id, 'x_user' ); 12var_dump( $x_user ); // これを見てみてください。

投稿2019/04/30 02:32

kei344

総合スコア69400

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

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

ogyougi

2019/04/30 06:47 編集

ご回答誠にありがとうございます。よく把握せずに使っておりました。「こんな感じ」の方について質問よろしいでしょうか?「$new」がどこから来たのか戸惑ってしまいましたが、こちらは「$x_user」のこと(「$x_user[] = $add;」によって、「$add」が追加された「$x_user」)のこと」でしたか?そのように解釈して「update_user_meta( $id, 'x_user', $x_user );」としてみたのですが、管理画面には「Notice: Array to string conversion in....」のエラーが表示されてしまいます。やはりシリアライズしないと入らないのではないでしょうか?
kei344

2019/04/30 07:01

> 「$new」 $x_userのことです、すみません。 >管理画面には「Notice: Array to string conversion in....」のエラーが表示されてしまいます。 他のコードが残っていませんか? 配列も渡せますよ。 【関数リファレンス/update user meta - WordPress Codex 日本語版】 https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/update_user_meta#.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF > $meta_value > (mixed) (必須) $meta_key で指定したメタデータの新しい値。現在の値とは異なっていなければならない。配列とオブジェクトは自動的にシリアル化される。 【update_user_meta() | Function | WordPress Developer Resources】 https://developer.wordpress.org/reference/functions/update_user_meta/
ogyougi

2019/04/30 07:32

他のコードが残っている影響かと思い、普通に header.php に下記だけ書いたのですが、やはりそのエラーです。何か初心者がやりがちなミスなどございませんでしょうか? $array = array('3','9'); update_user_meta( get_current_user_id(), 'c_user', $array );
ogyougi

2019/04/30 07:34

こちらなら入ります。 $text = '39'; update_user_meta( get_current_user_id(), 'c_user', $text );
ogyougi

2019/04/30 08:13 編集

ちなみにエラーの全文です。 Notice: Array to string conversion in /・・・/wordpress/wp-includes/formatting.php on line 1111Array ファイル名からしてフォーマットするための部分に問題がありそうに見受けられますが。何かヒントになりますでしょうか? 1111行目といえばこちらですが、私には何がなにやら。 $string = (string) $string;
kei344

2019/04/30 08:29

まずc_user以外で試してください。
ogyougi

2019/04/30 08:40

変わりなく同様のエラーでしたが、それはどのようなお考えから試すべきだと思われたのでしょうか。もしよろしければお聞かせいただけませんでしょうか。
kei344

2019/04/30 08:52

c_userで書いたコードが配列を対象にした際に問題があるコードである可能性があるので、べつのキーにして確認するほうが問題を切り分けられるからそう書きました。予想ではget_current_user_idの値が取れていないとかそういった問題だとは思います。 とくにあなたの邪魔をする意図は有りませんが、実質解決につながっていないようなので、これ以上のコメントは控えますね。 --- 下記コードで「array(1) { [0]=> array(1) { [0]=> array(2) { ["name"]=> string(1) "c" ["age"]=> string(2) "19" } } } 」が出力されることを確認しました。 function x_test( $args ) { $id = get_current_user_id(); // 既に値が入っている場合結果が変わる可能性が有るので、メタキーを変えています $x_user = get_user_meta( $id, 'x_user', true ); // 一つだけの値として取り出す if ( !$x_user ) $x_user = []; $add = array ( 'name' => 'c', 'age' => '19' ); $x_user[] = $add; update_user_meta( $id, 'x_user', $x_user ); $x_user = get_user_meta( $id, 'x_user' ); var_dump( $x_user ); // これを見てみてください。 } add_filter( 'admin_footer_text', 'x_test');
ogyougi

2019/04/30 09:27

なるほど、おそらく誤解されていらっしゃるかもしれません。話題にしたいのはvar_dumpの表示ではなく、管理画面の表示についてです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問