Llamamos loop al código PHP que usaremos en los archivos de plantilla de nuestro tema para mostrar posts.
Nótese que cuando hablo de posts, me refiero a cualquier tipo de contenido o post, no necesariamente a entradas, sino también a páginas, custom post types y attachments. Todo dependerá de qué pantalla del sitio esté siendo visitada.
Cualquier código que incluyamos dentro del loop, se repetirá tantas veces como posts corresponda mostrar en la página actual.
El loop de WordPress luce de la siguiente manera:
Como puedes apreciar el código es bastante sencillo, en comparación a la vital labor que cumple en nuestra tarea de crear temas de WordPress.
Analicémoslo
Cuando vemos
if ( have_posts() ) :
, lo que está haciendo WordPress es verificar si hay posts que calcen con la página que estamos cargando en el navegador. Por ejemplo, si estamos cargando la página de una categoría en particular, WordPress, verificará si efectivamente hay artículos dentro de esa categoría.
Si no hay posts que calcen con el criterio, entonces WordPress pasará directamente a
else :
y mostrará algún mensaje al usuario en caso de que hayamos configurado el loop de esa manera. Luego todo termina con un endif;
.
Pero si hay posts, WordPress pasará a
while ( have_posts() ) :
lo cual básicamente genera un bucle que se repetirá tantas veces como posts corresponda cargar en la página. Este bucle finaliza conendwhile;
.
Dentro del bucle con encontraremos con la función
the_post();
, lo cual, básicamente establece en cada vuelta del bucle la información del post a mostrar, de esa forma, tendremos todo preparado para cargar el contenido de nuestros posts.
En la mayoría de los casos, la forma en que usaremos el loop, será exactamente la misma que vimos anteriormente, sin embargo, es importante conocer qué es lo que hace cada una de las partes, en caso de que queramos realizar algo más avanzado y modificar la forma en que se usa el loop.
Mostrando el contenido
Ahora que ya sabemos cómo funciona el loop, estamos listos para agregarle nuestro contenido.
Veamos como sería:
Con este loop, estamos dando a WordPress la instrucción de que por cada post que corresponda mostrar en la página actual , imprima en el HTML un elemento article con las clases que corresponda a ese post en particular, que contenga un header con un h1 que lleve el título y, que cargue el contenido del post.
Obtendríamos algo más o menos así:
Si estamos viendo una página de categoría, esta estructura HTML se repetirá tantas veces como posts haya dentro de esa categoría, siempre y cuando, la cantidad sea igual o menor a lo que hayamos definido en el área de administración de WordPress en Ajustes > Lectura > Número máximo de entradas a mostrar en el sitio.
Si se diera el caso de que la cantidad de posts supere al número definido en los ajustes de WordPress, entonces los contenidos serán paginados y sólo se mostrará esa cantidad por cada página.
Mientras que si estamos cargando una página de detalle, por ejemplo de una entrada, solo se cargará una vez con la información de ese artículo en particular.
Agregando un contenedor
Hace unos párrafos atrás analizamos en detalle qué es lo que hace cada parte del loop, y gracias a ello podremos intervenirlo y agregar cierto maquetado adicional.
Lo que haremos en el siguiente ejemplo es añadir un elemento
section
que contenga todos los article
que genere el loop.
De este modo, si hay posts que mostrar, todos ellos estarán incluidos dentro de un elemento con la clase ‘listado-articulos‘, mientras que si no los hay, el section que se presentará tendrá la clase ‘error‘.
Al poner la apertura y el cierre del elemento
section
entre if
ywhile
, permite que éste se imprima en el HTML solo si hay posts, pero no se repita por cada uno de ellos.
fuente; http://franciscoamk.com/el-loop/
-----------
Uso avanzado del Loop de WordPress
Recientemente te he explicado qué es y cómo funciona el loop de WordPress, y tambiéncómo modificar el loop para conseguir que se comporte de la manera en que tú quieras que lo haga, usando
WP_Query
entre otros métodos para recuperar contenidos específicos de la base de datos.
Seguramente después de leer los anteriores artículos, te estarás preguntando cómo usar más de un Loop en WordPress y qué tienes que tener en cuenta para que no se rompa tu web. Está claro que el Loop se puede usar múltiples veces en tus temas y plugins. Como ya viste, esto facilita muchísimo el hecho de poder mostrar diferentes tipos de contenido en diferentes lugares de tu web en WordPress. Sin embargo, hemos de ser muy cuidadosos y seguir ciertas normas para evitar problemas.
En este último artículo sobre el loop de WordPress te voy a describir aspectos más avanzados sobre su uso. Veremos los loops anidados, cómo conseguir loops multipasada y cómo resetear loops y así mantener tu web sin errores.
De esta forma, una vez entiendas estos últimos conceptos algo más complejos, podrás considerarte todo un experto en
WP_Query
y el loop de WordPress, y seguramente tendrás una mayor confianza al desarrollar tus propios temas o plugins, que es de lo que se trata. Sin más dilación, comencemos.Loops Anidados
Los Loops anidados no son más que combinaciones de Loops unos dentro de otros. Se pueden crear dentro de un template de un tema usando, por ejemplo, el Loop principal junto a instancias adicionales de
WP_Query
.
Como siempre es más fácil entender las cosas mediante un ejemplo, veamos cómo podemos crear un Loop anidado al Loop principal para mostrar entradas relacionadas con una entrada concreta basándonos en las etiquetas de dicha entrada. El código es este:
En el fragmento anterior tenemos el Loop principal que viene dado (líneas 2 y 3). Para cada entrada dentro de este loop mostramos la URL de la entrada y su título (ver
the_permalink
y the_title
en la línea 6), así como el contenido (ver the_content
en la línea 8).
Además, obtenemos las etiquetas de la entrada con la función
wp_get_post_terms
(la tienes en el Codex aquí) y las guardamos en la variable $tags
(ver línea 11). Si la entrada tenía etiquetas, cogemos los identificadores de las etiquetas y los guardamos en $tagIDs
(líneas 13 a 20).
Por último, vamos a crear un Loop anidado dónde buscar entradas que tengan las mismas etiquetas que la entrada principal. Estas serán las entradas relacionadas que mostraremos a continuación. Para ello, creamos una nueva instancia de
WP_Query
(ver línea 30) y le pasamos el array de argumentos de la línea 24. Aquí (líneas 25 a 28) ponemos como condiciones que las entradas tengan las etiquetas cuyos identificadores están en $tagIDs
(tag__in
en línea 25) y que no sean la entrada principal (línea 26, para evitar repetir la entrada que ya hemos mostrado). Además, indicamos que queremos que el resultado se componga de un máximo de 5 entradas (condición en la línea 27).
Ejecutamos el loop anidado (línea 30) y si hay resultados (línea 31) iteramos por el bucle de entradas relacionadas y mostramos un enlace y el título de cada uno de estas entradas (línea 36). Obviamente, podemos incluir las etiquetas HTML y el CSS que queramospara maquetar el diseño como mejor nos guste, pero la estructura básica para entradas relacionadas usando loops anidados es la que has visto.
Loops Multipasada
Una técnica avanzada para reutilizar Loops es usar la función
rewind_posts
(que tienesaquí descrita en el Codex). Esta función rebobina la consulta a la base de datos y el contador del loop, lo que nos permite hacer otro loop usando el mismo contenido que en el primerloop. Veamos un ejemplo dónde procesamos el Loop principal dos veces.
Hay que colocar la función
rewind_posts
justo al final del primer bucle (ver línea 7), para que todo se rebobine y el segundo bucle pueda funcionar tal y como lo hizo el primero. Si no conoces el concepto de rebobinar, es que eres demasiado joven Cómo Resetear Loops
Cuando modificamos el Loop principal o creamos loops personalizados, suele ser recomendable resetear el loop una vez hemos terminado. Esto lo podemos hacer de dos maneras distintas en WordPress: con
wp_reset_postdata()
y con wp_reset_query()
.
El primer método es usar
wp_reset_postdata()
. Esta función restaura la variable globaln$post
con el valor de la entrada actual en la consulta principal. Es el método preferido cuando usamos WP_Query
para crear loops personalizados.
Por ejemplo, supongamos que definimos un Loop personalizado como el siguiente:
Vemos que este loop modifica el Loop principal usando una nueva instancia de
WP_Query
con condiciones específicas. Para evitar que otros loops en la misma página se vean afectados por este, utilizamos la llamada a la función wp_reset_postdata()
al final de este loop (ver línea 10). Esto restaura la variable $post
y elimina problemas con el objeto WP_Query
principal.
El segundo método disponible para evitar problemas al usar múltiples loops es utilizar la llamada
wp_reset_query()
. Es el método preferido cuando usamos query_posts()
en nuestro loop personalizado.
En resumen,
wp_reset_query()
va siempre después de usar query_posts
en el loop ywp_reset_postdata()
va siempre después de un loop que use WP_Query
o la funciónget_posts()
para recuperar datos. Si has tenido problemas alguna vez con múltiples loops, con estas dos funciones lo arreglas.Repaso final
Y hasta aquí esta serie de artículos sobre el loop y
WP_Query
en WordPress. Recordemos brevemente todo lo que hemos aprendido hasta ahora:- En la primera entrada hemos estudiado:
- los pasos que sigue WordPress para generar el contenido de una página web,
- la estructura básica de un Loop en WordPress,
- el uso de Template Tags para mostrar contenido específico en un loop,
- y que el Loop es la conexión entre los datos que tenemos en la base de datos MySQL y el HTML que se renderiza en el navegador.
- En la segunda entrada vimos:
- cómo usar
WP_Query
para crear loops personalizados, - qué parametros podemos usar para modificar el loop,
- cómo usar
query_posts()
para modificar el loop de WordPress, - cómo usar
get_posts()
como alternativa a un loop para obtener contenidos, - y cómo usar el hook
pre_get_posts
para modificar todos los loops de WordPress.
- cómo usar
- En esta última entrada hemos visto:
- el uso de loops anidados para recuperar información compleja a partir de una entrada,
- cómo usar loops multipasada mediante el uso de la función de rebobinado de loops
rewind_posts()
, - cómo resetear loops con
wp_reset_query()
ywp_reset_postdata()
para evitar problemas entre loops.
Ya ves que ha sido bastante duro. Si quieres más información, está claro que has de ir alCodex. Te recomiendo que empieces estudiando más detalles sobre el objeto WP_Query. A partir de ahí podrás ir navegando y viendo todo lo que he ido explicando en esta serie.
Y si te quedan dudas, no te lo pienses y escríbenos. Déjanos un comentario con tu problema o con lo que quieras que expliquemos en más detalle e intentaremos ayudarte.
fuente: http://wprincipiante.es/uso-avanzado-del-loop-de-wordpress/
........
Usando el objeto
Usando
Usando
Usando el hook
........
Cómo modificar el Loop de WordPress
Hoy iremos un paso más allá y veremos cuatro formas diferentes de personalizar el Loop de WordPress para que se comporte de la manera en que tú quieras que lo haga. Para ello te enseñaré a usar el objeto
WP_Query
para crear un Loop personalizado. Además, vas a conocer las funciones query_posts()
y get_posts()
, que también te permitirán manipular el Loop. Y por último, aprovecharás el hook pre_get_posts
para modificar la consulta a la base de datos del Loop de WordPress antes de que esta se ejecute, y así cambiar el contenido que se obtiene como resultado.
Todo esto parece muy complicado (y en parte lo es), pero si sigues leyendo atentamente estoy seguro de que comprenderás los conceptos y obtendrás la experiencia suficiente como para subir de nivel en la escala de desarrolladores novatos de WordPress. ¡Atento que esto empieza ya!
Usando el objeto WP_Query
Como ya deberías saber, cuando WordPress recibe una URL del servidor web para procesar, la descompone en una serie de parámetros que utiliza cuando hace la consulta a la base de datos. Si entras en la URL de una entrada, WordPress será capaz de obtener el identificador de la entrada a partir de la URL y utilizará este identificador para hacer la consulta en la base de datos. Del mismo modo, si entras en la URL de una categoría, WordPress extraerá el nombre de la categoría de la URL para obtener de la base de datos todas las entradas que pertenezcan a tal categoría.
La consulta a la base de datos se realiza mediante el objeto
WP_Query
. Concretamente, existe la variable global $wp_query
que es usada para recuperar el contenido del Loop principal de una página. Si queremos crear un nuevo Loop personalizado, tendremos que usar una nueva instancia de WP_Query
. Ten en cuenta que los Loops personalizados pueden usarse en cualquier archivo de tu tema para mostrar diferentes tipos de contenidos.
Cuando creas un nuevo objeto
WP_Query
, este contiene funciones por defecto para construir consultas y ejecutarlas para obtener entradas. Nos aprovecharemos de esto para construir nuestras propias consultas personalizadas con los parámetros que queramos para modificar el Loop y así extraer el contenido que queramos de la base de datos.
A continuación, tienes un Loop personalizado usando el objeto
WP_Query
para obtener y renderizar las entradas cuyo autor sea avillegasn.
Fíjate que en vez de usar los métodos
have_posts()
y the_post()
directamente, tal y como vimos en la explicación del funcionamiento del Loop de WordPress, en este Loop personalizado se llaman los métodos a través de la nueva instancia del objeto WP_Query
que hemos creado. Y es en la creación de la nueva instancia (línea 2) cuando especificamos las condiciones para la consulta que incluye nuestro Loop. En este caso, la única condición es author_name=avillegasn
, para indicar que sólo devuelva entradas de este autor. Ten en cuenta que si quisieras poner más de una condición deberías separarlas con el símbolo &
.Parámetros para modificar el Loop
Seguramente te preguntarás qué parámetros puedes usar para crear condiciones nuevas cuando creas un Loop personalizado como el que hemos visto antes. La verdad es que hay una infinidad de posibilidades aquí. Las tienes todas en el Codex de WordPress (cómo siempre) bien documentadas y con ejemplos.
Aún así, creo que es oportuno que veas algunos de los parámetros más usados. ¡A por ello!
Usuarios, Categorías y Etiquetas
Puedes decidir devolver sólo aquellos contenidos que pertenezcan a un usuario, categoría o etiqueta concretos usando los siguientes parámetros:
cat=3,4,5
– Obtiene las entradas de las categorías indicadas mediante el identificador (o identificadores, si hay mas de uno, separados por comas).category_name=comunidad
– Obtiene las entradas de la categoría indicada mediante el nombre de categoría.tag=wprofesional
– Obtiene las entradas de la etiqueta indicada mediante el nombre de etiqueta.tag_id=34
– Obtiene las entradas de las etiquetas indicadas mediante el identificador (o identificadores, si hay mas de uno, separados por comas).author=1
– Obtiene las entradas que tengan como autor a los usuarios indicados mediante el identificador (o identificadores, si hay mas de uno, separados por comas).author_name=avillegasn
– Obtiene las entradas que tengan como autor al usuario cuyoNombre de usuario sea el indicado.
Entradas y Páginas
Del mismo modo, también podemos hacer uso de parámetros específicos para seleccionar sólo ciertas entradas y páginas concretas:
p=135
– Obtiene la entrada que tenga el identificador indicado.name=mi-entrada
– Obtiene la entrada cuyo slug o enlace permanente sea el indicado.page_id=8
– Obtiene la página que tenga el identificador indicado.pagename=mi-pagina
– Obtiene la página cuyo slug o enlace permanente sea el indicado.post_type=page
– Obtiene sólo páginas.post_type=post
– Obtiene sólo entradas.
Ejemplos más complejos
Como podréis ver en el Codex, se pueden hacer consultas mucho más complicadas. En el siguiente ejemplo, seleccionamos las entradas personalizadas del tipo
amigo
ordenadas por el campo personalizado edad
, quedándonos con aquellas cuya edad esté entre 18 y 35.
Usando query_posts()
A pesar de que el método más habitual para modificar el Loop de WordPress es mediante el uso del objeto
WP_Query
, existen otros mecanismos que también puedes usar.
La función
query_posts()
se utiliza para modificar los contenidos devueltos por el Loop principal de WordPress. Concretamente, puedes modificar el contenido devuelto en$wp_query
después de que la consulta por defecto se haya ejecutado, cambiar los parámetros de consulta, y repetir la consulta usando query_posts()
. El mayor problema de usar query_posts()
es que sobrescribe el resultado original del Loop principal, con lo cual hay que ser muy cuidadoso con ella.
La función
query_posts()
la usarás justo antes del inicio del Loop, tal y como vemos a continuación:
En este ejemplo hemos cambiado el Loop indicando a WordPress que sólo muestre aquellas entradas que pertenecen a la categoría que tiene como identificador el número 1 y que además están etiquetadas con las etiquetas
temas
y plugins
.
Como ya hemos dicho, usar la función
query_posts()
tal cual sobreescribe el contenido extraído por el Loop. Esto significa que los contenidos anteriores ya no se devolverán, lo cual es lógico puesto que estamos cambiando la consulta a la base de datos desdequery_posts()
. Para evitar perder el contenido del Loop original (el que venía antes de que pusieras la función query_posts()
) puedes guardar los parámetros de consulta usando la variable global $query_string
:
En este ejemplo concatenamos los parámetros adicionales a los parámetros de consulta que ya están incluidos en
$query_string
. De esta forma lo que estamos haciendo es filtrar la consulta inicial haciéndola más estricta de lo que esta era (indicando que sólo devuelva las entradas del autor avillegasn).
Usando get_posts()
Una alternativa más sencilla al uso de
query_posts()
es la función get_posts()
. Esta simplemente retorna información de entradas. El principal problema es que no tiene en cuenta la configuración de los metadatos necesarios para el uso de Template Tags. Para arreglar esto, hay que usar la función setup_postdata()
. En el siguiente ejemplo vemos cómo se haría esto:
Otra diferencia es que los contenidos que devuelve
get_posts()
están en forma de array. Por eso usamos la sentencia foreach
para recorrerlo (nos hace de Loop).
Aunque encontrarás código antiguo que usa
get_posts()
o query_posts()
, el método preferido para trabajar con Loops es mediante WP_Query()
.
Usando el hook pre_get_posts
Por último, disponemos de una opción adicional para modificar cualquier Loop en tu WordPress mediante el hook
pre_get_posts
. Habitualmente, este es el hook preferido para modificar el Loop principal de WordPress.
El hook
pre_get_posts
tiene como parámetro la consulta global de WordPress, lo que te permite modificarla antes de que se ejecute y devuelva valores. Por tanto, podemos modificar la consulta a la base de datos de WordPress y hacer que incluya nuevas condiciones que modifiquen el contenido que se devolverá una vez se ejecute.
Para usar el hook
pre_get_posts
, habitualmente añadiremos código en el archivofunctions.php
de nuestro tema. Veamos un ejemplo:
Fíjate que estamos usando funciones condicionales (
is_admin()
, is_main_query()
,is_search()
) para modificar el Loop únicamente en areas específicas de WordPress. Concretamente, sólo se mostraran entradas (ver $query->set( 'post_type', 'post' )
en la linea 4) en los resultados de una búsqueda en tu web (ver $query->is_search()
en la linea 3). Por tanto, hemos modificado el Loop para que sólo muestre entradas (y no páginas, ni productos, ni ninguna otra cosa más) únicamente en los resultados de búsquedas. En cualquier otro lugar, el Loop principal se comportará tal y como ya lo hacía, dado que las funciones condicionales evitarán la ejecución de la función set()
de la línea 4.
El hook
pre_get_posts
filtra el objeto WP_Query
, por lo que cualquier cosa que puedas hacer con WP_Query
(como vimos anteriormente) lo puedes hacer en pre_get_posts
usando la función set()
. Esto incluye el uso de los parámetros que te expliqué antes para modificar el Loop.
Para más información sobre el hook
pre_get_posts
, visita la página del Codexhttp://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts.Repaso final
Recuerda que el Loop es el corazón de los temas WordPress. Cualquier tema que se precie usa Loops para recuperar el contenido y mostrarlo con los estilos oportunos. Pero no sólo los temas usan Loops, también los plugins. Mostrar entradas relacionadas o desarrollar un widget para la barra lateral que muestre las entradas más visitadas son funciones que un plugin puede añadir haciendo uso de Loops personalizados.
Hemos visto cuatro maneras diferentes de modificar el Loop principal de WordPress o crear Loops personalizados. Has aprendido a usar el objeto
WP_Query
para crear un Loop nuevo y filtrar los resultados a partir de una serie de parámetros. Además, has conocido las funciones alternativas query_posts()
y get_posts()
y los inconvenientes que tienen. Por último, también has visto el hook pre_get_posts
que permite modificar todos los Loops de WordPress desde un único punto en el código. Tendrás que ir con cuidado al usarlo, ya que es un arma tan potente que en manos inexpertas puede causar el caos.
Si has llegado hasta aquí, te felicito. Has superado una nueva etapa en tu formación como desarrollador WordPress. Y recuerda que no hemos acabado. En una futura entrada veremos ejemplos concretos sobre cómo crear y trabajar con múltiples Loops a la vez. Y si tienes alguna duda, no dudes en comentarla para que podamos mejorar.
fuente: http://wprincipiante.es/como-modificar-el-loop-de-wordpress/
......
No hay comentarios.:
Publicar un comentario