Wofür ist der Index [0] für Post-Meta-Felder?


10

Ich versuche mein PHP-Wissen durch Testen zu verbessern und versuche es! Ich bin verwirrt über [0] Argumente beim Folgen von WordPress PHP-Code

global $post;
$custom = get_post_custom($post->ID);
$price = $custom['price'][0];
$coMake = $custom['coMake'][0];

echo $custom['price'][0];

Sind sie zum Indizieren / Referenzieren von Eingaben auf der Seite? wenn ja, warum sind sie gleich?! Können Sie mir bitte mitteilen, warum und wann ich sie verwenden soll?

Antworten:


17

Jeder Post-Meta-Schlüssel kann mehrere Werte haben. Sie erhalten die Werte also standardmäßig als Array. Der erste Eintrag ( 0) ist der älteste.

get_post_custom()Ruft alle Metaschlüssel mit ihren Werten ab. Sie können Ihren Code vereinfachen mit:

$price  = get_post_meta( $post->ID, 'price', TRUE );
$comake = get_post_meta( $post->ID, 'coMake', TRUE );

Wenn der letzte Parameter für get_post_meta()ist TRUE, gibt WordPress einen einzelnen Wert zurück: den ersten Eintrag im Post-Meta-Wert für den angegebenen Schlüssel.

Beim ersten Aufruf von get_post_meta()werden alle Metawerte für diese Post-ID im Hintergrund abgerufen und zwischengespeichert , sodass spätere Aufrufe nicht zu zusätzlichen Datenbankabfragen führen.

Ein Beispiel

Angenommen, wir erstellen einen Post-Meta-Schlüssel mit dem Namen colorund füllen ihn mit drei verschiedenen Werten für einen Post. Dann machen wir dasselbe mit einem Schlüssel age.

add_action( 'wp_loaded', function() {

    foreach ( array ( 'blue', 'red', 'yellow' ) as $color )
        add_post_meta( 561, 'color', $color, FALSE );

    foreach ( array ( '14', '40', '104' ) as $age )
        add_post_meta( 561, 'age', $age, FALSE );
});

Der letzte Parameter FALSEweist WordPress an, diesen Metaschlüssel nicht eindeutig zu machen, sondern stattdessen mehrere Werte für einen Schlüssel zuzulassen.

Die resultierende Struktur in unserer postmetaTabelle sieht folgendermaßen aus:

Tabelle

Jede Zeile hat ein eindeutiges meta_id, aber jede post_idkann mehrere meta_keys haben, und jede meta_keykann mehrere meta_values haben.

Rufen wir nun alle benutzerdefinierten Werte für Post 561 ab:

add_action( 'shutdown', function(){

    $custom = get_post_custom( 561 );
    print '<pre>' . esc_html( var_export( $custom, TRUE ) ) . '</pre>';
});

Ergebnis:

array (
  '_edit_last' => 
  array (
    0 => '1',
  ),
  '_edit_lock' => 
  array (
    0 => '1367617428:1',
  ),
  'color' => 
  array (
    0 => 'blue',
    1 => 'red',
    2 => 'yellow',
  ),
  'age' => 
  array (
    0 => '14',
    1 => '40',
    2 => '104',
  ),
)

_edit_lastund _edit_locksind WordPress-Interna, wir ignorieren das für den Moment. Beachten Sie nur, dass wir diese Werte auch als Array erhalten, obwohl es nur einen Wert gibt.
colorund agesind Arrays wie alle Post-Meta-Werte.
$custom['color'][0]istblue .

Jetzt holen wir nur die Farbe mit get_post_meta():

add_action( 'shutdown', function(){

    $color = get_post_meta( 561, 'color' );
    print '<pre>' . esc_html( var_export( $color, TRUE ) ) . '</pre>';
});

Ergebnis:

array (
  0 => 'blue',
  1 => 'red',
  2 => 'yellow',
)

Wir erhalten hier nur einen Teil unserer Metawerte. $color[0]ist immer noch blue. Hinter den Kulissen hat WordPress bereits alle benutzerdefinierten Werte abgerufen , sodass ein nächster Treffer für ageaus dem Cache bereitgestellt wird.
In Bezug auf die Leistung get_post_custom()und get_post_meta()sind gleich.

Letzter Versuch: Holen Sie sich die Farbe mit get_post_meta()als Einzelwert.

add_action( 'shutdown', function(){

    $color = get_post_meta( 561, 'color', TRUE );
    print '<pre>' . esc_html( var_export( $color, TRUE ) ) . '</pre>';
});

Ergebnis : blue.

WordPress hat getan, was Sie in Ihrem Code getan haben: Es hat den Array-Schlüssel genommen 0 und den Wert als Zeichenfolge zurückgegeben.

Dies ist die am besten lesbare Option. Verwenden Sie sie, um leicht verständlichen Code zu schreiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.