Índice de contenidos
Código wp_query para mostrar post de varias categorías
Vamos a explicar como crear una consulta personalizada wp_query para varias categorías aunque es sencillo solemos cometer un par de errores en el array de category_name.
Primero nombraremos los errores habituales y luego mostraré un pequeño código para copiar y pegar en tus archivos, un código de base que tendrás que modificar con el slug de tus categorías.
Error número 1; no incluir el array para varias categorías
si hacemos lo siguiente:
'category_name' => 'wordpress,diseno-web,html5,moodle'
nuestra consulta no funcionará, aunque estamos pidiendo que nos muestre sólo los post de las categorías wordpress, diseno-web, html5 y moodle, la sintaxis no es correcta.
La sintaxis correcta de la consulta wp_query para varias categorías debe incluir el array. Dos ejemplos de código válido:
'category_name' => array('wordpress,diseno-web,html5,moodle')
$query = new WP_Query( array( 'category_name' => 'wordpress,moodle' ) );
Si tienes problemas para entender las diferencias entre los códigos anteriores, revisa la siguiente documentación:
Consultas personalizadas en WP
Consultas personalizadas con wp_query
Error número 2; diferencia entre nombre y slug de una categoría
«WordPress, diseno-web, html5 y moodle» son los slug de las categorías no los nombres, recuerda que en el array tienes que escribir los slug y NO LOS NOMBRES.
Si prefieres trabajar con otros parámetros de las categorías de WordPress, por ejemplo con el ID de la categoría, puedes utilizar cat (int) , donde int representa al ID de la categoría. En el siguiente ejemplo, mostramos todos las publicaciones que pertenecen a la categoría con ID=4, ID=6… Si la categoría con ID=4, ID=6… tiene subcategorías, también se muestran.
$query = new WP_Query( array( 'cat' => '4,6,17,38') );
Hasta ahora estoy mostrando ejemplos muy sencillos que muestran todas las publicaciones que pertenecen a una de las categorías que se incluyen en el array, da lo mismo si empleamos el ID de categoría o el slug. Como las necesidades de cada uno pueden ser diferentes, os mostraré otras funciones y sus parámetros para alterar las consultas wp_query a categorías y obtener distintos resultados.
Otras funciones para mostrar varias categorías en WordPress
Mostrar todas las publicaciones que pertenezcan a varias categorías
No es una buena práctica que un post pertenezca a varias categorías. Aún así, si es tu caso, y necesitas mostrar las publicaciones que cumplen que pertenecen a dos categorías diferentes, puedes emplear el signo suma + . El siguiente ejemplo, muestra todos los post que pertenecen a la categoría francia y europa.
$query = new WP_Query( array( 'category_name' => 'francia+europa' ) );
Si prefieres hacer la consulta con IDs de la categoría:
$query = new WP_Query( array( 'category__and' => array( 4, 6 ) ) );
El resultado de la consulta anterior son todas las publicaciones que pertenecen a la categoría cuyo ID es el 4 y además pertenecen a la categoría cuyo ID es el 6.
Mostrar todas las publicaciones excepto la de algunas categorías
Cuando queremos mostrar todos los post de nuestro blog, excepto aquellas publicaciones que pertenezcan algunas categorías concretas, puede ser más interesante crear un array inverso. Es útil cuando manejamos muchas categorías y queremos mostrar la mayoría de ellas. Para lograr este objetivo podemos hacer uso del símbolo resta – delante del ID de categoría.
$query = new WP_Query( array( 'category__and' => array( -4, -17 ) ) );
La consulta anterior muestra todas las publicaciones excepto las de la categoría con ID 4 o las de la categoría con ID 17.
No mostrar hijos de ninguna categoría
Las funciones cat y category_name, muestran los post de la categoría y también todos los post que pertenecen a categorías hijas de la misma. Por ejemplo, tenemos la categoría con slug=Francia y ID=4, y de esta categoría cuelgan subcategorías, por ejemplo; París, Lyon… Si hacemos uso de category_name = Francia o cat=4, mostrará todos los post de Francia, París, Lyon… Si no quieres mostrar los hijos, debes emplear las siguientes funciones:
$query = new WP_Query( array( 'category__in' => array( 4, 17 ) ) );
Mostrará todas las categorías con ID=4 (francia) y con ID=17 (alemania) pero no sus hijos o subcategorías.
Si necesitas más información, puedes consultar: https://developer.wordpress.org/reference/classes/wp_query/
Código para copiar y pegar en tus archivos
El siguiente script, es el código completo para mostrar todas las publicaciones de WordPress que pertenecen a varias categorías. La función empleada está basada en el slug de categoría.
<?php $args = array( 'post_type' => 'post', 'category_name' => array('wordpress,web-php,prestashop,moodle'), 'orderby' => 'date', 'order' => 'DESC', 'showposts' => 4); $wp_query = new WP_Query($args); if($wp_query->have_posts()) : while($wp_query->have_posts()) : $wp_query->the_post(); ?> <a href='<?php the_permalink(); ?>'><?php get_the_title(); ?> </a> <?php endwhile; endif; wp_reset_query(); ?>
Hola Nerea,
Utilicé el codigo de: «Código para copiar y pegar en tus archivos» en el index.php en blanco de mi wordpress, pero me sale el siguiente error: Warning: urlencode() expects parameter 1 to be string, array given in C:\xampp\htdocs\myblog\wp-includes\formatting.php on line 5424
Por favor tu ayuda, soy nuevo en wordpress y estoy buscando como filtrar posts por categorías.
Wilson, no es en el index.php principal, estos códigos son para modificar las plantillas del tema de WP. La ruta es wp-content/themes/tu-tema/ y hay dentro están los PHP que se modifican