web-dev-qa-db-fra.com

update_post_meta à partir de données d'un tableau multidimensionnel créé à partir d'un formulaire

Donc, j'ai quelques champs de formulaire comme suit:

<input name='mainStageSatOrder[theband][theid]' type='hidden' class='band-id' value='' />";
<input name='mainStageSatOrder[theband][theorder]' type='hidden' class='band-order' value='' />";

Comme vous pouvez le constater, ces champs de formulaire (il y en a plus, ce ne sont que des exemples des deux types) créent un tableau multidimensionnel comme celui-ci (j'espère, corrigez-moi si je me trompe):

Array (
[mainStageSatOrder] => Array
    (
        [theband] => Array
            (
                [theid] => 1
                [theorder] => 5
            )

        [theband] => Array
            (
                [theid] => 2
                [theorder] => 8
            )
    )
)

Je souhaite que ces valeurs utilisent la fonction update_post_meta pour mettre à jour les champs pertinents lors de la soumission de la mise à jour de la page. Je sais que je peux me connecter à l'action de soumission post_submitbox_start que je comprends très bien.

Ce que je ne sais pas, c'est ce que le PHP pourrait être une fois le bouton de soumission cliqué. Ce que je veux, c'est que lorsque l'on clique sur le bouton d'envoi, le tableau multidimensionnel est bouclé à l'aide d'une boucle foreach et pour chaque sous-tableau 'theband', les deux valeurs sont utilisées dans la fonction update_post_meta.

foreach(???) {
    update_post_meta( 1, 'theorder', '5' ); //where 1 and 5 are values passed from the MD array
}

Alors, le processus va:

1) L'utilisateur clique sur le bouton Publier/Mettre à jour 2) Toutes les valeurs de tous les champs sont transmises au tableau multidimensionnel. 3) Le tableau MD est bouclé et, à l'aide de update_post_meta, les données pertinentes sont mises à jour. 4) Confirmez oui/non

Merci.

1
Kev

Vous avez un petit problème de réflexion avec votre tableau MD, il devrait ressembler à cela, sinon vous écraserez les données dans votre formulaire:

["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)
        }
    }
}

Maintenant, vous avez deux options (je recommanderais l'option B, car vous pourriez ne pas avoir besoin de la métadonnée unique sans le contexte)

Option A: Enregistrez vos données dans des champs méta uniques. Vous aurez besoin de la clé parent_key ($key ou 'mainStageSatOrder'), $row_id et de id_table ($sub_key ou $key) pour obtenir vos données.

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']));
}

Option B: Enregistrez vos données dans un tableau sérialisé (WordPress gère la sérialisation). Pour accéder et utiliser à nouveau le tableau, il suffit de unserialize() la méta_value.

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']);
}

Quelque part dans votre code PHP:

$mainStageSatOrder = unserialize(
    get_post_meta(
        get_the_ID(), 
        '_mainStageSatOrder', 
        true
    )
);
1
iantsch

Tout d'abord, il y a un problème avec votre tableau. Les tableaux ne peuvent pas avoir des clés en double. Ainsi, seule la première clé sera enregistrée. Vous devez changer votre formulaire pour quelque chose comme ça.

<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='' />";

Le tableau ressemblera à ceci

$array = array(
    'mainStageSatOrder' => array(
        'theband0' => array(
            'theid' => 1,
            'theorder' => 5
        ),
        'theband1' => array(
            'theid' => 2,
            'theorder' => 8
        )
    )
);

Vous n'avez pas besoin d'une boucle foreach lors de l'enregistrement des métadonnées. Vous pouvez plutôt l'enregistrer sous forme de tableau. WordPress le sérialisera automatiquement pour vous.

$array = $_POST['mainStageSatOrder'];
update_post_meta( $postid, 'mainStageSatOrder', $array );  

Et, en retrouvant les valeurs ..

$data = get_post_meta($post->ID, 'mainStageSatOrder', true);  

Le $data retourné sera un tableau.

1
Abhik