Excluir categorías de Loop, consultas, widgets, navegación posterior

4

Hace poco tuve un caso de uso en el que necesitaba evitar que una determinada categoría se mostrara en el front-end. En detalle, necesitaba excluir las publicaciones asignadas a esa categoría de

  • la consulta principal ("el bucle")
  • consultas de búsqueda
  • consultas de categoría
  • consultas de archivo
  • navegación de publicaciones ( next/prev_post_link() )

y el nombre de la categoría en sí no se muestra como elemento de

  • the_category() en plantillas de tema
  • el widget de categorías (lista y desplegable)

Como consecuencia, pronto me encontré en una búsqueda cuyos resultados me gustaría compartir aquí y exponer a más comentarios.

    
pregunta glueckpress 17.05.2014 - 15:47

1 respuesta

4

Excluyendo categorías con pre_get_posts()

Encontré que excluir una categoría a través de pre_get_posts() y set_query_var() funcionaría bien, excepto para los widgets. El widget de publicación reciente solo excluiría la categoría cuando se use $query->set() en su lugar.

<?php
/**
 * Does NOT apply to the Recent Posts widget. 
 */
function glck1403271109_exclude_categories( $query ) {

    $excluded = array( '1', '2' );

    if( ! is_admin() )
        set_query_var( 'category__not_in', $excluded );
}    
add_filter( 'pre_get_posts', 'glck1403271109_exclude_categories' );


/**
 * Does apply to the Recent Posts widget. 
 */
function glck1403271122_exclude_categories( $query ) {

    $excluded = array( '1', '2' );

    if( ! is_admin() )
        $query->set( 'category__not_in', $excluded );
}
add_filter( 'pre_get_posts', 'glck1403271122_exclude_categories' );

Excluyendo categorías de consultas y widgets

Excluir categorías de consultas y widgets me llevó un par de funciones que envolví en un mini plugin. El código se puede encontrar en un Gist here .

Excluyendo categorías de la navegación posterior ( next/prev_post_link() )

next/prev_post_link() y sus funciones subyacentes get_ se basan en get_adjacent_post() que hasta hoy (WordPress 3.9.1) no usa WP-Query , pero corrige su propia consulta SQL. Trac Ticket # 26937 tiene como objetivo obtener get_adjacent_post() para usar WP_Query , pero puede tomar un tiempo hasta que estás ahí.

La exclusión de categorías de next/prev_post_link() en mi caso podría lograrse de manera suficiente al pasar las ID de categoría para que se excluyan directamente a la función. Estoy seguro de que esto también podría estar fuera de un complemento que interactúa con get_adjacent_post() directamente. Aquí está mi toma para la etiqueta de la plantilla. Por supuesto, la comprobación de glckprss_exclude_categories__category_names() del mini complemento mencionado anteriormente solo tiene sentido cuando este último está en uso.

<?php
/**
 * Exclude categories from prev/next post links.
 *
 * $exclude  (array) - category slugs to retrieve IDs from
 * $excluded (array) - category IDs to be excluded
 */
$exclude  = array();
$excluded = array();

// Mini plugin active?
if( function_exists( 'glckprss_exclude_categories__category_names' ) ) {

    $exclude = glckprss_exclude_categories__category_names();

else {

    $exclude  = array(
            get_category_by_slug( 'my-category' ),
            get_category_by_slug( 'my-other-category' )
            );
}

// Retrieve IDs
foreach( $exclude as $category ) {

    if( $category )
        $excluded[] = absint( $category->term_id );
}

/* Next Post */
next_post_link( '%link', '%title', false, $excluded );

/* Previous post */
previous_post_link( '%link', '%title', false, $excluded );

Menús

Para mi caso de uso no fue necesario excluir categorías de los menús, ya que solo tenía menús personalizados, por lo que no he investigado en esa dirección. Sin embargo, estoy bastante seguro de que pre_get_posts() controla los elementos del menú, ¿no es así?

¡Gracias por leer todo esto, agradezco cualquier comentario!

    
respondido por el glueckpress 17.05.2014 - 15:47

Lea otras preguntas en las etiquetas