web-dev-qa-db-fra.com

Comment utiliser l'API de paramètres pour définir des tableaux multidimensionnels

J'écris un plugin d'information sur le cours. La plupart des informations de cours sont liées à un article (type de "cours" personnalisé), j'ai donc mis la majorité des informations dans le tableau de postmeta. Toutefois, certaines informations ne sont liées à aucun message - informations de lieu par exemple. J'utilise la table d'options pour stocker ces informations.

J'ai ajouté un ensemble de pages d'options et j'utilise l'API de configuration pour modifier les informations de base. Le problème est que certaines informations sont dynamiques et plus compliquées:

J'ai une page de lieu où je dois appuyer l'ajout de nouveaux lieux et leur édition. Chaque site a un titre, 3 lignes d'adresse et un code postal. Un exemple de la gamme de sites est:

array(
    1 => array(
                'venue_title' = 'Edge Hill University, Ormskirk',
                'address_1'   = '20 Edge Lane',
                'address_2'   = 'Ormskirk',
                'address_3'   = 'Lancashire',
                'postcode'    = 'L12 6EA'
         ),
    2 => array(
                'venue_title' = 'Edge Hill University, Aintree',
                'address_1'   = '12 Aintree Close',
                'address_2'   = 'Aintree',
                'address_3'   = 'Liverpool',
                'postcode'    = 'L48 6PQ'
         ),
    3 => array ( ...etc other venues)

);

Donc, pour apporter des modifications, j'utilise des champs de texte. Ceux-ci sont gérés par les paramètres api. L'attribut name et le contenu sont définis dynamiquement à partir d'une variable $ _GET.

<input type="text" name="venues[<?php echo $venue_id; ?>][venue_title]" value="<?php echo $venues[$venue_id]['venue_title']; ?>" />

qui aurait comme sortie

<input type="text" name="venues[2][venue_title]" value="<?php echo $venues[2]['venue_title']; ?>" />

Je n'ai qu'un seul ensemble de ces champs enregistré avec les paramètres api, c'est là que je pense que le problème est, car lorsque je change un, il supprime tous les autres et insère simplement le nouveau.

Donc, dans mon esprit, le code ci-dessus ne devrait mettre à jour que le $ lieux [2] [lieu_title], mais il écrase tous les lieux. Je pense qu’étant donné qu’un seul ensemble de champs est enregistré, il ne sera mis à jour que s’il existe un seul ensemble de champs. Est-ce que quelqu'un connaît un moyen simple de faire ce travail?

Merci

3
danbrown

Examinez votre fonction de validation (celle référencée par votre appel register_setting). Quoi qu'il retourne, le paramètre entier de la base de données est remplacé. Ainsi, si le paramètre n'est pas récupéré, puis modifié et renvoyé dans son intégralité, vous perdrez les données que vous n'avez pas renvoyées.

4
Otto