Do czego służy indeks [0] w przypadku pól meta?

10

Próbuję poprawić swoją znajomość PHP poprzez testowanie i próbowanie! Jestem zdezorientowany argumentami [0] przy śledzeniu kodu PHP WordPress

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

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

Czy służą do indeksowania / odwoływania danych wejściowych na stronie? jeśli tak, to dlaczego są takie same ?! czy możesz dać mi znać, dlaczego i kiedy ich używać?

Behseini
źródło

Odpowiedzi:

17

Każdy klucz meta post może mieć wiele wartości. Otrzymujesz więc wartości domyślnie jako tablicę; pierwszy wpis ( 0) jest najstarszy.

get_post_custom()pobiera wszystkie meta-klucze z ich wartościami. Możesz uprościć swój kod dzięki:

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

Gdy ostatnim parametrem get_post_meta()jest TRUE, WordPress zwróci jedną wartość: pierwszy wpis w meta wartości post dla danego klucza.

Pierwsze wywołanie get_post_meta()spowoduje pobranie i buforowanie wszystkich meta wartości dla tego identyfikatora postu w tle, więc późniejsze wywołania nie spowodują dodatkowych zapytań do bazy danych.

Przykład

Załóżmy, że tworzymy meta klucz o nazwie o nazwie colori wypełniamy go trzema różnymi wartościami dla jednego postu. Następnie robimy to samo z kluczem 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 );
});

Ostatni parametr FALSEmówi WordPress nie zrobić tego klawisza meta wyjątkowy - ale aby umożliwić wielu wartości dla jednego klucza zamiast.

Wynikowa struktura w naszej postmetatabeli będzie wyglądać następująco:

stół

Każdy wiersz ma unikalny meta_id, ale każdy post_idmoże mieć wiele meta_keys, a każdy meta_keymoże mieć wiele meta_values.

Teraz pobierzmy wszystkie wartości niestandardowe dla posta 561:

add_action( 'shutdown', function(){

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

Wynik:

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_lasti _edit_locksą wewnętrznymi elementami WordPress, na razie to ignorujemy. Pamiętaj, że otrzymujemy te wartości i tablicę, chociaż jest tylko jedna wartość.
colori agesą tablicami, jak wszystkie wartości po meta.
$custom['color'][0]jest blue.

Teraz pobieramy tylko kolor za pomocą get_post_meta():

add_action( 'shutdown', function(){

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

Wynik:

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

Otrzymujemy tutaj tylko jeden kawałek naszych meta wartości. $color[0]jest nadal blue. Za kulisami WordPress już pobrał wszystkie niestandardowe wartości, więc kolejne trafienie agezostanie podane z pamięci podręcznej.
Pod względem wydajności get_post_custom()i get_post_meta()są równe.

Ostatnia próba: uzyskaj kolor get_post_meta()jako pojedynczą wartość.

add_action( 'shutdown', function(){

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

Rezultat: blue.

WordPress zrobił to, co zrobiłeś w kodzie: wziął klucz tablicy 0i zwrócił wartość jako ciąg.

Jest to najbardziej czytelna opcja, użyj jej do napisania kodu, który jest łatwy do zrozumienia.

fuxia
źródło