こんにちは
投稿タイプによって、カスタムフィールドの数が違うであろうからです。
投稿タイプによってカスタムフィールドの数が違う、というのは wp_post の post_type によって制御されるもので、wp_postmeta の存在とはあまり関係がありません。
wp_postmeta には post_type フィールドが無く、そのレコードがどのカスタム投稿タイプと紐づくかなどには無関心です。
metaテーブルが存在する理由は「任意のカスタムフィールドを追加できるように」です
ユーザーにもカスタムフィールドを追加できます。
ECサイトでは住所なんかが欲しいでしょうか、フォーラムのような機能ではそんなものは不要ですよね。
任意のフィールドを追加できるように wp_user_meta があるのです。
ありがとうございます。素人なので変な質問だったらすみません。
metaテーブルが存在する理由は「任意のカスタムフィールドを追加できるように」です
まずこちらは仰る通りと思います。記事の場合は投稿タイプごとに必要なカスタムフィールドが変わりますよね。
たとえば「今日の日記」という投稿タイプなら「今日会った人」というカスタムフィールドが必要で、「IR情報」という投稿タイプなら「売上」などのカスタムフィールドが必要だとします。
このようなときにwp_popst_metaがあれば便利ですが、wp_postsだけしかないとカラムを追加せざるを得ず、「日記」の行に「売上」のカラムが追加されてしまい、そこにはNULLを入れざるを得ません。
なので、wp_postsにはwp_post_metaがあってしかるべきとは思います。
でもどうして、wp_usersにwp_user_metaが必要でしょうか?ユーザーの場合ならこのような問題は起こらないのに。
metaテーブルが存在する理由は「任意のカスタムフィールドを追加できるように」です
記事の場合は、先述した問題の回避するためにwp_post_metaが必要だとは思います。
しかしユーザーの場合は、任意のフィールドが追加されたら、wp_usersのカラムを増やせばいいのでは?なぜ別テーブルの wp_user_metaを増やすのでしょうか?
wp_postsだけしかないとカラムを追加せざるを得ず、「日記」の行に「売上」のカラムが追加されてしまい、そこにはNULLを入れざるを得ません。
wp_usersにwp_user_metaが必要でしょうか?ユーザーの場合ならこのような問題は起こらないのに。
wp_users でも同じ問題が起こります。
ECサイトを構築した場合、woocommerce など主要なプラグインでは wp_users に顧客データを追加します。
当然ながら、顧客の請求先住所、請求先電話番号、配送先住所、配送先電話番号など多数のカスタムフィールドが追加されます。
これを仰るように wp_users に横持ちさせたとします。
ところが、管理画面でブログを投稿するユーザー、商品をするユーザーや、注文一覧を見てピッキングするユーザー(要するに、WordPressの普通のユーザー)には配送先住所は不要です。
NULL が入らざるを得ません。
同じ WordPress で bbPress などを使ってフォーラムを作成しました。
フォーラムユーザー特有のカスタムフィールドが追加されますが、それらは woocommerce の顧客や WOrdPressの管理ユーザーには不要なので NULL が入ります。
もちろん、bbPress のユーザーにも配送先住所は不要なので NULL が入ります。
また、このようにしてテーブルのフィールドが100以上にもなってしまった場合、そんなテーブルを管理するのはご免こうむりたいですね。
それから私の感覚では、WordPress に限らず、アドオン機能がアプリケーション本体の設計を変更してしまうような作りはナンセンスだと思います。
(そういうものもあるにはありますが)
どこの誰か分からない人が作ったアドオン機能で設計が変更されたものを、どうやったら安心して使えるでしょうか。
おお、厚いご経験が大変心強いですね。ありがとうございます。汎用的に作ってくれているんだなと改めてWordPressに感心しました。
こんばんは。夜分に失礼致します。
もしお時間ございましたらひとつご相談にのっていただけないでしょうか。
カスタム投稿タイプでなく、テーブルを作るべきか、という件です。
現状はカスタム投稿タイプ「post_news」を作り、そのカスタムフィールドに「date,genre」などがたくさんあるのですが、これをループで取得する際、どうしても次のようにget_post_meta()を何度も実行しなければなりませんよね。
$args = array(
$meta_query = array(
array(
'key' => 'key_1',
'value' => 'val_1',
'compare' => '=',
),
);
);
$query = new WP_Query( $args );
if( $query->have_posts() ){
while ( $query->have_posts() ){
$post_id = get_the_ID();
$post_datas = [
'date' => get_post_meta( $post_id, 'date' );
'genre' => get_post_meta( $post_id, 'genre' );
// などがたくさん
];
}
}
そこで思ったのですが、いっそのこと「post_news」をカスタム投稿タイプでなく独自テーブル「wp_news」とし、そのカラムに「date,genre」などを入れてはどうかと思いました。
こうすると取得は次のSQLで済みますので、上のようにget_post_meta()を何度も実行するよりも早いのではないかと考えたのですが、この考え方は正しいでしょうか?
$post_datas = $wpdb->get_results(
"
SELECT *
FROM wp_news
WHERE key_1 = 'val_1'
"
);
そしてもしかしたら、独自テーブルが作れる人で、かつ手間を惜しまない人であれば、カスタム投稿タイプよりも独自テーブルの方が常に勝っているともいえるでしょうか?
常に勝っているかどうかは観点によると思いますので、それには回答できません。
全てのカスタムフィールドを一度に取得する get_post_custom という関数があるので、それを使えばどうですか?
それに、SQL を使える人が wp_post_meta から1つの SQL で必要な値を一度に取得できないなんていうことは無いと思います。
しかし独自のテーブルを作るのは自由なので、そうした方が良いとお考えならそうされたらいいと思います。
get_post_custom 知りませんでした。ありがとうございます。
なるほど、追加質問ですみませんでした。