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:


…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();
}

15 respuestas a “Ordenar posts en wordpress”

  1. 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. 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?

  3. 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.

  4. 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..

  5. 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!

  6. 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.

  7. 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.

    • 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.

  8. Hola!
    Te cuento mi caso:
    Tengo un WP de eventos (culturales, gastronómicos…) quiero que se ordenen automáticamente basandose en un campo personalizado que añado con la fecha de finalización del evento y no por la fecha en la que se colgó el post.
    Además quiero que los eventos del último mes se coloquen en orden inverso aplicandoles una categoria.
    Y para rizar el rizo… quiero que la categoria de los eventos del mes tenga un estilo CSS diferente.
    Si me puedes ayudar en alguna de las cosas te lo agradeceria eternamente.
    Muchas gracias

  9. BUenas Marina,

    Por lo que comentas me da miedo que quieras algo que solucione todo esto con una sola linea y sin tener porque entender muy bien lo que haces. WordPress es potente pero no es magico, comportamientos a medida tienen que ser programados a medida. Lo digo antes de liarte con la parte tecnica.

    Veamos, este post es un poco antiguo asi que te diria lo que yo haría en tu caso…

    1) Crea un custom post para los eventos (que queden separados de los posts). ASi podras manejaros por separado y gestionarlos con su propio editor a tu medida. No necesitarás CSS especial pues directamente usaras otras plantillas. Migrar tus posts a un custom post es muy simple, solo hace falta cambiar el campo de tipo de post en BBDD.

    2) Edita las reglas de rewrite de tus custom posts para que se ordenen como deseas. Eso lo puedes hacer con el filtro de «rewrite_rules_array», algo tedioso pero muy útil para paginas hechas a medida.

    2.2) O si bien solo quieres cambiar el orden por defecto de todas las listas de eventos existe un metodo mejor que el explicado aquí: Usando un filtro en el hook «request» puedes recoger todas las variales enviadas al pedirse cualquier pagina en wordpress. Así pues mirando simplemente el valor de $request[‘post_type’] dentro del que crees filtro puedes ver que se trata de un evento y añadirle nuevos campos de ordenación como si de la url se tratase.

    Te pongo un articulo en el que se manejan varios de esos conceptos. No para la misma solución pero si que verás un poco para que sirven muchas cosas de las que menciono:

    http://blog.ikhuerta.com/crear-una-web-de-clasificados-con-wordpress-usando-custom-post-y-custom-taxonomy

    Lo siento pero si tuviese que explicar cada paso por separado podria estarme horas, pero al menos quería ponerte sobre el camino adecuado.

  10. jaja muchisimas gracias!!!! te comprendo perfectamente no te preocupes, es cierto que lo más importante la mayoria de las veces es ponernos en el camino adecuado!
    Para que entiendas mejor porque te preguntaba esas cosas te lo explico un poco mejor:
    En realidad los post son los eventos y los metemos muy comodamente a traves de un plugin (WP Event Calendar) que los crea automaticamente. Ahora los ordenamos manualmente a traves de otro plugin (Post Order) pero ya son demasiados.
    Lo primero que pretendia es que los post de WP en vez de ordenarse por la fecha en que los metemos se ordenen por el campo personalizado que introduce el plugin con la fecha en que finaliza el evento, con eso ya se solucionarian todos mis problemas, porque el resto podemos seguir haciendolo a mano. Entiendi que esto lo podria hacer con «query_posts» pero no sa muy bien como introducir lo del campo personalizado.
    Veo que explicas muy bien las cosas y por eso me emocioné preguntando, pero básicamente lo más necesario seria lo que te acabo de comantar. Asi que muchas gracias por la respuesta!!!

  11. Como se hace cuando el campo al que se llama «precio» viene en un formato asi:
    EUR 120,32
    Es posible pasar algun str replace y quitar EUR con el fin de que se ordenen bien?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *