だから、私はそのようないくつかのフォームフィールドがあります:
<input name='mainStageSatOrder[theband][theid]' type='hidden' class='band-id' value='' />";
<input name='mainStageSatOrder[theband][theorder]' type='hidden' class='band-order' value='' />";
ご覧のとおり、これらのフォームフィールド(他にもありますが、これらは両方のタイプの例にすぎません)は、次のように多次元配列を作成します(うまくいかない場合は修正してください)。
Array (
[mainStageSatOrder] => Array
(
[theband] => Array
(
[theid] => 1
[theorder] => 5
)
[theband] => Array
(
[theid] => 2
[theorder] => 8
)
)
)
これらの値にupdate_post_meta関数を使用して、ページの更新が送信されたときに関連フィールドを更新するようにします。送信アクションpost_submitbox_startアクションにフックできることはわかっています。
よくわからないのは、[送信]ボタンをクリックした後のPHPの表示内容です。送信ボタンをクリックすると、多次元配列がforeachループを使用してループされ、各「theband」サブ配列に対してupdate_post_meta関数で2つの値が使用されます。
foreach(???) {
update_post_meta( 1, 'theorder', '5' ); //where 1 and 5 are values passed from the MD array
}
だから、プロセスは行きます:
1)ユーザーが[パブリッシュ/更新]ボタンをクリックします。2)すべてのフィールドのすべての値が多次元配列に渡されます。3)MD配列がループスルーされ、update_post_metaを使用して関連データが更新されます。
ありがとう。
あなたはあなたのMD配列にちょっとした問題を抱えていました、それはそのように見えるべきです、そうでなければあなたはフォーム内のデータを上書きするでしょう:
["mainStageSatOrder"]=> array(2) {
[0]=> array(1) {
["theband"]=> array(2) {
["theid"]=> int(1)
["theorder"]=> int(5)
}
}
[1]=> array(1) {
["theband"]=> array(2) {
["theid"]=> int(2)
["theorder"]=> int(8)
}
}
}
これで2つの選択肢があります(コンテキストなしで単一のメタデータは必要ないかもしれないので、選択肢Bをお勧めします)。
オプションA:データを単一のメタフィールドに保存します。データを取得するには、parent_key($key
または'mainStageSatOrder'
)、$row_id
、およびfield_id($sub_key
または$key
)が必要です。
function save($post_id) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( !current_user_can( 'edit_post', $post_id ) || !array_key_exists('mainStageSatOrder', $_POST) )
return;
foreach ($_POST['mainStageSatOrder'] as $row_id => $rows) {
foreach ($rows as $key => $value) {
if (is_array($value)) {
foreach ($value as $sub_key => $sub_value) {
$meta_key = '_'.$key.'_'.$row_id.'_'.$sub_key;
update_post_meta($post_id, $meta_key, $sub_value);
}
} else {
$meta_key = "_mainStageSatOrder_".$row_id."_".$key;
update_post_meta($post_id, $meta_key, $value);
}
}
}
update_post_meta($post_id, '_mainStageSatOrder', array_keys($_POST['mainStageSatOrder']));
}
オプションB:データを直列化された配列に保存します(WordPressが直列化を処理します)。再度配列にアクセスして処理するには、meta_valueをunserialize()
するだけです。
function save_array($post_id) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( !current_user_can( 'edit_post', $post_id ) || !array_key_exists('mainStageSatOrder', $_POST) )
return;
update_post_meta($post_id, '_mainStageSatOrder', $_POST['mainStageSatOrder']);
}
あなたのPHPコードのどこかに:
$mainStageSatOrder = unserialize(
get_post_meta(
get_the_ID(),
'_mainStageSatOrder',
true
)
);
まず最初に、あなたの配列に問題があります。配列は重複キーを持つことはできません。そのため、最初のキーだけが保存されます。あなたはこのようなものにあなたの形を変える必要があります。
<input name='mainStageSatOrder[theband0][theid]' type='hidden' class='band-id' value='' />";
<input name='mainStageSatOrder[theband0][theorder]' type='hidden' class='band-order' value='' />";
<input name='mainStageSatOrder[theband1][theid]' type='hidden' class='band-id' value='' />";
<input name='mainStageSatOrder[theband1][theorder]' type='hidden' class='band-order' value='' />";
配列はこのようになります
$array = array(
'mainStageSatOrder' => array(
'theband0' => array(
'theid' => 1,
'theorder' => 5
),
'theband1' => array(
'theid' => 2,
'theorder' => 8
)
)
);
メタデータを保存するときにforeachループは必要ありません。代わりに配列として保存することができます。 WordPressは自動的にそれをシリアル化します。
$array = $_POST['mainStageSatOrder'];
update_post_meta( $postid, 'mainStageSatOrder', $array );
そして、その価値観を追求しながら。
$data = get_post_meta($post->ID, 'mainStageSatOrder', true);
返される$data
は配列になります。