Usar DISTINCT en wp_query
Necesito crear un sistema donde el usuario primero seleccione el estado, luego la ciudad y luego vea la información de las tiendas en esa ciudad.
Para esto, creé un CPT llamado tienda con 2 meta boxes: estado y ciudad.
Para el primer menú desplegable, estoy usando un wp_query con los siguientes argumentos:
$args = array(
'post_type' => 'store',
'posts_per_page' => -1,
'meta_key' => 'state',
'orderby' => 'meta_value',
'order' => ASC,
);
Pero está devolviendo estados repetidos, porque hay más de una tienda en el mismo estado.
¿Cómo puedo solucionar esto? Pensé en usar DISTINCT de mysql pero no sé si es posible.
ACTUALIZACIÓN
El 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');
Pero el filtro no está teniendo efecto

Tendrías que combinarlo con condicionales de WordPress, dependiendo de dónde quieras usar la consulta (por ejemplo is_post_type_archive('store') ), o podrías incluir el filtro directamente en tu plantilla para que solo se llame allí.

Intenta incluirlo justo antes de la consulta, luego llama a remove_filter('posts_distinct', 'search_distinct');
justo después de que termine el bucle.

Con tu código actualizado, es una historia completamente diferente... dices que el estado se está repitiendo ¿cierto? Entonces no hay necesidad de posts "distinct". Pero ¿qué es get_custom_field()
? Eso no parece muy estándar.

¿Tu consulta realmente produce publicaciones de "tienda" duplicadas? ¿O simplemente se está repitiendo el meta?

get_custom_filed() es una función para recuperar valores de metadatos de publicaciones.

Por ejemplo: Tengo tres tiendas. Una en SP y dos en MG. La consulta devuelve SP, MG, MG.

¿Y cuál es el problema exactamente? Ese es el resultado esperado de esa consulta. La consulta no está devolviendo estados, tienes 3 tiendas así que devuelve 3 resultados. Estás consultando entradas. ¿Cómo te gustaría que se comportara? ¿Que solo devuelva una entrada por estado? ¿Basado en qué condiciones? Tu pregunta es demasiado poco clara.

Tienes razón. Así que transformé los estados y ciudades en taxonomías. Gracias.

No estoy seguro de que esta sea la mejor manera de lograrlo, pero puedes usar una consulta directa como esta:
$states = $wpdb->get_results("SELECT DISTINCT meta_value
FROM wp_postmeta
WHERE meta_key = 'state'
ORDER BY meta_value");
El código anterior devolverá un array de valores únicos de metadatos state
, que luego puedes mostrar en una lista usando:
if (count($states)) {
print '<ul>';
foreach ($states as $state) {
print '<li>' . $state->meta_value . '</li>';
}
print '</ul>';
}
