Come ottenere get_post_meta senza l'ID del post

8 apr 2013, 14:41:11
Visualizzazioni: 14.6K
Voti: 5

Voglio ottenere tutti i miei posts-meta, ma basandomi solo sulla key. Ad esempio, la query principale per ottenere i post-meta è:

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

Ora voglio ottenere questi post-meta basandomi solo sulla key. La mia query attuale per ottenere i post-meta è:

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

E voglio rimuovere $post->ID da questa query. C'è un modo per farlo? Grazie.

0
Tutte le risposte alla domanda 2
2

$post->ID è ciò che distingue il valore meta tra tutti i post con la stessa chiave meta.

Quindi, se vuoi abbreviare la chiamata a get_post_meta per il post corrente, puoi fare così:

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

e puoi chiamarla in questo modo:

echo get_cuurent_post_meta('custom_tags'.$userID);

Ora, se non si tratta del post corrente ma di qualsiasi post, puoi fare così:

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) );
}

Per ottenere il primo valore meta di questa chiave, chiamala così:

echo get_meta_value_by_key('custom_tags'.$userID);

e per ottenere tutti i valori meta di questa chiave, usa il parametro $limit, ad esempio:

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

C'è una cosa che devo assolutamente chiedere. Quando faccio echo del $post_meta_array mostra Array. E quando uso print_r($post_meta_array) mi mostra dati qualcosa come questo Array ( [0] => stdClass Object ( [meta_value] => $custom_tags ) [1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 ) [2] => stdClass Object ( [meta_value] => garlic,soupe ) ) ;. Come posso mostrarli in una riga senza oggetti.

Adi Adi
8 apr 2013 15:48:12

Puoi modificare l'output di get_results e poi quando hai un array puoi usare implode

Bainternet Bainternet
8 apr 2013 16:02:32
6

Puoi interrogare direttamente la tua tabella postmeta utilizzando qualcosa come:

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>';

AGGIORNAMENTO Dopo aver ottenuto i tuoi $metas, puoi passarli in un ciclo per visualizzare i valori:

if( count($metas) > 0 ){ #controlla se abbiamo ottenuto risultati
  foreach ($metas as $meta){
    echo $meta->meta_value . "<br />";
  }
}
8 apr 2013 14:53:21
Commenti

Il problema è lo stesso che ho commentato sopra. Ecco il mio commento. C'è una cosa che devo chiederti. Quando uso print_r($metas) mi mostra i dati in questo modo Array ( [0] => stdClass Object ( [meta_value] => $custom_tags ) [1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 ) [2] => stdClass Object ( [meta_value] => garlic,soupe ) ) ;. Come posso mostrarli in una riga senza oggetti.

Adi Adi
8 apr 2013 16:02:09

Ho aggiornato la mia risposta.

RRikesh RRikesh
8 apr 2013 17:12:51

@RRikesh Per favore dai un'occhiata a $wpdb->prepare(). Prepara sempre le tue istruzioni, a prescindere.

kaiser kaiser
10 apr 2013 01:15:26

@kaiser Grazie, ho aggiornato la mia risposta. A proposito, dovrei preparare anche se sto hardcodando il valore?

RRikesh RRikesh
10 apr 2013 08:09:39

Fondamentalmente è un sostituto di sprintf() che si occupa di sostituire %s e %d. Quindi lo farei comunque. Anche se è solo per altre persone che leggono il mio codice o per prepararlo nel caso in cui in seguito passassi a una variabile dinamica. Per rispondere alla tua domanda: No, non in un caso privato ;)

kaiser kaiser
10 apr 2013 11:50:44

Okay, grazie mille, seguirò il metodo prepare! :)

RRikesh RRikesh
10 apr 2013 12:19:50
Mostra i restanti 1 commenti