it-swarm.com.de

Was bringt der $ single-Parameter von get_post_meta?

Beim Betrachten von get_post_meta() muss ich immer daran denken, den Parameter $single auf true zu setzen. Ich gehe im Allgemeinen davon aus, dass ich einen Wert festlege, und erwarte, dass ich diesen Wert zurückerhalte.

Post-Metafeld für einen Post abrufen.

  • $ post_id (int) (Erforderlich) Beitrags-ID.
  • $ key (string) (Optional) Der abzurufende Metaschlüssel. Standardmäßig werden Daten für alle Schlüssel zurückgegeben. Standardwert: ''
  • $ single (bool) (Optional) Gibt an, ob ein einzelner Wert zurückgegeben werden soll. Standardwert: false

Ich weiß, dass dies aus einem bestimmten Grund als Option existieren sollte, aber ich persönlich weiß nicht, warum das so ist. Kann jemand erklären, warum dies standardmäßig eine array von Werten zurückgibt? Unter dem Gesichtspunkt der Abwärtskompatibilität ist dies sinnvoll, aber haben sich die Dinge weiterentwickelt? Oder gibt es Kernfunktionen, bei denen dies für eine mir unbekannte Effizienz erforderlich ist.

Fügt das Hinzufügen von $prev_value zu update_post_meta() einen Verlauf als Array-Elemente hinzu?

Ich würde mich über ein working Beispiel freuen, wenn die Einstellung auf false Sinn macht. Das bedeutet Code, den ich testen kann. Darüber hinaus eine wirklich gut durchdachte und recherchierte Antwort. Das heißt, ich möchte Kommentare wie TLC möchte Peelings.

6
jgraup

Im Allgemeinen Speichern von PHP serialisierten Daten in einer Datenbank in einer schlechten Idee . Es ist leicht verständlich, wenn Sie mehrere Schlüssel-Wert-Datenpaare in einer Feldzeile verwenden, dh wenn Sie ein Array oder ein Objekt mit einem Metaschlüssel verwenden.

Stellen Sie sich ein Auto als Objekt vor. Sie können mehrere Metawerte festlegen, um das Auto zu beschreiben, z. B. color und fuel. Sie können die Daten serialisieren und in einem Metafeld speichern (nur ein Metaschlüssel):

$metadata = array(
    'color' => 'white',
    'fuel'  => 'diesel'
);
// as it is an array, $metadata will be serialized automatically by WordPRess
update_post_meta( 458, 'car_meta', $metadata );

In diesem Beispiel können Sie get_post_meta() verwenden, wobei der dritte Parameter auf false festgelegt ist.

$carmeta = get_post_meta( 458, 'car_meta', false );
// Serialized meta is unserialized automatically by WordPress
echo $carmeta[0]['color'];
echo $carmeta[0]['fuel'];

Oder Sie können es mit true verwenden, es ist kein großer Unterschied:

$carmeta = get_post_meta( 458, 'car_meta', true );
echo $carmeta['color'];
echo $carmeta['fuel'];

Jetzt wollen Sie nur noch rote Autos mit Diesel fahren. Sie müssten alle Autos und ihre Metadaten aus der Datenbank abrufen und alle Autos durchlaufen, die Metadaten unserialisieren und die weißen Autos durchsuchen, die Diesel fahren. Das ist wirklich schlecht .

Wenn Sie andererseits einen Metaschlüssel für alle Metadaten verwenden, zum Beispiel:

$metadata = array(
    'car_color' => 'white',
    'car_fuel'  => 'diesel'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}

dann können Sie direkt aus der Datenbank das bekommen, wonach Sie suchen:

$args = array(
    'meta_query' => array(
        'relation'  => 'AND',
         array(
             'key'   => 'car_color',
             'value' => 'red'
         ),
         array(
             'key'   => 'car_fuel',
             'value' => 'diesel'
         )
    )
);

$query = new WP_Query( $args );

Jetzt können Sie sich vorstellen, dass ein Auto in mehreren Farben erhältlich sein kann:

$metadata = array(
    'car_colors' => array( 'red', 'white' ),
    'car_fuel'   => 'diesel'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}

Jetzt haben wir einen car_colors Metaschlüssel mit einem serialisierten Array. Wir haben die gleichen Probleme wie zuvor beschrieben, wenn wir nur nach Autos fragen möchten, die in einer Farbe erhältlich sind. Daher ist es besser, Farben als Repeater-Metafeld zu speichern:

$metadata = array(
    'car_colors' => array( 'red', 'white' ),
    'car_fuel'   => 'diesel'
);
foreach( $metadata as $key => $value ) {
    if( is_array( $value ) ) {
        foreach( $value as $val ) {
            // We add multiiple meta fields with the same meta key
            add_post_meta( 458, $key, $val );
        }
    } else {
        update_post_meta( 458, $key, $value );
    }
}

Wenn Sie nun alle verfügbaren Farben eines Autos erhalten möchten, müssen Sie den dritten Parameter von get_post_meta() auf falsesetzen. Wenn Sie ihn auf true setzen, erhalten Sie nur die erste verfügbare Farbe, die in der Datenbank für dieses Auto gefunden wurde.

// This gets only the first car_colors entry found in database for car 458
$available_colors = get_post_meta( 458, 'car_colors', true );
// This gets all the car_colors entries for car 458
$available_colors = get_post_meta( 458, 'car_colors', false );

Es ist ein sehr einfaches Beispiel, aber ich denke, es veranschaulicht einen Anwendungsfall, in dem der dritte Parameter von get_post_meta() Sinn macht , also hoffe ich, dass dies Ihre Frage beantwortet.

Ein anderes Beispiel könnte das sein, das in einer anderen Antwort über Shows gezeigt wird, die mehrmals am Tag aufgeführt werden, zum Beispiel ein Film in einem Kino. Sie möchten, dass "Startzeiten" ein Wiederholungsfeld sind und nicht ein Feld, in dem alle Startzeiten als serialisierte Daten gespeichert sind.

Über die andere Frage: Wird durch Hinzufügen von $prev_value zu update_post_meta() ein Verlauf als Array-Elemente erstellt? Nein. Wenn Sie $prev_value an update_post_meta() übergeben, wird nur die vorhandene Zeile in der Datenbank mit diesem Wert aktualisiert. Wenn $pre_value nicht festgelegt ist, werden alle Zeilen für den Metaschlüssel aktualisiert.

Zum Schluss, wenn Sie alle verfügbaren Farben eines Autos löschen möchten:

delete_post_meta( 458, 'car_colors' );

Und wenn Sie nur einen Eintrag mit einem bestimmten Wert löschen möchten:

delete_post_meta( 458, 'car_colors', 'white' );
11
cybmeta