lunes, 8 de febrero de 2016

Entendiendo el loop de WordPress

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 elementosection 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:
<?php
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// contenido de la entrada E (template tags, html, etc)
?><h2>
<a href="<?php the_permalink(); ?>"><?php the_title();?></a>
</h2><?php
the_content();
// cogemos las etiquetas de la entrada E actual
$tags = wp_get_post_terms( get_the_ID() );
if ( $tags ) {
echo 'Entradas Relacionadas';
$tagcount = count( $tags );
for ( $i = 0; $i < $tagcount; $i++ ) {
// recogemos los IDs de las etiquetas
// de la entrada E
$tagIDs[$i] = $tags[$i]->term_id;
}
// parámetros para el loop anidado donde queremos
// 5 entradas que tengan las mismas etiquetas y
// no sean la entrada E
$args = array(
'tag__in' => $tagIDs,
'post__not_in' => array( $post->ID ),
'posts_per_page' => 5,
'ignore_sticky_posts' => 1
);
$relatedPosts = new WP_Query( $args );
if( $relatedPosts->have_posts() ) {
// Loop anidado de entradas relacionadas basándonos en etiquetas
while ( $relatedPosts->have_posts() ) :
$relatedPosts->the_post(); ?>
<p>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</p><?php
endwhile;
}
}
endwhile;
endif;
?>
view rawloop-avanzado.php hosted with ❤ by GitHub
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 (verthe_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.
<!–– primer loop -->
<?php while ( have_posts() ) : the_post(); ?>
<!–– mostrar contenido aqui ––>
<?php endwhile; ?>
<!-- rebobinamos el loop -->
<?php rewind_posts(); ?>
<!-- segundo loop usando los mismos datos que el primero -->
<?php while ( have_posts() ) : the_post(); ?>
<!–– mostrar contenido aqui ––>
<?php endwhile; ?>
view rawrewind-posts.php hosted with ❤ by GitHub
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:
<?php
$entradas = new WP_Query( 'posts_per_page=10&orderby=rand' );
// The Loop
while ( $entradas->have_posts() ) :
$entradas->the_post(); ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br /><?php
endwhile;
// Resetear Post Data
wp_reset_postdata();
?>
Vemos que este loop modifica el Loop principal usando una nueva instancia deWP_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_Queryprincipal.
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.
  • 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 loopsrewind_posts(),
    • cómo resetear loops con wp_reset_query() y wp_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/


........

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.
<?php
$misEntradas = new WP_Query( 'author_name=avillegasn' );
if ( $misEntradas->have_posts() ) :
while ( $misEntradas->have_posts() ):
$misEntradas->the_post();
// renderiza las entradas aquí
endif;
endwhile;
?>
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_Queryque 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.
<?php
$args = array(
'post_type' => 'amigo',
'meta_key' => 'edad',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'edad',
'value' => array( 18, 35 ),
'compare' => 'BETWEEN',
),
),
);
$query = new WP_Query( $args );
?>

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:
<?php
query_posts( 'cat=1&tag=temas+plugins' );
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// renderiza el contenido aqui (template tags, html, etc)
endwhile;
endif;
?>
view raw6-query-posts.php hosted with ❤ by GitHub
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:
<?php
// inicializa la variable global $query_string
global $query_string;
// manten el contenido del Loop original y añade la condicion de un único autor
query_posts( $query_string . "&author_name=avillegasn" );
?>
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:
<?php
$entradas_comunidad = get_posts( 'category_name=comunidad&posts_per_page=5' );
foreach( $entradas_comunidad as $post ) :
setup_postdata( $post ); ?>
<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1><?php
the_content();
endforeach;
?>
view raw8-get-posts.php hosted with ❤ by GitHub
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:
<?php
function mi_funcion_que_filtra_resultados_de_busquedas( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', 'post' );
}
}
add_action( 'pre_get_posts', 'mi_funcion_que_filtra_resultados_de_busquedas' );
?>
view raw9-pre-get-posts.php hosted with ❤ by GitHub
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_postsusando 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