web-dev-qa-db-fra.com

Lorsque vous utilisez add_post_meta et update_post_meta, existe-t-il un moyen de donner des clés aux tableaux individuels?

Lors de l'ajout de tableaux à la méta publication, à l'aide de add_post_meta, de nouveaux sous-tableaux sont ajoutés. Je me demandais s'il y avait un moyen de nommer ces sous-tableaux.

donc au lieu de finir avec

array([0](2,3), [1](4,5))

J'aurais

array ([meaningful_name](2,3),[meaningful_name2](4,5))
4
George Kendros

Lorsque plusieurs méta-valeurs sont utilisées pour la même méta-clé, WordPress stocke les valeurs dans différentes lignes de la base de données. Ainsi, chaque tableau est stocké dans une ligne.

Donnée initiale

Supposons que vous avez un tableau comme celui-ci:

$family = [
  'father'  => [ 'John', 'Doe', 40 ],
  'mother'  => [ 'Jane', 'White', 39 ],
  'child_1' => [ 'Luke', 'Doe', 5 ]
];

Si vous stockez chaque sous-tableau en tant que ligne méta différente, le seul identifiant de cette ligne est le meta_id, mais il n'a pas vraiment de sens et il est difficile d'obtenir des informations à l'aide de fonctions WordPress.

L'approche "map"

Une solution de contournement pourrait consister à stocker une carte de valeurs/méta-identifiants dans un autre méta-message.

Cela peut être fait grâce au fait que update_post_meta() et add_post_meta() renvoient à la méta-ID que nous venons d'ajouter.

Données de magasin

Donc, vous pouvez faire quelque chose comme ça:

$map = [];
foreach( $family as $who => $person ) {
  // update_post_meta returns the meta ID
  $map[ $who ] = update_post_meta( $postId, 'family_member', $person );
}
// we store the map of family "role" to meta IDs in a separate meta
update_post_meta( $postId, 'family_members_map', $map );

Récupérer des données

Lorsque vous récupérez des valeurs, par exemple.

$family = get_post_meta( $postId, 'family_member' );

vous obtenez un tableau à 2 dimensions sans clé comme ceci:

[
  [ 'John', 'Doe', 40 ],
  [ 'Jane', 'White', 39 ],
  [ 'Luke', 'Doe', 5 ],
]

En bref, vous perdez les clés du sous-tableau.

Mais vous pouvez utiliser la carte que vous avez stockée et la fonction get_post_meta_by_id pour recréer vos données d'origine:

$map = get_post_meta( $postId, 'family_members_map', true );
$family = array_combine( array_keys( $map ), array_map( 'get_post_meta_by_id', $map ) );

Et la famille sera égale aux données d'origine:

[
  'father'  => [ 'John Doe', 40 ],
  'mother'  => [ 'Jane White', 39 ],
  'child_1' => [ 'Luke Doe', 5 ]
]

Mise à jour des données

Mettre à jour les données, ce n'est pas très difficile:

$justBorn = [ 'Anna', 'Doe', 0 ];

// current map
$map = get_post_meta( $postId, 'family_members_map', true);

// add both new sub array and new meta ID to map
$map['child_2'] = update_post_meta( $postId, 'family_member', $justBorn );

// update the map
update_post_meta( $postId, 'family_members_map', $map );

Une alternative: l’approche "tout au même endroit"

L'approche ci-dessus fonctionne, mais ce n'est pas la façon la plus simple.

En fait, il serait plus facile de stocker tout le tableau associatif initial (le tableau $family) est un méta unique au lieu de dans différents sous-tableaux.

// store data
update_post_meta( $postId, 'family_members', $family );

// retrieve data (please note the `true` as 3rd argument)
$family = get_post_meta( $postId, 'family_members', true );

// update data
$family = get_post_meta( $postId, 'family_members', true );
$family['child_2'] = [ 'Anna', 'Doe', 0 ];
update_post_meta( $postId, 'family_members', $family );

Stocker, récupérer et mettre à jour des données est assez facile et ne nécessite pas de temps système supplémentaire.

Avantages de l'approche "map"

Dans la plupart des cas, l’approche "tout au même endroit" est la plus pratique.

Toutefois, s’il existe des centaines, voire des milliers, de sous-tableaux, l’utilisation d’une méta-valeur unique pour tous les stocker aurait pour résultat une très grande quantité de mémoire utilisée pour extraire et analyser les données. En utilisant différentes lignes et une fonctionnalité moderne PHP telle que generators , cette quantité de mémoire peut être radicalement réduite.

De plus, lorsqu’il s’agit de données existantes (héritées peut-être de l’ancienne version du site Web), cette approche pourrait être utile pour obtenir des informations utiles sans conversion d’anciennes données.

Enfin, ayant des sous-tableaux plus petits et plus caractérisés stockés dans différentes lignes de base de données, une requête pour les publications utilisant la méta-requête et LIKE contre le tableau sérialisé dans la méta-valeur pourrait sera plus facile et plus fiable, même si la fiabilité réelle dépend beaucoup de la structure des données.

9
gmazzap

Quelques manières possibles d'utiliser add_post_meta:

Pour plus de détails s'il vous plaît suivez le lien

add_post_meta($post_id, $meta_key, $meta_value, $unique);
update_post_meta($post_id, $meta_key, $meta_value, $prev_value);
$meta_values = get_post_meta( $post_id, $key, $single );



 update_post_meta($post_ID, {key}, {array of vals})

 $data = Array(
    'url' => $url,
    'name' => $name,
    'description' => $desc,
 );

 //Update inserts a new entry if it doesn't exist, updates otherwise
  update_post_meta($post_ID, 'yourkey', $data);

 //To Fetch
 $yourdata = get_post_meta($post_ID, 'yourkey');

Lien vers le Codex pour plus de détails

Merci!

0
jas