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

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

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

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

PHP

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

Q&A

解決済

1回答

858閲覧

カスタムフィールドの値は「カンマ区切り」か「シリアライズされた配列」か

waru

総合スコア16

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/02/28 06:33

編集2019/02/28 06:42

カスタムフィールドの保存方法について教えてください。

保存する値として、適切なのはどちらですか?(どんなケースでどちらが適切ですか?)

【A】カンマ区切り
apple,orange

【B】シリアライズされた配列
a:2:{i:0;s:5:"apple";i:1;s:6:"orange";}

管理画面から見やすいのは【A】かと思うのですが、しかしチェックボックスの値は自動的にBの形式で保存されるので、統一感を考えれば【B】がいいのか?と悩んでいます。

また、もし【B】が良いとしたら、値がapple1つだけ(複数入ることはない)であってもそのようにしますか?

みなさんのお考えや、一般的な使い方など、メリットデメリットがあれば教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

シリアライズする方で
シリアライズ処理はいちいち書く必要なし

WPはメタデータの関連の共通処理に
シリアライズの処理が備わっているので
配列を直接入出力する処理を書いても動くようにできてます

wp-includes/meta.php

単なるコンマ区切りは、値の一つにコンマが入ったらどうするの?
みたいな問題があるので結構注意が必要だったり面倒です

同じフィールドのデータが文字列だったり配列だったりすると
毎度型チェックしなくちゃいけなかったり面倒なので
配列と決めたフィールドは値が一つでも配列にします

投稿2019/02/28 07:13

KazuhiroHatano

総合スコア7804

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

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

waru

2019/03/01 00:19

なるほど、ありがとうございます。少なくとも、投稿者のIPアドレスが1件入るフィールドが配列というのはおかしいですよね?複数のユーザーIDが入るフィールドではいかがでしょうか。「1,13,27」のような感じです。こういうケースは配列でしょうか?
KazuhiroHatano

2019/03/01 01:43

配列で WPが面倒見てくれるので、いちいちimplodeとかせずに update_post_metaとかには配列のままブッこみましょう
waru

2019/03/01 02:53

わかりました!とにかく配列でやってみることにします。ありがとうございます。
waru

2019/03/01 03:13 編集

すみません、1点だけお願い致します。 <?php var_export(get_user_meta( $current_uid, 'comment_id' ) ); ?> としたときに下のように配列が空なのに、 array ( 0 => '', ) でもなぜか <?php echo count( get_user_meta( $current_uid, 'comment_id' ) ); ?> とすると 1 がechoされてしまうのですけど、 お手数ですが、これについてご意見頂けませんでしょうか。
KazuhiroHatano

2019/03/01 03:19

array ( 0 => '', )は空じゃないです それを空と判定したいならarray_filterとかして 空の文字列の要素を削除します
waru

2019/03/01 03:47

array ( 0 => '', ) だった場合カウントすると1件になりますし、 array ( 0 => '123', ) の場合でも1件になりますし、困りますね。 そこでarray_fiterを使うというと、 具体的には <?php echo count( get_user_meta( $current_uid, 'comment_id' ) ); ?> をどう書き直せばいいのでしょうか?? ていうか、普通はどうやってるんですか? 「それを空と判定したいなら」という言い回しからは、何かもっと普通のやり方があるような意図が感じられますが。
KazuhiroHatano

2019/03/01 04:18

空ならちゃんとfalsyな値が返るようにしておきたいです 空の文字列も入ってない本当に空の配列を入れておくのでもいいですが WPの場合は値が空の場合はdelete_user_metaとかして値を削除しておきたいです この場合はfalseが返ることになるのでそれに対応しなくちゃいけませんが
waru

2019/03/01 11:16

ありがとうございます。つまりこういうことでしょうか。 ↓ 空なら「delete_user_meta」されるように設定すること。 そうすれば「array ( 0 => '', )」さえ削除されるため、「count」しても1が返ることはない。 最後に、falseが返る場合への対応とは、どのようなものですか?
KazuhiroHatano

2019/03/01 11:29

count(false)とかしたら「配列じゃないぞコレ」ってPHPに怒られるので count(get_◯◯_meta(...))とか横着したらダメ まあ止まりはしないですが怒られない方がいいので 面倒だけど丁寧に if($hoge=get_◯◯_meta(...)){ echo count($hoge).'個あるよ'; } else{ echo 'ひとつもないよ'; } みたいな感じに まあifの中で代入処理するのは リーダブルコード的には良くないんですが それぐらいの横着は許して
KazuhiroHatano

2019/03/01 11:31

どのみち更新時に値が空の場合に delete_user_metaをするしないに関わらず 値が未設定だとget_◯◯_metaはfalseを返すので 値がfalseだった場合への対応は必要です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問