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))
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.
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.
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.
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 );
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 ]
]
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 );
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.
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.
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!