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

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

ただいまの
回答率

87.60%

user_metaに「空の値」がある理由と対処方法

解決済

回答 1

投稿 編集

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

score 16

WordPressのuser_metaですが、なぜ「空の値」が作られるんですか?

以下STEP1と2でその厄介な点を示すので、対処方法を教えて頂けませんでしょうか。

STEP1

まず初期状態として、管理画面のmeta_testの入力欄には何も入力していない状態です。それを出力してみます。

$uid = get_current_user_id();
$meta_test = get_user_meta( $uid, 'meta_test' );
var_export($meta_test);

上のようにすると
array ( 0 => '', )
になる状態です。

この「空の値」がある状態が、とてつもなく厄介に感じます。

STEP2

STEP1の状態に1を追加します。

$uid = get_current_user_id();
$meta_test = get_user_meta( $uid, 'meta_test' );
$meta_test[] = '1'; 
$meta_result = serialize($meta_test);
update_user_meta( $uid, 'meta_test', $meta_result );
var_export($meta_test);

上のようにすると
array ( 0 => 'a:2:{i:0;s:0:"";i:1;s:1:"1";}', )
になる状態で、

アンシリアライズすると下記になりますが、STEP1で「空の値」があったせいで、下記でも当然それがあります。ものすごく厄介です。

array(2) {
  [0]=>
  string(0) ""
  [1]=>
  string(1) "1"
}


いったいなぜこの厄介な「空の値」が介在し、みなさんどのように対処しているのでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

シリアライズ値を入れたいのでなければ、update_user_metaにはシリアライズせずに単一の値を指定します。

update_user_meta( $uid, 'meta_test', '1' );

get_user_metaも単一の値しか入れないのであれば、第三引数にtrueを入れましょう。

$meta_test = get_user_meta( $uid, 'meta_test', true );

【update_user_meta – WordPress私的マニュアル】
https://elearn.jp/wpman/function/update_user_meta.html

【get_user_meta – WordPress私的マニュアル】
https://elearn.jp/wpman/function/get_user_meta.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/10 11:14

    遅くなり申し訳ございません。質問が悪く意図が伝わっていなかったようなので、質問を下記のように変えさせてください。

    たとえばこのようにしますよね。'test_meta' は何も入力されていない初期状態です。

    $uid = get_current_user_id();
    $new_arr = array('999');
    $current_arr = get_user_meta( $uid , 'test_meta' );
    $update_arr = array_merge( $current_arr, $new_arr );
    var_export($update_arr);

    上のときに次の出力になり、「最初の空の配列」が厄介だという話です。邪魔じゃないですか?
    array ( 0 => '', 1 => '999', )

    どのようにすれば次のような出力にできるでしょうか?
    array ( 0 => '999', )

    キャンセル

  • 2019/04/10 11:30

    入っているかどうか確認してからarray_mergeすればよいだけですよ。もしくは空の状態でupdate_user_metaしなければよいのでは。
    データとしてtest_metaが存在しているからその問題が起こるので、それを保存しないようにする(もしくは無視するように組む)しかないと思います。

    で、serializeして配列を入れていますが、update_user_metaは内部でserializeしてくれるのでそれをする必要がありません。そして配列に値を追加したいのであれば、単一のmetaとして取り出すほうが良いです、という回答です。

    キャンセル

  • 2019/04/10 11:40

    なるほどありがとうございます。わかったと思います。

    キャンセル

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

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

関連した質問

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