¿Cuál es el índice [0] para los campos de metadatos posteriores?

10

¡Intentando mejorar mi conocimiento de PHP a través de pruebas y pruebas! 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 / referenciar entradas en la página? Si es así, ¿por qué son iguales? ¿Me puede decir por qué y cuándo usarlos?

    
pregunta Behseini 25.05.2013 - 10:14

1 respuesta

16

Cada clave meta de la publicación puede tener varios 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. Podrías simplificar tu 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 solo valor: la primera entrada en el valor meta posterior de la clave dada.

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

Un ejemplo

Supongamos que creamos una clave de metadatos de publicación denominada color y la rellenamos con tres valores diferentes para una publicación. Luego hacemos lo mismo con una clave 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 FALSE le dice a WordPress no que haga que esta meta clave sea única , pero que permita múltiples valores para una clave en su lugar.

La estructura resultante en nuestra tabla postmeta se verá así:

Cada fila tiene un único meta_id , pero cada post_id puede tener múltiples meta_key s, y cada meta_key puede tener múltiples meta_value s.

Ahora vamos a buscar 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_last y _edit_lock son internos de WordPress, ignoramos eso por el momento. Tenga en cuenta que también obtenemos estos valores y una matriz, aunque solo hay un valor.
color y age son matrices, como todos los valores meta del post.
$custom['color'][0] es blue .

Ahora obtenemos 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í solo obtenemos una parte de nuestros valores meta. $color[0] sigue siendo blue . Detrás de escena, WordPress ya ha recuperado todos valores personalizados, por lo que un próximo golpe para age se serviría desde el caché.
En términos de rendimiento, get_post_custom() y get_post_meta() son iguales.

Último intento: obtenga el color con get_post_meta() como 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 has hecho en tu código: ha tomado la clave de matriz 0 y ha devuelto el valor como una cadena.

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

    
respondido por el fuxia 25.05.2013 - 10:44

Lea otras preguntas en las etiquetas