Exclui categorias do Loop, consultas, widgets, post navigation

4

Recentemente, tive um caso de uso em que precisei impedir que uma determinada categoria fosse exibida no front-end. Em detalhes, eu precisava excluir postagens atribuídas a essa categoria de

  • a consulta principal (“o loop”)
  • consultas de pesquisa
  • consultas de categoria
  • consultas de arquivo
  • postar navegação ( next/prev_post_link() )

e o próprio nome da categoria são exibidos como item de

  • the_category() nos modelos de temas
  • o widget Categorias (lista e lista suspensa)

Como consequência, logo me encontrei em uma missão cujos resultados gostaria de compartilhar aqui e expor para comentários adicionais.

    
por glueckpress 17.05.2014 / 15:47

1 resposta

4

Excluindo categorias com pre_get_posts()

Descobri que excluir uma categoria por meio de pre_get_posts() e set_query_var() funcionaria bem, exceto para widgets. O Widget de postagem recente só excluiria a categoria ao usar $query->set() .

<?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' );

Excluindo categorias de consultas e widgets

A exclusão de categorias de consultas e widgets me levou algumas funções que envolvi em um mini-plugin. O código pode ser encontrado em uma essência aqui .

Excluindo categorias da navegação de postagem ( next/prev_post_link() )

next/prev_post_link() e suas funções get_ subjacentes dependem de get_adjacent_post() , que até hoje (WordPress 3.9.1) não usa WP-Query , mas corrige sua própria consulta SQL. O Trac Ticket # 26937 visa obter get_adjacent_post() para usar WP_Query , mas pode demorar um pouco até que está lá.

A exclusão de categorias de next/prev_post_link() no meu caso pode ser suficientemente conseguida passando os IDs de categoria para serem excluídos diretamente da função. Tenho certeza de que isso também pode estar baixo em um plug-in interagindo com get_adjacent_post() diretamente. Aqui está a minha opinião sobre a tag do template. Verificar o glckprss_exclude_categories__category_names() do mini plugin mencionado anteriormente, é claro, só faz sentido quando o último está em 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 );

Menus

Para o meu caso de uso, não era necessário excluir categorias dos menus, pois eu só tinha menus personalizados, por isso não investiguei nessa direção. Tenho certeza de que pre_get_posts() controla os itens do menu, não é?

Obrigado por ler tudo isto, aprecie os comentários!

    
por glueckpress 17.05.2014 / 15:47