¿Por qué get_post_meta está devolviendo una matriz cuando la especifico como única?

2

La documentación de get_post_meta hace que parezca que el argumento single determinará si hay o no valores meta Se devuelven en una matriz o no. Por ejemplo:

// If I set single to false, or leave it blank it's returned as an array
[my-meta] => Array
    (
        [0] => my-value
    )

// If I set single to true, it's returned as a string
[my-meta] = my-value

Esto funciona bien si solo estoy devolviendo datos para una única clave de metadatos ... pero falla si quiero devolver todos los metadatos, pero los devuelvo todos como cadenas (simples).

Parecería que la llamada adecuada para obtener todos los valores meta con valores de cadena sería:

$meta = get_post_meta( $transaction->ID, false, true );

Pero esto vuelve con los valores de matriz e ignora por completo el valor single .

¿Por qué? ¿Hay una manera de obtener todos los metadatos, pero sin las matrices de un solo elemento? Esos son innecesarios en mi caso.

EDITAR: Solo para aclarar lo que estoy preguntando, mentiría para obtener todos los meta como este:

array() {
    [my-meta-1] = my-value
    [my-meta-2] = my-value
    [my-meta-3] = my-value
    [my-meta-4] = my-value
}

En lugar de hacerlo de esta manera (que es el único comportamiento que parece poder tener):

array() {
    [my-meta-1] => Array
    (
        [0] => my-value
    )
    [my-meta-2] => Array
    (
        [0] => my-value
    )
    [my-meta-3] => Array
    (
        [0] => my-value
    )
    [my-meta-4] => Array
    (
        [0] => my-value
    )
}
    
pregunta Pete 10.06.2015 - 17:01

2 respuestas

4
  

Esto funciona bien si solo estoy devolviendo datos para una sola meta clave ... pero   falla si quiero devolver todos los metadatos, pero devolverlos todos como   cuerdas (single).

Esto no tiene mucho sentido. Una función en PHP solo puede devolver un solo valor por lo que no hay manera de devolver todos meta como cadenas (plural). Tiene que salir como una matriz, o un objeto. Y eso es lo que hace la función: se obtiene un solo valor como una cadena o se obtiene una matriz. Si no especifica una clave, entonces el código no tiene forma de saber qué clave desea para obtenerlas todas, por defecto not solo. Cuando no está recuperando valores individuales, WordPress no contrae la matriz anidada. Si eso es lo que quiere, coméntelo con los desarrolladores Core en Trac. Mientras tanto, contraiga la matriz usted mismo:

$meta = get_post_meta(350);
var_dump($meta);
foreach ($meta as $k => $v) {
  $meta[$k] = array_shift($v);
}

O:

foreach ($meta as &$v) {
  $v = array_shift($v);
}

Puede que no apueste a la respuesta que esperaba, pero estoy bastante seguro de que es correcta. Puede haber un filtro, pero dudo que el esfuerzo valga la pena.

    
respondido por el s_ha_dum 10.06.2015 - 17:31
2

Una pequeña función corta, quizás:

function get_post_meta_single( $id ) {
  $m = get_post_meta( $id, false, true );    // get post meta as singles
  foreach( $m as &$v ) $v = array_shift($v); // collapse value array
  return $m;
}

Como nota al margen, es probable que la razón por la que WordPress no contraiga la matriz sea para mantener la coherencia, por lo que el mismo código puede reutilizarse para elementos con múltiples valores y valores únicos. WordPress es todo sobre el bucle, recuerda.

    
respondido por el Armstrongest 13.01.2016 - 02:51

Lea otras preguntas en las etiquetas