Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

[Mini-tutorial] Usar varios loops para construir un index complejo

Estas en el tema de [Mini-tutorial] Usar varios loops para construir un index complejo en el foro de WordPress en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/05/2011, 19:38
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 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
  #2 (permalink)  
Antiguo 10/05/2011, 20:13
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: [Mini-tutorial] Usar varios loops para construir un index complejo

Excelente tutorial, creo que me diste una buena idea para un sitio que me va a tocar hacer (de gratis por cierto ), creo que las funciones y la manera tan simple de utilizar este CMS nos hace un poco mas facil crear blogs, webs o lo que necesitemos en un momento, solo necesitamos la creatividad para generar nuestros sitios.

Cita:
Iniciado por metacortex Ver Mensaje
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.
Creo que no puedo estar mas de acuerdo con tigo, aunque no he trabajado mucho con aplicaciones prefabricadas, solo un poco que me meti con joomla y de verdad me parecio mas sencillo y practico trabajar con wordpress (opinion personal ojo), aunque aveces hago cosas con un mini-marco de trabajo propio que tengo hecho con php y el modelo MVC.

saludos con estos mini-tutoriales como los llamas tu he aprendido un mundo de wordpress que ya no le huyo a este.
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: construir, index, loops
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 21:08.