Cum să obținem post_meta fără ID-ul postării

8 apr. 2013, 14:41:11
Vizualizări: 14.6K
Voturi: 5

Doresc să obțin toate posts-meta, dar pe baza key. De exemplu, interogarea principală pentru obținerea meta-informațiilor postării este

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

Acum vreau să obțin aceste post-meta doar pe baza key. Interogarea mea curentă pentru a obține meta-informațiile este

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

Și vreau să elimin $post->ID din această interogare. Există vreo metodă pentru a realiza acest lucru? Mulțumesc.

0
Toate răspunsurile la întrebare 2
2

$post->ID este ceea ce face ca valoarea meta să fie distinctă între toate articolele care au aceeași cheie meta.

Deci, dacă dorești să scurtezi apelul get_post_meta pentru articolul curent, poți face asta:

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

și poți apela funcția astfel:

echo get_cuurent_post_meta('custom_tags'.$userID);

Dacă nu este vorba despre articolul curent, ci despre orice articol, poți face asta:

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

Pentru a obține prima valoare meta a acestei chei, apelează funcția astfel:

echo get_meta_value_by_key('custom_tags'.$userID);

Și pentru a obține toate valorile meta ale acestei chei, folosește parametrul $limit, de exemplu:

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

Un lucru pe care trebuie să-l întreb este când folosesc echo pe $post_meta_array afișează Array. Iar când folosesc print_r($post_meta_array) îmi arată date ceva de genul Array ( [0] => stdClass Object ( [meta_value] => $custom_tags ) [1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 ) [2] => stdClass Object ( [meta_value] => garlic,soupe ) ) ;. Cum pot să le afișez într-o singură linie fără obiecte.

Adi Adi
8 apr. 2013 15:48:12

Poți modifica rezultatul lui get_results și apoi când ai un array poți folosi implode

Bainternet Bainternet
8 apr. 2013 16:02:32
6

Puteți interoga direct tabela postmeta folosind ceva de genul:

global $wpdb;

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

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

ACTUALIZARE După ce obțineți $metas, le parcurgeți într-o buclă pentru a afișa valorile:

if( count($metas) > 0 ){ #verifică dacă avem rezultate
  foreach ($metas as $meta){
    echo $meta->meta_value . "<br />";
  }
}
8 apr. 2013 14:53:21
Comentarii

Problema este aceeași ca în comentariul meu de mai sus. Iată comentariul meu. Un lucru pe care trebuie să-l întreb este. Când folosesc print_r($metas) îmi arată date ceva de genul Array ( [0] => stdClass Object ( [meta_value] => $custom_tags ) [1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 ) [2] => stdClass Object ( [meta_value] => garlic,soupe ) ) ;. Cum pot să le afișez pe o singură linie fără obiecte.

Adi Adi
8 apr. 2013 16:02:09

Am actualizat răspunsul meu.

RRikesh RRikesh
8 apr. 2013 17:12:51

@RRikesh Te rog să arunci o privire la $wpdb->prepare(). Întotdeauna pregătește-ți declarațiile, indiferent de ce.

kaiser kaiser
10 apr. 2013 01:15:26

@kaiser Mulțumesc, am actualizat răspunsul meu. Apropo, ar trebui să pregătesc chiar dacă hardcodez valoarea?

RRikesh RRikesh
10 apr. 2013 08:09:39

În esență, este un înlocuitor pentru sprintf() care se ocupă de înlocuirea %s și %d. Așa că aș face-o oricum. Chiar dacă e doar pentru alții care citesc codul meu sau pentru pregătire în cazul în care voi trece mai târziu la o variabilă dinamică. Ca să răspund la întrebarea ta: Nu, nu într-un caz privat ;)

kaiser kaiser
10 apr. 2013 11:50:44

Bine, mulțumesc mult, voi rămâne la metoda prepare! :)

RRikesh RRikesh
10 apr. 2013 12:19:50
Arată celelalte 1 comentarii