Ocultando artículos y categorías del loop de WordPress

This post was published 9 years ago. It may be exremely outdated.

Nota: Para entender este tutorial son necesarios unos conocimientos básicos de PHP (sobretodo de matrices) y de WordPress (para saber las IDs del contenido y el lugar donde poner el código).

Hay veces en las que queremos ocultar ciertos artículos o categorías del loop de WordPress (el bucle principal que se encarga de mostrar el contenido de la página). En estos casos podemos recurrir a diversos métodos, como comprobar dentro del propio bucle si el artículo está en cierta categoría o tiene una ID determinada. Sin embargo, estos métodos no se pueden aplicar a plugins porque estos no pueden modificar código del bucle, así que debemos buscar un método diferente.

Mostrando $wp_query

Mostrando $wp_query

Durante el desarrollo de la versión 0.4 de WP Carousel me topé con este problema, y decidido a superarlo, tomé la vía probablemente más radical: modificar la variable $wp_query. Esta variable almacena toda la información referente a las consultas a la Base de Datos, incluyendo el contenido consultado, los filtros aplicados, el orden. De hecho, si imprimimos esta variable, obtendremos un resultado enorme, que podéis ver en parte en la imagen de la izquierda.

Alterando el contenido de esta variable se pueden hacer multitud de cosas, sin embargo nos centraremos en ocultar contenido del bucle.

Si nos fijamos en la variable, veremos que es una matriz. Los índices que nos interesan son los siguientes: category__not_in, tag__not_in y post__not_in. Son unos índices con unos nombres realmente descriptivos, ¿verdad? El primero nos permite eliminar categorías del bucle, el segundo nos permite eliminar etiquetas y el último nos permite eliminar artículos individuales.

El contenido de estos índices debe ser una matriz, la cual almacenará en todos los casos las IDs del contenido a ocultar. Veamos de forma práctica cómo ocultaríamos las categorías 3, 19 y 62 del bucle:

$wp_query->query_vars['category__not_in'] = array(3, 19, 62);
$wp_query->query($wp_query->query_vars);

La primera línea está clara, pero, ¿y la segunda? Se trata de una llamada a la función query(), que vuelve a realizar la consulta y elimina el contenido previamente guardado. Antes he comentado que esta variable almacena resultados de las consultas, así que es necesario limpiar la variable de resultados antiguos y rellenarla de nuevos, de otro modo no siempre funcionaría el código.

Este código no funciona en cualquier lugar de WordPress. Si pensamos con un poco de lógica, llegaremos a la conclusión de que debemos poner el código antes del bucle (porque si lo ponemos después, ya se habrá mostrado el contenido y no habrá nada que filtrar). Pero, ¿en qué lugar añadirlo? Bien, realmente se puede añadir en cualquier lugar antes del bucle. En el archivo functions.php del theme, en un plugin por separado (como ocurre con WP Carousel) o incluso justo antes del bucle. Eso sí, dependiendo de en qué lugar ponemos el código, la segunda línea (que actualiza los resultados) será necesaria u opcional. Por comodidad, podéis dejarla siempre, aumentará el número de consultas a la Base de Datos, pero cómo se hará uso de esta función en determinadas ocasiones, no es demasiado preocupante.

Pasemos a otro ejemplo: ocultemos los artículos con la etiqueta con ID 54.

$wp_query->query_vars['tag__not_in'] = array(54);
$wp_query->query($wp_query->query_vars);

Otro ejemplo bastante claro. Por último sólo nos quedaría ocultar artículos. Estoy seguro de que ya adivináis cómo se ocultarían los artículos con IDs 1, 7 y 42:

$wp_query->query_vars['post__not_in'] = array(1, 7, 42);
$wp_query->query($wp_query->query_vars);

Realmente no tiene mucha complicación, pero antes de acabar el tutorial debeís tener en cuenta un par de cosas:

  1. La variable $wp_query almacena contenido importante, y es recomendable hacer una copia de la variable para poder restaurarla más adelante, algo como:
    $wp_query_old = $wp_query;

    Así en caso de detectar un error en las modificaciones realizadas a la matriz, el script puede recuperar el contenido original.

  2. Modificar la consulta en ciertas páginas puede dañar el resultado, sobretodo cuando se visualiza una página individual o un artículo en solitario. Es recomendable modificar la matriz sólo cuando estamos en el index del blog (donde nos interesa ocultar o mostrar artículos).
  3. Este método sólo es adecuado para plugins. Si quisiéramos modificar nuestro theme, tenemos a nuestra disposición métodos aún más fáciles y menos intrusivos que éste.
  4. ¡No ocultemos contenido sin avisar antes al usuario! Todos estos cambios son invisibles para el usuario medio, y más de uno se llevaría una desagradable sorpresa al ver desaparecer sus artículos misteriosamente del índice de su blog.

Dicho esto, ahora es cosa vuestra experimentar. Tenéis más información sobre los índices que podéis modificar en esta página (aunque habla de una función diferente, muchos de los parámetros son equivalentes a los índices de la matriz).

Si tenéis problemas o dudas, preguntad en los comentarios.

2 Responses to Ocultando artículos y categorías del loop de WordPress

Este plugin te permite hacer lo que pides, y algunas cosas más. Es muy útil.

http://wordpress.org/extend/plugins/simply-exclud

oye donde pregunto sobre el wp carousel

No tiene mala pinta el plugin, aunque de todos modos, este artículo está orientado al desarrollo de plugins, y si vas a hacer un plugin nuevo, no puedes requerir otro plugin diferente para que funcione (a no ser que desarrolles un plugin para un plugin).

Aunque el Simply Exclude le puede ser de mucha utilidad a los administradores de blogs que no puedan modificar el código del theme (como los blogs de WordPress.com).

Leave a Reply