Contenido

query_posts(), personalizando nuestros blogs

13 ene

+ 61

query_posts() es una de las funciones estrella de WordPress. Con ella podemos modificar la salida por pantalla haciendo que :

  • Solo aparezca un post o una página
  • Mostrar todos los posts en un tiempo determinado
  • Mostrar solo los últimos posts en la principal
  • Cambiar el orden de los posts
  • Mostrar los posts de una sola categoría.
  • Y muchas cosas más…

query_posts(), es un interfaz para modificar las consultas a base de datos facilitandonos la tarea reduciendo nuestra labor a introducir una serie de modificadores que serán pasados como parámetro a la función y que nos modificará la salida de posts.

Esta función está pensada para ser usada junto al famoso Loop de WordPress que se encargará de mostrar el resultado de query_posts() con los modificadores que nosotros les hayamos pasado.

Ejemplo de uso

<?php
query_posts('....');
while (have_posts()) : the_post();
...
endwhile;
?>

Parámetros

query_posts() nos permite enviar una serie de parámetros que podemos separar en varios tipos:

Parámetros de categorías

  • cat
  • category_name

Ejemplos

query_posts('cat=4'); //Únicamente los posts de la categoría con ID (4)
query_posts('cat=-4'); //Todos excepto los de la categoría con ID (4)
query_posts('category_name=Categoria'); //Solo los de las categoria (Categoria)
query_posts('cat=1,2,4,5,7'); //Únicamente los posts de las categorías indicadas.

Parámetros de Tags

  • tag

Ejemplo

query_posts('tag=cooking'); // Todos los posts con el tag (cooking)
query_posts('tag=bread,baking'); //Todos los posts que contengan (bread) o (baking)
query_posts('tag=bread+baking+recipe'); //Todos los posts que contentan las 3 tags

Parámetros de Autor

  • author_name
  • author

Ejemplo

query_posts('author_name=aNieto2k'); //Todos los posts en los que el autor sea (aNieto2k)
query_posts('author=2'); //Todos los posts del autor (2)
query_posts('author=-4'); //Todos los posts menos los del autor (4)

Parámetros de posts y páginas

  • p
  • name
  • page_id
  • pagename
  • showposts

Ejemplo

query_posts('p=1'); //Únicamente el post (1)
query_posts('name=first-post'); //Únicamente el post con nombre (first-post)
query_posts('page_id=7'); //La página con ID (7)
query_posts('pagename=about'); //La página con nombre (about)
query_posts('showposts=1'); //Modifica el LIMIT del SQL para indicar el número de posts a mostrar.

Parámetros de tiempo

  • hour
  • minute
  • second
  • day
  • monthnum
  • year

Ejemplo

query_posts('hour=01'); //Todos los post de las (1:00)
query_posts('minute=30'); //Todos los posts del minuto 30(*:30)
query_posts('second=07'); //Posts del segundo 7 (*:*07)
query_posts('day=1'); //Los posts de los días (1)
query_posts('monthnum=2'); //Los posts del mes (2)
query_posts('year=2005'); //Los posts del año (2005)

Parámetros de paginación

  • paged
  • posts_per_page
  • order

Ejemplo

query_posts('paged=2'); //Todos los posts que se encuentren en la página (2) de la paginación
query_posts('posts_per_page=10'); //Número de posts por página (10)
query_posts('order=ASC'); //Orden de la paginación (ASC)

Combinar parámetros

No tendría mucha gracia que únicamente pudieramos usar un solo parámetro ya que esto limitaría considerablemente el potencial de la función, para ello podemos hacer uso de (&) con el que podremos unir varios parámetros para pulir nuestra condición.

query_posts("cat=-1,-2,-3&page_id=7&tag=bread,baking");

La imaginación es la única limitación.

  • Wow, ¡sensacional post! Ojalá lo hubieras escrito hace unas semanas, que tuve que pelearme con este tema sin tener mucha idea de los entresijos de WordPress. Me has dejado alucinado con lo del tiempo, no sabía que se podía filtrar con tanta precisión.

  • Es una documentación fantastica! me sirve mucho.. también hace más de una semana estaba buscando personalizar las llamadas pero esto ya es más completo.

    Como siempre has hecho un aporte grande!

    Gracias

    Un saludo

  • Gran post, me lo guardo, me vendrá bien si algún día necesito modificar un thema para hacerlo tipo magazine o algo.

  • Hola, tengo una pregunta.

    En un blog vi que en el index tenian el ultimo post de cada categoria.

    Quisiera hacer lo mismo…

    Me pueden tirar una pista acerca de como seria?

    Gracias!

  • Ninio Romantico es facil solo es cuestion de hacer un query por cada categoria con esta condicion.

    query_posts(‘category_name=Categoria&showposts=1&order_by=date&order=DESC’);

    creo que podrias hacelo mas facil metiendolo a un ciclo cambias category_name por cat e imprimes una variable que incremente

    cat=1
    cat=2
    cat=3, etc etc

  • juanjosezq, esto ultimo que mencionas si que es interesante alguna vez lo pensé, pero como de programación no se mas que pegar y copiar algunos archivos jamas lo implemente.

    Muy buen post y muy buenos comentarios por cierto.

    saludos

  • A ver.. esa idea la tengo, lo que me falta es como ponerlo.

    El query_posts() no lo tengo en mi theme.

    Tengo el clasico loop

    Necesito saber a donde ponerlo.
    Tengo que repetir el loop?
    Como indico que sea solo el ultimo post de cada categoria?
    Que parte del codigo repito para cada categoria?

    No hace falta que sea auto incremental pq solo pienso poner las categorias principales.

    Gracias juanjosezg por tu respuesta… pero me falta un poco más d info :P
    Entiendo los codigos, pero no se programar xD

  • PD: Ya se donde ponerlo XD

    Ahora me falta todo lo demas acerca d las categorias.

    GRacias!

  • Y es posible hacer este tipo de queries via URI?

    Vi que para tags funciona bien, incluso tiene varios operadores (, +)…. pero en WP 2.3.1 no me funciona para multiples categorias:

    ?cat=3,4 retorna solo los resultados para la categoria 3, pasando a ser /category/nombre-categoria-3/

  • Como hago para mostrar sólo 5 de mis 21 categorias, las de id 1, 3, 5 y 9 ?

    Gracias

  • @Sabogal: Pues exactamente como los has puesto, separandolas por (,) comas.

  • Andres que tal?

    Veo en los parametros de tiempo que no esta week, he pensado que quiza no aparece porque se puede usar day, pero eso solo se podria hacer si el mes y la semana parte el Lunes 1, o domingo 1 depende de los paises el inicio de semana, por cierto. Hay alguna forma de mostrar los post por semanas pasadas y no tan solo meses?.

    Saludos.

    PD: soy + copypaster…

  • @angel: Aunque no esté en la especificación, puedes hacer busquedas usando el parámetro (w), usando el número de semana del año ;)

    Saludos

  • Gracias aNieto2k, yo también necesitaba algo así, pues prefiero una línea de código a un nuevo plugin. Lo acabo de probar en WP 2.2.3 y funciona perfectamente.

  • Buenísimo. Es una forma bastante rápida de lograr grandes resultados.

    Saludos!

  • Cuantos query_post puedo poner???
    mi idea es aparecer los post ordenados por dia, ej: si tengo 4 post en un dia, quiero que estos aparescan ordenados.
    Gracias

  • Ya me respondi la pregunta.
    Ahora tengo la sgte duda, como puedo hacer que en vez de que me muestre los post del dia 1, lo haga con cada dia??

  • Muy bueno el post, muchas gracias.
    ¿Sabes como hacer para que en el loop principal se ignoren determinados post y solo se vean cuando tenemos una categoria seleccionada?

  • Tengo una consulta::: espero puedan ayudarme!!
    lo que quiero es que busque los posts de una determinada categoria, pero no cat=1 o 2 o 3..etc.. (o sea.. no se sabe previamente cuales se deben mostrar) sino que de un enlace anterior proviene. sera mas especifico::
    aqui obtengo el id de la categoria deseada::::
    $categoria = $_REQUEST[‘id’];
    ahora como meto esa informacion al query_posts(‘cat=!!!!AQUI!!!!’); dado q no funciona llamar a la varible.
    Espero q puedan ayudarme. Gracias de manera anticipada!

  • HOla.. en lo personal lo solucione asi

    Pero me parece poco profesional, ya que no siempre conocere q categorias se usara..!!. Estare pendiente de sus sugerencias!! Gracias

  • @EDERZM: Podrías usar algo así


    query_posts('cat='.$_REQUEST['id']);

    Y luego desde donde llames añade al enlace el ID de la categoría.

    Debería funcionar a la primera :D

  • Tengo una consulta, nose porque mi template no me muestra dentro de la categoria el numero de posts que tiene al lado de la misma por ej… Categoria (4)… seguramente hay que hacer un count por categoria.. me dan una mano?

  • he probado el query para una categoria determinada en mi sitio, pero al hacerlo no me funciona la paginación del blog, alguna ayuda?!?!?!?!

  • no me ha funcionado el cat=-numero, tampoco usando category_name=-nombre… solo he podido lograr lo que necesito, usando un query post solicitando distinto contenido, pero no negandolo. no se a que se deba.

  • Hola Andres.

    Estuve traatndo de entender lo que nos explicas. Y creo qeu es posible de implementar en un theme que estoy diseñando.( mas bien estoy aprendiendo a diseñar)
    mi gran pregunta es ¿como hago para mostrar en el index, tan solo el ultimo post?

    he insertado el codigo pero al parecer hay algo que no cuadra por que me sale error.
    Agradeceria un poco de ayuda.

    gracias

  • @Mr.Yin: pues debería ser tan fácil de meter

    query_posts('showposts=1');
    if(have_posts()):
    ...

    Con esa línea ( la negrita) debería solo devolverte 1 post.

  • Buenos dias, ante todo agradecer este interesante hilo.
    He estado probando en WP 2.6 y todo fantástico. Tan sólo una pega, tengo instalado el WP-PageNavi y cuando hago el “query” a una determinada categoria no me la pagina.
    Accediendo a dicha categoria mediante uri la pagina sin problemas, pero no mediante el “query”.
    Alguien sabe la solucion? (en el query he puesto como parametros “nombre de la categoria” y he probado a mostrar por orden y numero determinado de posts..y nada).
    Gracias de antemano

  • Tengo una duda, cómo podría excluir del loop el último post de una categoría?, pero sólo ese

    query_posts('cat=-7');

    Si pongo esto me excluye todos los post de esa categoría, cómo podría excluir sólo el último y mostrar el resto?

  • @minimal: Se me ocurre que podrías obtener primero el ID del último post de la categoría 7 y despues excluir ese post.

  • @minimal
    @minimal: aver prueba

    query_posts(‘cat=7&offset=1′);

    te extraera todo las noticias de la categoria 7 menos el primero.

  • Al final viendo lo complicado que era cambié de parecer y lo he solucionado de otra manera.

    Mi intención era crear arriba en la portada del blog un post destacado y después evitar que apareciera debajo excluyendo el último post de la categoría “destacados”.

    Probando y viendo que no daba con la solución opté por en vez de poner un post especial en el apartado de destacados, usar ese apartado para darle un formato especial al último post publicado en el blog, por lo que resulta más sencillo añadiendo el offset=1 debajo.

    No sé si me he explicado jajaja, creo que sí más o menos.

  • Hola!

    de repente a mi no me hace caso ningun parametro de la funcion, de hecho puedo no ponerla y sigue igual…

    query_posts('showposts=1'); // tanto si dejo esta linea como si la pongo me saca todos los post.
    while (have_posts()) : the_post();
    echo the_title();
    endwhile;

    he probado a filtrar tambien por categoria y nada…
    estoy muuu peridio por lo visto.

    ¿me podeis echar un cable?

    gracias!

  • @Manolo: Tiene pinta de estar bien, mira a ver si tienes un plugin que está cacheando la salida, wp-cache, wp-supercache, …si es así, desactivalo y vuelve a probar.

    Dinos cosas.

  • Hola, lo que quiero hacer yo, es cargar la lista de 10 ultimas entradas pero la ultima aparte.
    Me explico, publicar a la izquierda el ultimo post y a la derecha los ultimos 9.
    ¿Es posible?

    Gracias

  • Hola! Increible el post…es una lastima que mi conocimiento sobre esto sea tan tan limitado ( menos mal que poco a poco ampliamos conocimientos…).

    Yo tengo una dudilla de novato que no tengo ni idea de como resolver. Mi blog es formato magazine y quiero mostrar una noticia primaria y una secundaria dentro del bloque de la categoria. Es decir, mostrar la última noticia en “grande”, y la penultima solo con un enlace y en texto mas pequeño.

    Para ello, tendria que crear otro query posts con las mis caracteristicas excluyendo solo la primera noticia, no? El caso es que no se como hacerlo jeje. Agradezco cualquier sugerencia…

    Gracias!!

  • Pues no hace falta que hagas 2 query_posts(), yo lo que haría es algo asi:

    
    if (have_posts()) :
    	 $contador = 0;     //Iniciamos contador
       while (have_posts()) : 
    	   the_post();
         if ($contador++ < 0) {
         	... POST GRANDE ...
         } else {
         	... POST PEQUEÑOS ...
         }
      endwhile;
    endif;     
    
  • Hace tiempo que utilizo esta función gracias a tí y me ha funcionado perfectamente hasta que he intentado combinar varios parámetros.
    query_posts(‘showposts=7&cat=-235′)
    Ha invertido el orden de los artículos, los primeros salen los últimos. He metido también order=ASC pero tampoco ha funcionado.

    Gracias por ésta y por las otras ideas tuyas que me han guíado.

  • Muchas Gracias Anieto

    Estoy disfrutando como un crío personalizando mi WordPress

  • Hola Anieto,
    Perdona que te moleste, pero tengo una cuestion a la que le estoy dando vueltas y no consigo dar con la solucion.

    Como ya sabes la busqueda de wordpress (search.php) solamente busca los resultados en el titulo y en el post.

    Yo quiero que la busqueda me dé los resultados que encuentre en el título, el post pero tambien busque dentro de los “tags” y de los “campos personalizados”.

    ¿Habría forma de hacerlo utilizando la funcion query_posts() ?

    Gracias
    BienB

  • Hola: He aplicado los query_post para sacar una categoria del loop de wordpress. Efectivamente lo hace pero me descompuso la paginacion del blog.

    Aqui en el foro he expuesto la duda.
    http://www.anieto2k.com/foro/topic.php?id=597&page&replies=1

    Me doy cuenta que no es tan simple sacar una categoria del loop de wordpress.

    Ojala puedas comentar.
    Saludos.

  • Excelente post andrés.

    Mi consulta es, si yo quiero mostrar las segundas 10 últimas entradas (o sea, no las 10 más recientes, sino que las ultimas 11-20), es posible hacerlo mediante este método?

    Si es así tendría que hacerlo de esta manera?:

    [code]
    query_posts(‘posts_per_page=10&paged=2′);
    [/code]

    ojalá alguien pueda ayudarme con esta duda.

  • Hola amigos!

    Les cuento que tengo un sitio:
    http://www.alconviajes.com.ar

    EL THEME FUE REALIZADO 100% POR MI

    El problema que se me presenta es el siguiente:
    > En los resultados de “categoría”, “tab” y/o “busqueda” los post se presentan por fecha de publicación (por defecto).

    Yo necesito que se vean en orden alfabético (tomando como referencia los títulos )

    He logrado hacerlo con la función

    <a href=””>
    |

    <?php previous_posts_link(‘<< | >>’) ?>

    Pero de esta manera NO ME REALIZA EL PAGINADO.

    Cómo se podría solucionar?

  • @aNieto2k: Hola Andrés, siguiendo las indicaciones de tu respuesta, estoy intentando que se muestre los posts de cada categoria del mes actual. Tengo este código, pero no cosigo que funcione. Me muestra en todas las categorías los mismos posts de ese mes, pero lo quiero intentar es que me muestre los posts de cada categoría, alguna ayuda? Gracias!!!!

    + el loop

  • Como es posible realizar una busqueda unica y exclusivamente de los Titulos de los blogs y no de lo que contienen?

    por default si busco por ejemplo “es” me pone todos mis post donde uso esa palabra regularmente todos, pero yo quiero que solo busque esa palabra en los titulos donde casi no se usa.

    se que sera mas dificil buscar post en mi blog… pero soy un tirano… no la verdad es que quiero tener dos opciones de busqueda una por Titulos y otra por contenido, eh pensado realizar un winget para ello pero ni idea de como comenzar, alguna sugerencia?

  • Hola tengo una pregunta como hago esto mismo pero para que haya en cada categoria como un listado de todas las letras del abesedario.
    para que al apretar en esas letras salgan todas las entradas empezadas con dicha letra, es posible eso?

    gracias.

  • Hola:
    Para visualizar todos los post de un año escribo http://www.misitio.com/2009/ y puedo verlos todos a exepción de los post que llevan la etiqueta more…

    ¿Sabrá alguien qué debo hacer para listar absolutamente todos los post, incluyendo lo que hay dentro de los que están con “more…”? O sea, como un papel higénico gigante hacia abajo con los contenidos de “more” incluidos.

    Ojalá alguien me pueda ayudar porque esto me tiene detenido hace meses y no sé qué hacer.

    Saludos a todos.

  • @Andrés: Buenas, prueba a editar el fichero archives.php (sinó existe te servirá con index.php) de tu theme. Y busca the_excerpt() y reemplazalo por the_content().

    Saludos

  • @aNieto2k: Nieto… familia de artistas. Acá en Chile tenemos una maravillosa instructora y bailarina de valet, en España nada menos que el director del conservatorio de piano.. parece que todos ustedes son expertos para algo.
    Luego de tanto adular lamento decir que no me fue bien, pero agradezco infinitamente tu tiempo para mi y toda la comunidad. Muchas gracias.

  • Hola Andrés, busque en muchísimos lados pero no encuentro exactamente lo que quiero…

    Como es posible mostrar la cantidad de post de un usuario determinado? no todos.. solo algunos, ej: Maria(32), Pedro(21).

    No lo quiero mostrar dentro de un post, lo quiero mostrar en el sidebar, supongamosle que tengo 20 usuarios y solo quiero mostrar la cantidad de post que tiene Maria y Pedro nada mas, como ya lo explique arriba, como es que haría ? la verdad que se torna mas difícil de lo que creía, si bien unos plugins me lo pueden hacer, quisiera saber como hacerlo yo mismo para ir adentrándome mas a wordpress.

    Desde ya muchas gracias!!

  • Buen día Andrés.

    Necesito mostrar los últimpos pos de la categoría a la que pertenece un determinado post.

    Supangamos este mismo post que has escrito. Al final del post, mostrar un listado de los 5 últimos post de esta categoría.

    El pos x pertenece a la categoría A, luego, al final del post x mostrar los 5 últimos post de la categoría A.

    Saludos!

  • @Sabogal: Hola Sabogal:

    Creo que el plugin “Customizable Post Listing” te será de gran ayuda. Tiene muchas opciones (por eso se llama “Customizable…”, o sea, “personalizable”, o algo así) como puedes ver aquí:
    http://coffee2code.com/wp-content/uploads/customizable-post-listings-screenshot-1.png

    Para mayor información, visita:
    http://coffee2code.com/wp-plugins/customizable-post-listings/

    Saludos,

    Andrés.

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.