Usar DISTINCT en wp_query

22 may 2014, 21:51:51
Vistas: 15.5K
Votos: 2

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

0
Todas las respuestas a la pregunta 2
12

No lo he probado yo mismo, pero eso suena como algo para los filtros posts_distinct o posts_groupby:

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

Hola Pim. ¿Cómo puedo conectar este filtro con la consulta?

marcelo2605 marcelo2605
22 may 2014 22:17:37

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

Pim Pim
22 may 2014 22:20:52

Voy a usar esta consulta en un bucle simple.

marcelo2605 marcelo2605
22 may 2014 22:29:39

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

Pim Pim
22 may 2014 22:37:07

Agrego el filtro como dijiste (ver arriba) pero no sucede nada.

marcelo2605 marcelo2605
22 may 2014 22:49:50

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.

Pim Pim
22 may 2014 23:27:08

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

Pim Pim
22 may 2014 23:35:41

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

marcelo2605 marcelo2605
22 may 2014 23:44:57

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

marcelo2605 marcelo2605
22 may 2014 23:46:19

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

Pim Pim
23 may 2014 00:05:42

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

marcelo2605 marcelo2605
23 may 2014 00:17:18

@Pim Gracias por esta respuesta, justo lo que necesitaba en un proyecto

phatskat phatskat
9 jun 2014 18:33:30
Mostrar los 7 comentarios restantes
0

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>';
}
23 may 2014 04:37:09