Utilizzare DISTINCT in wp_query
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

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ì.

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

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

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.

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

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

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

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.

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