Cum să utilizezi DISTINCT în wp_query pentru afișarea statelor unice

22 mai 2014, 21:51:51
Vizualizări: 15.5K
Voturi: 2

Am nevoie să creez un sistem în care utilizatorul selectează mai întâi statul, apoi orașul și apoi vede informațiile despre magazinele din acel oraș.

Pentru asta, am creat un CPT numit 'store' cu 2 meta box-uri: stat și oraș.

Pentru primul meniu derulant, folosesc un wp_query cu următorii parametri:

$args = array(
    'post_type' => 'store',
    'posts_per_page' => -1,
    'meta_key' => 'state',
    'orderby' => 'meta_value', 
    'order' => ASC,
);

Dar returnează state duplicate, deoarece există mai mult de un magazin în același stat.

Cum pot rezolva asta? M-am gândit să folosesc DISTINCT din MySQL dar nu știu dacă este posibil.

ACTUALIZARE

Bucla completă:

$args = array(
    'post_type' => 'store',
    'posts_per_page' => -1,
    'meta_key' => 'state',
    'orderby' => 'meta_value', 
    'order' => ASC,
);

 function search_distinct() { return "DISTINCT"; }
 add_filter('posts_distinct', 'search_distinct');
 $the_query = new WP_Query( $args );

 if ( $the_query->have_posts() ) {
   echo '<ul>';
   while ( $the_query->have_posts() ) {
      $the_query->the_post();
      echo '<li>' . get_custom_field('estado') . '</li>';
   }
   echo '</ul>';
 }
 wp_reset_postdata();
 remove_filter('posts_distinct', 'search_distinct');

Dar filtrul nu are efect

0
Toate răspunsurile la întrebare 2
12

Nu am încercat eu însumi, dar sună a ceva pentru filtrul posts_distinct sau posts_groupby:

function search_distinct() {
    return "DISTINCT";
}
add_filter('posts_distinct', 'search_distinct');
22 mai 2014 22:15:10
Comentarii

Bună Pim. Cum pot conecta acest filtru cu interogarea?

marcelo2605 marcelo2605
22 mai 2014 22:17:37

Ar trebui să-l combini cu condiționalele WordPress, în funcție de unde vrei să folosești interogarea (de exemplu is_post_type_archive('store') ), sau ai putea include filtrul direct în template-ul tău, astfel încât să fie apelat doar acolo.

Pim Pim
22 mai 2014 22:20:52

Voi folosi această interogare într-o buclă simplă.

marcelo2605 marcelo2605
22 mai 2014 22:29:39

Încearcă să o incluzi chiar înainte de interogare, apoi apelează remove_filter('posts_distinct', 'search_distinct'); imediat după ce bucla se termină.

Pim Pim
22 mai 2014 22:37:07

Am adăugat filtrul cum ai spus (vezi mai sus) dar nu se întâmplă nimic.

marcelo2605 marcelo2605
22 mai 2014 22:49:50

Cu codul tău actualizat, e cu totul altă poveste... spui că starea se repetă, corect? Deci nu e nevoie de postări "distincte". Dar ce este get_custom_field()? Nu pare foarte standard.

Pim Pim
22 mai 2014 23:27:08

Întrebarea ta returnează efectiv postări duplicate de tip "magazin"? Sau doar meta datele se repetă?

Pim Pim
22 mai 2014 23:35:41

get_custom_filed() este o funcție pentru a prelua valorile meta ale postărilor.

marcelo2605 marcelo2605
22 mai 2014 23:44:57

De exemplu: Am trei magazine. Unul în SP și două în MG. Interogarea returnează SP, MG, MG.

marcelo2605 marcelo2605
22 mai 2014 23:46:19

Și care este problema exact? Acesta este rezultatul așteptat al acelei interogări. Interogarea nu returnează state, ai 3 magazine așa că returnează 3 rezultate. Tu interoghezi postări. Cum ai vrea să se comporte? Să returneze doar o postare pe stat? Bazat pe ce condiții? Întrebarea ta este prea neclară.

Pim Pim
23 mai 2014 00:05:42

Ai dreptate. Așa că am transformat statele și orașele în taxonomii. Mulțumesc.

marcelo2605 marcelo2605
23 mai 2014 00:17:18

@Pim Mulțumesc pentru acest răspuns, exact ce aveam nevoie pentru un proiect

phatskat phatskat
9 iun. 2014 18:33:30
Arată celelalte 7 comentarii
0

Nu sunt sigur că aceasta este cea mai bună metodă pentru a obține acest lucru, dar poți folosi o interogare brută astfel:

$states = $wpdb->get_results("SELECT DISTINCT meta_value 
                              FROM wp_postmeta 
                              WHERE meta_key = 'state'
                              ORDER BY meta_value");

Codul de mai sus va returna un array cu valori unice ale metadatelor state, pe care le poți afișa într-o listă folosind:

if (count($states)) {
  print '<ul>';
  foreach ($states as $state) {
    print '<li>' . $state->meta_value . '</li>';
  }
  print '</ul>';
}
23 mai 2014 04:37:09