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
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èmeEn conséquence, je me suis rapidement retrouvé dans une quête dont je voudrais partager les résultats et les exposer à d’autres commentaires.
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' );
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 .
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 );
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!