データベースに複数の行を格納しようとしています。フィールド数が変わります。以下は、1行だけを格納するために使用する方法です。
<?php
if(isset($_POST['save'])){
$wpdb->insert('wp_table_name',
array(
'field_a' => $_POST['field_a'],
'field_b' => $_POST['field_b'],
'field_c' => $_POST['field_c'],
'field_d' => $_POST['field_d']
),
array(
'%s',
'%s',
'%s',
'%s'
)
);
}
?>
<form>
<input type="text" name="field_a[]"/>
<input type="text" name="field_b[]"/>
<input type="text" name="field_c[]"/>
<input type="text" name="field_d[]"/>
<input type="text" name="field_a[]"/>
<input type="text" name="field_b[]"/>
<input type="text" name="field_c[]"/>
<input type="text" name="field_d[]"/>
<input type="text" name="field_a[]"/>
<input type="text" name="field_b[]"/>
<input type="text" name="field_c[]"/>
<input type="text" name="field_d[]"/>
<button type="submit" name="save">Save</button>
</form>
いくつかのコンテキスト(投稿フィールドなど)で配列(およびオブジェクト)に対してWPが実行することは、 maybe_serialize()
/ maybe_unserialize()
を使用して、そのような型(およびそれらのみ)をシリアライズしたりシリアライズしたりすることです(文字列型)表現.
これによりワークフローが単純化されますが、そのようなデータを正しく照会できないことや移行に関する一般的な問題(シリアル化を意識しないツールやアクションによってシリアル化された文字列が簡単に破壊されるなど)が発生します。
もしあなたがカスタムテーブルのデザインをコントロールでき、それが特定の専用機能を果たすならば - あなたはおそらくあなたが最初に全体の配列を格納しないようにそれをデザインするべきです。
ポストメタを同じメタキーで保存することができます。$unique
パラメータをfalseに設定するだけです。
if(isset($_POST['save'])){
foreach ($_POST as $post_key => $post_value){
if ( 'save' === $post_key )
continue;
if ( is_array($post_value) ) {
foreach ( $post_value as $key => value ) {
add_post_meta($post_id, $post_key . '[' . $key . ']', $post_value, false);
}
}
else{
add_post_meta($post_id, $post_key, $post_value, false);
}
}
}
その後、get_post_meta ( $post_id, $post_key, false )
を呼び出して、その特定のメタキーを持つすべてのメタ値を取得できます。
もちろんこれが投稿であり、その投稿に関連したものを保存したいのであれば。例えばあなたの投稿がフォームで、その投稿をその特定のフォームのメタデータとして保存したい場合(投稿)。
さもなければ私はちょうど私が上で与えた例のようにしかしあなたが使った$wpdb->insert()
メソッドを使ってforeachの上のフィールドごとにテーブルへの1挿入をするでしょう。
<?php
if(isset($_POST['save'])){
$wpdb->insert('wp_table_name',
array(
'field_a' => maybe_serialize( $_POST['field_a'] ),
'field_b' => maybe_serialize( $_POST['field_b'] ),
'field_c' => maybe_serialize( $_POST['field_c'] ),
'field_d' => maybe_serialize( $_POST['field_d'] )
),
array(
'%s',
'%s',
'%s',
'%s'
)
);
}
?>
Maybe_unserialize関数を使用して値を配列として取得します。