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:
- "?order=asc" - Ordenamos el blog al revés ikhuerta al revés
- "?orderby=title&order=asc" - Ordenamos el blog alfabéticamente por nombre de las entradas ikhuerta alfabéticamente
- "?orderby=modified" - Ordenamos por la fecha de última modificacion de las entradas últimos modificados en ikhuerta
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:

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.
Ok, Ronald, tomo nota. A ver si en breve puedo escribir algún post aclarando mejor el tema.
Gracias por el comentario.
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?
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.
[...] 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 [...]
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..
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!
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.
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.