wake-up-neo.com

Gibt es bei Verwendung von add_post_meta und update_post_meta eine Möglichkeit, die einzelnen Array-Schlüssel zuzuweisen?

Beim Hinzufügen von Arrays zu Post-Meta mit add_post_meta werden neue Sub-Arrays hinzugefügt. Ich habe mich gefragt, ob es eine Möglichkeit gibt, diese Sub-Arrays zu benennen.

also anstatt am Ende mit

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

Ich würde bekommen

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

Wenn mehrere Metawerte für denselben Metaschlüssel verwendet werden, speichert WordPress die Werte in verschiedenen Datenbankzeilen. So wird jedes Array in einer Zeile gespeichert.

Anfangsdaten

Nehmen wir an, Sie haben ein Array wie das folgende:

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

Wenn Sie jedes Sub-Array als eine andere Meta-Zeile speichern, ist der meta_id der einzige Bezeichner für diese Zeile, aber er ist nicht wirklich aussagekräftig und mit WordPress-Funktionen nur schwer zu bekommen.

Die "map" Anfahrt

Eine Problemumgehung könnte darin bestehen, eine Karte mit Werten/Meta-IDs in einem anderen Post-Meta zu speichern.

Dies kann dank der Tatsache geschehen, dass sowohl update_post_meta() als auch add_post_meta() die soeben hinzugefügte Meta-ID zurückgeben.

Daten speichern

Sie können also so etwas tun:

$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 );

Daten abrufen

Wenn Sie Werte abrufen, z.

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

sie erhalten ein Array mit zwei Dimensionen ohne Schlüssel wie folgt:

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

Kurz gesagt, Sie verlieren die Sub-Array-Schlüssel.

Sie können jedoch die von Ihnen gespeicherte Karte und die Funktion get_post_meta_by_id verwenden, um Ihre ursprünglichen Daten wiederherzustellen:

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

Und Familie wird gleich den ursprünglichen Daten sein:

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

Daten aktualisieren

Daten aktualisieren, es ist nicht sehr schwer:

$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 );

Eine Alternative: der "alles an einem Ort" Ansatz

Der obige Ansatz funktioniert, aber es ist nicht der einfachste Weg.

Tatsächlich wäre es einfacher, das gesamte anfängliche assoziative Array (das $family-Array) als einzelnes Meta statt in verschiedenen Unterarrays zu speichern.

// 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 );

Das Speichern, Abrufen und Aktualisieren von Daten ist ganz einfach und es entsteht kein zusätzlicher Aufwand.

Vorteile des "map" Ansatzes

In den meisten Fällen ist der "alles an einem Ort" Ansatz am bequemsten.

Wenn es jedoch Hunderte oder sogar Tausende von Sub-Arrays gibt, würde die Verwendung eines eindeutigen Meta-Werts zum Speichern aller Arrays zu einer sehr großen Speicherkapazität führen, die zum Abrufen und Parsen von Daten verwendet wird. Durch die Verwendung verschiedener Zeilen und einer modernen PHP -Funktion wie generators kann diese Speicherkapazität drastisch reduziert werden.

Darüber hinaus kann dieser Ansatz beim Umgang mit vorhandenen Daten (möglicherweise von einer alten Version der Website geerbt) hilfreich sein, um aussagekräftige Informationen zu erhalten, ohne alte Daten zu konvertieren.

Wenn kleinere und charakterisiertere Sub-Arrays in verschiedenen DB-Zeilen gespeichert sind, könnte eine Abfrage nach Posts mit Meta-Abfrage und LIKE gegen das serialisierte Array im Meta-Werteinfacher und zuverlässiger sein, selbst wenn die tatsächliche Zuverlässigkeit gegeben ist hängt stark von der Struktur der Daten ab.

9
gmazzap

Einige mögliche Möglichkeiten für die Verwendung von add_post_meta:

Für Details folgen Sie bitte dem Link

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

Codex-Link für Details

Vielen Dank!

0
jas