web-dev-qa-db-fra.com

A quoi sert l'index [0] pour les champs post meta?

J'essayais d'améliorer mes connaissances PHP en testant et en essayant! Je suis confus sur les arguments [0] à la suite du code WordPress PHP

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

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

S'agit-il d'indexer/référencer des entrées sur la page? Si oui, pourquoi sont-ils les mêmes?! pouvez-vous s'il vous plaît laissez-moi savoir pourquoi et quand les utiliser?

10
Behseini

Chaque clé meta peut avoir plusieurs valeurs. Donc, vous obtenez les valeurs par défaut sous forme de tableau; la première entrée (0) est la plus ancienne.

get_post_custom() va chercher toutes les clés méta avec leurs valeurs. Vous pouvez simplifier votre code avec:

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

Lorsque le dernier paramètre de get_post_meta() est TRUE, WordPress renverra une seule valeur: la première entrée de la valeur de méta de publication pour la clé donnée.

Le premier appel à get_post_meta() va chercher et mettre en cache en arrière-plan les valeurs méta all pour cet ID de publication, de sorte que les appels ultérieurs n'entraîneront pas de requêtes supplémentaires dans la base de données.

Un exemple

Disons que nous créons une méta clé post nommée color et la remplissons avec trois valeurs différentes pour un post. Ensuite, nous faisons la même chose avec une clé 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 );
});

Le dernier paramètre FALSE indique à WordPress not de rendre cette clé méta unique - mais d’autoriser plusieurs valeurs pour une clé.

La structure résultante dans notre table postmeta ressemblera à ceci:

table

Chaque ligne a un meta_id unique, mais chaque post_id peut avoir plusieurs meta_keys et chaque meta_key peut avoir plusieurs meta_values.

Récupérons maintenant toutes les valeurs personnalisées pour la publication 561:

add_action( 'shutdown', function(){

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

Résultat:

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_last et _edit_lock sont des composants internes de WordPress, nous l’ignorons pour le moment. Notez simplement que nous obtenons également ces valeurs dans un tableau, bien qu’il n’y ait qu’une seule valeur.
color et age sont des tableaux comme toutes les méta-valeurs postérieures.
$custom['color'][0] est blue.

Maintenant, nous allons chercher juste la couleur avec get_post_meta():

add_action( 'shutdown', function(){

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

Résultat:

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

Nous n'obtenons qu'une partie de nos méta valeurs ici. $color[0] est toujours blue. En coulisse, WordPress a déjà récupéré les valeurs all custom, de sorte qu'un prochain hit pour age serait diffusé à partir du cache.
En termes de performances, get_post_custom() et get_post_meta() sont égaux.

Dernière tentative: Obtenez la couleur avec get_post_meta() en tant que valeur unique.

add_action( 'shutdown', function(){

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

Résultat: blue.

WordPress a fait ce que vous avez fait dans votre code: il a pris la clé de tableau 0 et a renvoyé la valeur sous forme de chaîne.

C'est l'option la plus lisible, utilisez-la pour écrire un code facile à comprendre.

16
fuxia