Cum să utilizezi DISTINCT în wp_query pentru afișarea statelor unice
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

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.

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

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

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.

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

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

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

Ș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ă.

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

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