Cómo obtener post_meta sin el ID del post

8 abr 2013, 14:41:11
Vistas: 14.6K
Votos: 5

Quiero obtener todos mis posts-meta, pero basándome solo en la key. Por ejemplo, la consulta principal para obtener los metadatos del post es

 <?php $meta_values = get_post_meta($post_id, $key, $single); ?> 

Ahora quiero obtener estos post-meta basándome solo en la key. Mi consulta actual para obtener los metadatos es

<?php echo get_post_meta($post->ID, 'custom_tags'.$userID, true); ?>

Y quiero eliminar $post->ID de esta consulta. ¿Hay alguna manera de hacer esto? Gracias.

0
Todas las respuestas a la pregunta 2
2

$post->ID es lo que distingue el valor meta entre todos los posts con la misma clave meta.

Así que si quieres una forma abreviada de llamar a get_post_meta para el post actual, puedes hacer esto:

function get_cuurent_post_meta($key){
    global $post;
    return get_post_meta($post->ID,$key,true);
}

Y puedes llamarlo así:

echo get_cuurent_post_meta('custom_tags'.$userID);

Ahora, si no es el post actual sino cualquier post, puedes hacer esto:

function get_meta_value_by_key($meta_key,$limit = 1){
    global $wpdb;
    if (1 == $limit)
        return $value = $wpdb->get_var( $wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = %s LIMIT 1" , $meta_key) );
    else
        return $value = $wpdb->get_results( $wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = %s LIMIT %d" , $meta_key,$limit) );
}

Para obtener el primer valor meta de esta clave, simplemente llámalo así:

echo get_meta_value_by_key('custom_tags'.$userID);

Y para obtener todos los valores meta de esta clave, usa el parámetro $limit ejemplo:

$post_meta_array = get_meta_value_by_key('custom_tags'.$userID, 999);
8 abr 2013 15:05:34
Comentarios

Hay una cosa que tengo que preguntar. Cuando hago echo del $post_meta_array muestra Array. Y cuando uso print_r($post_meta_array) me muestra datos algo como esto Array ( [0] => stdClass Object ( [meta_value] => $custom_tags ) [1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 ) [2] => stdClass Object ( [meta_value] => garlic,soupe ) ) ;. ¿Cómo puedo mostrarlos en una línea sin objetos?

Adi Adi
8 abr 2013 15:48:12

Puedes cambiar la salida de get_results y luego cuando tengas un array puedes usar implode

Bainternet Bainternet
8 abr 2013 16:02:32
6

Puedes consultar directamente tu tabla postmeta usando algo como:

global $wpdb;

$metas = $wpdb->get_results( 
  $wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta where meta_key = %s", 'add_your_key_here')
 );

echo '<pre>';
print_r( $metas );
echo '</pre>';

ACTUALIZACIÓN Después de obtener tus $metas, las pasas en un bucle para mostrar los valores:

if( count($metas) > 0 ){ #verificar si obtuvimos resultados
  foreach ($metas as $meta){
    echo $meta->meta_value . "<br />";
  }
}
8 abr 2013 14:53:21
Comentarios

El problema es el mismo que comenté anteriormente. Aquí está mi comentario. Hay algo que tengo que preguntar. Cuando uso print_r($metas) me muestra datos algo como esto Array ( [0] => stdClass Object ( [meta_value] => $custom_tags ) [1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 ) [2] => stdClass Object ( [meta_value] => garlic,soupe ) ) ;. ¿Cómo puedo mostrarlos en una línea sin objetos?

Adi Adi
8 abr 2013 16:02:09

Actualicé mi respuesta.

RRikesh RRikesh
8 abr 2013 17:12:51

@RRikesch Por favor revisa $wpdb->prepare(). Siempre prepara tus sentencias, sin importar qué.

kaiser kaiser
10 abr 2013 01:15:26

@kaiser Gracias, actualicé mi respuesta. Por cierto, ¿debería preparar incluso si estoy codificando el valor?

RRikesh RRikesh
10 abr 2013 08:09:39

Básicamente es un reemplazo de sprintf() que se encarga de reemplazar %s y %d. Así que lo haría de todos modos. Incluso si es solo para que otras personas lean mi código o prepararlo en caso de que luego pase a una variable dinámica. Para responder a tu pregunta: No, no en un caso privado ;)

kaiser kaiser
10 abr 2013 11:50:44

Vale, muchas gracias, ¡me quedaré con el método prepare! :)

RRikesh RRikesh
10 abr 2013 12:19:50
Mostrar los 1 comentarios restantes