web-dev-qa-db-fra.com

Exclure les catégories de la boucle, les requêtes, les widgets et la navigation dans les publications

J'ai récemment eu un cas d'utilisation où je devais empêcher une certaine catégorie de s'afficher dans le front-end. En détail, je devais exclure les postes affectés à cette catégorie de

  • la requête principale ("la boucle")
  • requêtes de recherche
  • requêtes de catégorie
  • archiver des requêtes
  • post navigation (next/prev_post_link())

et le nom de catégorie lui-même d'être affiché comme élément de

  • the_category() dans les modèles de thème
  • le widget Catégories (liste et liste déroulante)

En conséquence, je me suis rapidement retrouvé dans une quête dont je voudrais partager les résultats et les exposer à d’autres commentaires.

4
glueckpress

Exclure les catégories avec pre_get_posts()

J'ai constaté que l'exclusion d'une catégorie via pre_get_posts() et set_query_var() fonctionnerait très bien, à l'exception des widgets. Le widget Publication récente exclut uniquement la catégorie lorsque vous utilisez plutôt $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' );

Exclure les catégories des requêtes et des widgets

L'exclusion des catégories des requêtes et des widgets m'a amené à quelques fonctions que j'ai intégrées dans un mini plugin. Le code peut être trouvé dans un Gist ici .

Exclusion des catégories de la navigation dans les publications (next/prev_post_link())

next/prev_post_link() et leurs fonctions get_ sous-jacentes reposent toutes sur get_adjacent_post() qui, à ce jour (WordPress 3.9.1), n'utilise pas WP-Query, mais corrige sa propre requête SQL. Le ticket Trac n ° 26937 a pour but d’obliger get_adjacent_post() à utiliser WP_Query, mais cela peut prendre un certain temps avant que nous soyons là.

L'exclusion des catégories de next/prev_post_link() dans mon cas pourrait être suffisamment réalisée en passant des ID de catégorie pour être exclus directement à la fonction. Je suis sûr que cela pourrait également être dû à un plugin qui interagit directement avec get_adjacent_post(). Voici ma prise pour la balise de modèle. La vérification de glckprss_exclude_categories__category_names() à partir du mini-plugin mentionné précédemment n'a naturellement de sens que lorsque ce dernier est utilisé.

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

Les menus

Dans mon cas d’utilisation, il n’était pas nécessaire d’exclure des catégories des menus, car j’avais uniquement des menus personnalisés, je n’ai donc pas fait d’investigation dans cette direction. Je suis presque sûr que pre_get_posts() prend en main les éléments de menu, n’est-ce pas?

Merci d'avoir lu tout cela, appréciez tous vos commentaires!

4
glueckpress