Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/05/2011, 19:38
Avatar de metacortex
metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 11 meses
Puntos: 832
[Mini-tutorial] Usar varios loops para construir un index complejo

Introducción

La repetición de entradas es uno de los problemas más frecuentes a la hora de desarrollar sitios con una estructura de contenidos compleja. Todos hemos visto sitios que cometen este error, la mayoría de los cuales se debe a las limitaciónes de la aplicación en proveer al desarrollador de los recursos apropiados. Muchos de éstos literalmente deben hacer magia para superar este obstáculo, construyendo largas funciones externas o aún reemplazando las existentes "a mano".

WordPress nos concede la posibilidad de olvidarnos de ésta y muchas jaquecas usuales, dotando al programador de múltiples opciones y permitiéndole enfocarse en programar para el proyecto, pues ya todo el background de "trabajo de carpintería" está hecho y listo para usar.

En pocas palabras, lo explicado aquí constituye una de las primeras bases que todo quien programe bajo WordPress debe aprender para solucionar con éxito los problemas relativos a arquitectura de contenido en la página principal.

Ejercicio

Supongamos que estamos trabajando en el index de un portal, cuyas condiciones son las siguientes:

- Tiene 3 grupos de artículos: Grupo 1, Grupo 2 y Grupo 3.
- Grupo 2 no puede mostrar artículos de Grupo 1.
- Grupo 3 no puede mostrar artículos de Grupo 1 ni Grupo 2.

Construyamos primero el query y loop del Grupo 1. Vamos también a crear la variable $no_grupo_1[], la cual alojará las entradas o artículo que NO queremos mostrar en el Grupo 2.

Notemos especialmente la forma de armar el query usando la clase WP_Query en lugar de lo que tradicionalmente hemos visto:

Código PHP:
Ver original
  1. $grupo_1 = new WP_Query('showposts=1&cat=12');
  2. while ($grupo_1->have_posts()) :
  3.     $grupo_1->the_post();
  4.     $no_grupo_1[] = $post->ID; // Aquí capturamos las ID
  5.  
  6.     // Código del loop bla bla...
  7.  
  8. endwhile;

Creamos ahora el Grupo 2, el cual NO repetirá las entradas del Grupo 1. Para ello utilizaremos la variable $no_grupo_1[] justo en el query:

Código PHP:
Ver original
  1. $grupo_2 = new WP_Query(array(
  2. 'post__not_in' => $no_grupo_1,
  3. 'showposts' => 3
  4. ));
  5.  
  6. while ($grupo_2->have_posts()) :
  7.     $grupo_2->the_post();
  8.     $no_grupo_2[] = $post->ID; // Aprovechamos para capturar las ID generadas por este grupo (en caso de necesitarlo para otro loop)
  9.  
  10.     // Código del loop bla bla...
  11.  
  12. endwhile;

Ahora vamos con el Grupo 3, el cual tiene una variante que lo diferencia de los otros: Éste NO debe contener entradas del Grupo 1 ni del Grupo 2, para lo cual mezclaremos ambos arrays ($no_grupo_1 y $no_grupo_2) y procederemos a colocarlo en el mismo sitio:

Código PHP:
Ver original
  1. $no_grupos = array_merge($no_grupo_1 , $no_grupo_2); // Unimos los arrays
  2.  
  3. $grupo_3 = new WP_Query(array(
  4. 'post__not_in' => $no_grupos,
  5. 'showposts' => 3
  6. ));
  7.  
  8. while ($grupo_3->have_posts()) :
  9.     $grupo_3->the_post();
  10.  
  11.     // Código del loop bla bla...
  12.  
  13. endwhile;

Listo. Tan simple como eso. Lo que en cualquier otro CMS hubiese tomado largas líneas de código, con WP lo hemos solucionado con sólo unas pocas. La diferencia (la gran diferencia) es la arquitectura.

El código completo luce así:

Código PHP:
Ver original
  1. $grupo_1 = new WP_Query('showposts=1&cat=12');
  2. while ($grupo_1->have_posts()) :
  3.     $grupo_1->the_post();
  4.     $no_grupo_1[] = $post->ID; // Aquí capturamos las ID
  5.  
  6.     // Código del loop bla bla...
  7.  
  8. endwhile;
  9.  
  10. $grupo_2 = new WP_Query(array(
  11. 'post__not_in' => $no_grupo_1,
  12. 'showposts' => 3
  13. ));
  14.  
  15. while ($grupo_2->have_posts()) :
  16.     $grupo_2->the_post();
  17.     $no_grupo_2[] = $post->ID; // Aprovechamos para capturar las ID generadas por este grupo (en caso de necesitarlo para otro loop)
  18.  
  19.     // Código del loop bla bla...
  20.  
  21. endwhile;
  22.  
  23. $no_grupos = array_merge($no_grupo_1 , $no_grupo_2); // Unimos los arrays
  24.  
  25. $grupo_3 = new WP_Query(array(
  26. 'post__not_in' => $no_grupos,
  27. 'showposts' => 3
  28. ));
  29.  
  30. while ($grupo_3->have_posts()) :
  31.     $grupo_3->the_post();
  32.  
  33.     // Código del loop bla bla...
  34.  
  35. endwhile;


Notas

1.- Para enfocarnos en la función y evitar la maraña de código se obviaron algunos componentes del loop como if($variable->have_posts()) y la condición else. La estructura completa de cada loop debe ser así:

Código PHP:
Ver original
  1. $variable = new WP_Query('parametros, etc etc');
  2. if ($variable->have_posts()) :
  3.     while ($variable->have_posts()) :
  4.         $variable->the_post();
  5.  
  6.         // Código del loop bla bla...
  7.  
  8.     endwhile;
  9. else:
  10.  
  11.     // Lo que ocurre si no hay entradas
  12.  
  13. endif;

2.- Usar la clase WP_Query nos permite asignarla a variables tantas veces necesitemos, mientras nos mantenemos libres de conflictos entre queries. Una vez asignada, podemos emplear el mismo método que query_posts().

3.- Las variables que contienen las IDs resultantes deben convertirse en arrays agregando corchetes "[]" al final (ejemplo: $no_grupo_1[]). El parámetro 'post__not_in' sólo acepta arrays.

4.- El resultado de un query es un array de datos que podemos tratar como deseemos, es decir, podemos inventarnos nuestros propios "loops" para modelar nuestro resultado. Si bien es cierto de que existen determinados loops predefinidos en WordPress, no es una limitante para poder hacer lo que queramos con nuestro código.

5.- Con lo explicado se demuestra que es plenamente posible basarnos en WordPress para desarrollar portales web de cualquier complejidad, con mayor rendimiento general, opciones y libertad de acción que muchos desarrollos a medida, lo cual hace de la aplicación una excelente herramienta para el programador.

6.- El que siga pensando que "WordPress es sólo para blogs" está -como bien dice mi abuela- más pelao que rodilla de chivo.

Última edición por metacortex; 11/05/2011 a las 13:59