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?

Behseini
quelle

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.

Fuxia
quelle