¿Para qué sirve el índice [0] en los metacampos posteriores?

10

Tratando de mejorar mi conocimiento de PHP a través de prueba y prueba! Estoy confundido con [0] argumentos en el siguiente código PHP de WordPress

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

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

¿Son para indexar / hacer referencia a entradas en la página? Si es así, ¿por qué son iguales? ¿Me puede decir por qué y cuándo usarlos?

Behseini
fuente

Respuestas:

17

Cada meta clave de publicación puede tener múltiples valores. Entonces obtienes los valores por defecto como una matriz; La primera entrada ( 0) es la más antigua.

get_post_custom()recupera todas las claves meta con sus valores. Puede simplificar su código con:

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

Cuando el último parámetro para get_post_meta()es TRUE, WordPress devolverá un valor único: la primera entrada en el metavalor posterior para la clave dada.

La primera llamada a get_post_meta()buscará y almacenará en caché todos los meta valores para esa ID de publicación en segundo plano, por lo que las llamadas posteriores no generarán consultas adicionales en la base de datos.

Un ejemplo

Digamos que creamos una meta clave de publicación llamada colory la llenamos con tres valores diferentes para una publicación. Luego hacemos lo mismo con una llave 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 );
});

El último parámetro FALSEle dice a WordPress que no haga que esta meta clave sea única , sino que permita valores múltiples para una clave.

La estructura resultante en nuestra postmetatabla se verá así:

mesa

Cada fila tiene un único meta_id, pero cada uno post_idpuede tener múltiples meta_keys, y cada uno meta_keypuede tener múltiples meta_values.

Ahora busquemos todos los valores personalizados para la publicación 561:

add_action( 'shutdown', function(){

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

Resultado:

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_lasty _edit_lockson elementos internos de WordPress, lo ignoramos por el momento. Solo tenga en cuenta que también obtenemos estos valores como una matriz, aunque solo hay un valor.
colory ageson matrices como todos los meta valores posteriores.
$custom['color'][0]es blue.

Ahora buscamos solo el color con get_post_meta():

add_action( 'shutdown', function(){

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

Resultado:

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

Aquí obtenemos solo una parte de nuestros meta valores. $color[0]es todavía blue. Detrás de escena, WordPress ya ha obtenido todos los valores personalizados, por lo que un próximo hit para agese serviría desde la caché.
En cuanto a rendimiento get_post_custom()y get_post_meta()son iguales.

Último intento: obtener el color con get_post_meta()un solo valor.

add_action( 'shutdown', function(){

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

Resultado: blue.

WordPress ha hecho lo que ha hecho en su código: ha tomado la clave de matriz 0y ha devuelto el valor como una cadena.

Esta es la opción más legible, úsela para escribir código que sea fácil de entender.

fuxia
fuente