web-dev-qa-db-ja.com

フォームから作成された多次元配列のデータからのupdate_post_meta

だから、私はそのようないくつかのフォームフィールドがあります:

<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を使用して関連データが更新されます。

ありがとう。

1
Kev

あなたはあなたの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
    )
);
1
iantsch

まず最初に、あなたの配列に問題があります。配列は重複キーを持つことはできません。そのため、最初のキーだけが保存されます。あなたはこのようなものにあなたの形を変える必要があります。

<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は配列になります。

1
Abhik