Do not speak Spanish? Read this post in English.

Lunes, 02 de Marzo de 2009.

Ordenar posts en wordpress

Cotilleando entre el código encuentro distintas formas de manejar el orden de los posts en wordpress a nuestro antojo. En el Codex de wordpress -la explicación oficial de sus funciones- se encuentra la explicación de la función

query_posts

Esta función es la que se usa para sacar el listado de posts de wordpress. Su uso es realmetne sencillo: se le pasan las variables con las que luego se ejecutará la select y ese será el resultado al hacer el famoso loop de wordpress. Es interesante echar un vistazo a todas las posibilidades que se nos dan porque son más de las que podríamos esperar en un principio. Alterandola podemos hacer autenticas virguerías con nuestro blog. En la explicación que nos dan en el codex nos ponen el siguiente ejemplo:

1
2
3
4
5
<?php
   if (is_home()) {
      query_posts("cat=-1,-2,-3");
   }
?>

...que nos permitiría hacer que en nuestra home no apareciesen entradas de las categorías 1, 2 y 3. Este tipo de opciones son ideales para transformar nuestro WordPress en un CMS.

Por otro lado, esta función recibe en realidad los mismos parametros, con exactamente la misma nomenclatura de variables que al pasar variables por GET en las urls de WordPress. Es decir, que si añado cualquiera de las variables definidas para query_posts directamente a una url de nuestro blog, este mostrara el resultado añadiendo estas variables al hacer la consulta. Esto nos da unas posibilidades de adaptación brutales. Aquí van algunos ejemplos de lo que podemos hacer solo manejando urls:

Otra de las opciones, es la posibilidad de ordenar por cualquier parametro meta o incluso mejor indicar un meta, su valor y el tipo de comparación a hacer en la query (=,!=,>,...) y si esta va a ser alfabetica o numérica. En un solo vistazo eso ya abre una nueva y gran ventana : puedo crear una web de clasificados usando como base WordPress... Pero eso lo trataremos en otro post en el que hablaremos de los cusom posts y las custom taxonomies añadidos a partir de wordpress 3.0.

Ahora con urls amigables (aunque un poco más complejo)

Una vez entendemos como podemos jugar con la forma de ordenar los posts y tenemos claro lo que queremos hacer en nuestra web solo nos queda hacerlo de forma un poco más elegante: con urls amigables. Por ejemplo, imaginemos que hemos creado un parametro meta llamado "precio" y que queremos hacer una lista que ordene nuestros post por precio en vez de cronológica o alfabéticamente...

Lo primero sería encontrar el conjunto de variables a usar para ordenar por precio. Nada más fácil:

Para el listado general:

'index.php?orderby=meta_value_num&meta_key=precio&order=asc

Para una categoría:

'index.php?category_name=mi-categoria&orderby=meta_value_num&meta_key=precio&order=asc

Conociendo estos datos ahora tenemos que presentar a un filtro de wordpress llamado "rewrite_rules_array" y que nos sirve para añadir reglas al estilo mod_rewrite para la interpretación de urls de wordpress. Puedes ver como usarlo en este enlace.

Veamos un ejemplo de como deberiamos aplicarlo para nuestro caso:

//Adding Rewrite rules: 
add_filter('rewrite_rules_array','addOrders');
// Adding a new rule
function addOrders($rules)
{
 //querypost vars at: http://codex.wordpress.org/Template_Tags/query_posts
  $newrules = array();
 
  // tipo libro por precio
  // Importante, como los valores van a contener $matches debemos usar comilla simple (') en vez de doble (") para que no intente reemplazarlo por el valor de la variable.
 
  // para la home
  $newrules["/por-precio/?$"] = 'index.php?orderby=meta_value_num&meta_key=precio&order=asc';
 
  // para las paginas de la home
  $newrules["/por-precio/page/?([0-9]{1,})/?$"] =  'index.php?paged=$matches[1]&orderby=meta_value_num&meta_key=precio&order=asc';
 
  // para las categorías
  $newrules["/categoria/(.+?)/por-precio/?$"] = 'index.php?category_name=$matches[1]&orderby=meta_value_num&meta_key=precio&order=asc';
 
  // para las paginas de las categorías
  $newrules["/categoria/(.+?)/por-precio/page/?([0-9]{1,})/?$"] =  'index.php?category_name=$matches[1]&paged=$matches[2]&orderby=meta_value_num&meta_key=precio&order=asc';
 
  $rules = $newrules + $rules;
  return $rules;
}
 
// Tenemos que lanzar al menos una vez, $wp_rewrite->flush_rules(); para que surja efecto la nueva regla... asi que...
add_filter('init','flushRules');
function flushRules(){
  global $wp_rewrite;
  $wp_rewrite->flush_rules();
}

Posts Relacionados:

  1. Programar la creación de Posts en WordPress
  2. Crear una web de clasificados con wordpress: usando custom post y custom taxonomy
  3. Crear menús nuevos en el administrador de wordpress
  4. programar crons en wordpress
  5. Crear nueva sección de links en el menú principal de wordpress

Temas Relacionados: tutoriales

Autor:

10 Comentarios para “Ordenar posts en wordpress”

  1. Ronald Salvatierra dice:

    Me parece muy interesante, pero no lo podrias detallar un poco mas, no todos los que leemos tus posts tenemos conocimiento extenso de wordpress, al menos pon un ejemplo mostrando donde ponemos esos codigos, bueno gracias por tu comprension.

  2. admin dice:

    Ok, Ronald, tomo nota. A ver si en breve puedo escribir algún post aclarando mejor el tema.

    Gracias por el comentario.

  3. Gabriel dice:

    Hola. Hace semanas que intento una sola cosa. Quiero ordenar mis entradas según categorías. Es decir, que los posts de "Deportes" aparezcan siempre arriba, los de "Espectáculos" abajo, y así... Por favor, podrías echarme una mano?

  4. ikhuerta dice:

    usando la funcion query_posts puedes lanzar como en el ejemplo que solo se muestren ciertas categorías. Esta función puede usarse creando más de un loop en la misma página. Así, podrias lanzarla solo para una categoría y sacar un par de posts, luego lanzarla otra vez con otra cateogoría y sacar otros 2 y así sucesivamente... Otra cosa es el proceso que va a repercutir en tu servidor que se te disparará bastante por lo que será mejor que uses algún plugin para cachear.

  5. [...] olvidemos que en esta nueva plantilla nada nos impide manipular el orden de los posts con la funcion query_posts y mostrarlos como nos convega (¿quien dice que el orden cronológico sea el mejor para los [...]

  6. alfonso dice:

    Gracias por el post. Necesito que en un tema de WP no aparezcan entradas en la home de cierta categoría que he llamada "DESTACADAS"... ?

    ¿CÓMO LO HAGO ENTONCES?

    Gracias..

  7. allvoxman dice:

    Hola,

    Tengo una duda al respecto. Imagina que quiero crear un enlace permanente "bonito" para un listado de posts de una misma etiqueta ordenados cronológicamente, de tal manera que el enlace "feo" sería así:

    http://www.miblog.com/index.php?tag=etiqueta&order=asc

    Y yo quiero que el enlace permanente sea:

    http://www.miblog.com/etiqueta

    Seguro que es una chorrada pero por más vueltas que le doy al código no lo consigo.

    Gracias por adelantado y enhorabuena por el blog!

  8. ikhuerta dice:

    Tienes dos formas de hacerlo:

    1) Usa realmetne la direccion de tu etiqueta y luego le destinas un template propio y usar el query_post al principio de este:

    http://wpbits.files.wordpress.com/2007/08/wordpress-template-hierarchy.png

    2) Crea una nueva regla con

    add_filter('rewrite_rules_array','tuFuncionDeReglas');

    Lo segundo sería quizás más manipulable pero tendrás que aprender expresioones regulares y como se maneja wordpress con este tipo de filtros.

  9. dany dice:

    Hola, tengo una duda, en mi wordpress tengo 4 categorias que coloque en el menu principal, luego al agregar un post escojo la categoria y listo, todo esta bien. Pero quisiera que una entrada en especificio siempre este en el primer lugar, que se quede fijo, solo es una entrada y las demas que sigan su orden normal.

    Sabemos como puedo hacer esto?

    Gracias.

  10. ikhuerta dice:

    buenas, lo que comentas en wordpress lo llaman posts destacados. al marcar uno como destacado se produce pricisamente lo que comentas. Aparte, puedes encontrar varios plugins que trabajan con ese concepto.

Anímate y deja tu comentario