Utilizzare DISTINCT in wp_query

22 mag 2014, 21:51:51
Visualizzazioni: 15.5K
Voti: 2

Devo creare un sistema in cui l'utente prima seleziona lo stato, poi la città e infine visualizza le informazioni dei negozi in quella città.

Per questo, ho creato un CPT chiamato "store" con 2 metabox: stato e città.

Per il primo menu a discesa, sto usando una wp_query con i seguenti argomenti:

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

Ma restituisce stati ripetuti, perché c'è più di un negozio nello stesso stato.

Come posso risolvere? Ho pensato di usare DISTINCT di MySQL ma non so se è possibile.

AGGIORNAMENTO

Il loop completo:

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

Ma il filtro non ha effetto

0
Tutte le risposte alla domanda 2
12

Non l'ho provato personalmente, ma sembra qualcosa adatto ai filtri posts_distinct o posts_groupby:

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

Ciao Pim. Come posso collegare questo filtro con la query?

marcelo2605 marcelo2605
22 mag 2014 22:17:37

Dovresti combinarlo con i conditional di WordPress, a seconda di dove vuoi utilizzare la query (ad esempio is_post_type_archive('store') ), oppure potresti includere il filtro direttamente nel tuo template in modo che venga chiamato solo lì.

Pim Pim
22 mag 2014 22:20:52

Utilizzerò questa query in un semplice loop.

marcelo2605 marcelo2605
22 mag 2014 22:29:39

Prova a includerlo subito prima della query, poi chiama remove_filter('posts_distinct', 'search_distinct'); subito dopo che il loop è terminato.

Pim Pim
22 mag 2014 22:37:07

Ho aggiunto il filtro come hai detto (vedi sopra) ma non succede nulla.

marcelo2605 marcelo2605
22 mag 2014 22:49:50

Con il tuo codice aggiornato, è tutta un'altra storia... dici che lo state viene ripetuto giusto? Quindi non c'è bisogno di post "distinct". Ma cos'è get_custom_field()? Non sembra molto standard.

Pim Pim
22 mag 2014 23:27:08

La tua query produce effettivamente post "store" duplicati? O è solo il meta che viene ripetuto?

Pim Pim
22 mag 2014 23:35:41

get_custom_filed() è una funzione per recuperare i valori meta dei post.

marcelo2605 marcelo2605
22 mag 2014 23:44:57

Ad esempio: ho tre negozi. Uno su SP e due su MG. La query restituisce SP, MG, MG.

marcelo2605 marcelo2605
22 mag 2014 23:46:19

E qual è esattamente il problema? Quello è il risultato atteso di quella query. La query non restituisce stati, hai 3 negozi quindi restituisce 3 risultati. Stai interrogando post. Come vorresti che si comportasse? Che restituisca solo un post per stato? Basato su quali condizioni? La tua domanda è troppo poco chiara.

Pim Pim
23 mag 2014 00:05:42

Hai ragione. Quindi trasformo stati e città in tassonomie. Grazie.

marcelo2605 marcelo2605
23 mag 2014 00:17:18

@Pim Grazie per questa risposta, esattamente quello di cui avevo bisogno per un progetto

phatskat phatskat
9 giu 2014 18:33:30
Mostra i restanti 7 commenti
0

Non sono sicuro che questo sia il modo migliore per ottenere questo risultato, ma puoi utilizzare una query diretta come questa:

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

Il codice sopra restituirà un array di valori unici dei metadati state, che poi puoi visualizzare in una lista utilizzando:

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