Comment exclure une ou plusieurs catégories d'articles d'un menu ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Comment exclure une ou plusieurs catégories d'articles d'un menu ?

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par ynx » 08 janv. 2022, 11:44

Merci pour le résultat du var_dump, je comprends mieux ce qui pose problème avec le code que j'ai proposé.

Pour exclure les catégories, j'utilise une boucle for avec une variable $i commençant à 0 et incrémentée de 1 à chaque tour pour accéder à chaque catégorie selon son index dans le tableau des catégories via $categories[$i].
Avec cette boucle, je suppose donc (à tort) que les indexes du tableau $categories est la suite des entiers naturels ($categories[0] correspond à la première catégorie dans le tableau, $categories[1] correspond à la deuxième catégorie, etc...).
Or grâce au résultat du var_dump, on constate que ce n'est pas le cas. Le premier élément de du tableau des catégories a pour index 0 mais le deuxième élément a pour index 3, le troisième a pour index 4, etc :
[0] => object(WP_Term)#21891
[3] => object(WP_Term)#21892
[4] => object(WP_Term)#22004
Le fait que les indexes ne se suivent pas n'est pas forcément un problème et c'est surement lié au fonctionnement de WP.

Pour corriger la première solution proposée, on peut par exemple remplacer l'utilisation de la boucle for par une boucle foreach pour parcourir les catégories et les index comme ceci :
$categorieIdsToExclude = [1,7,9,28,29];

$categories = get_categories();

foreach ($categories as $index => $categorie) {
    if (in_array($categorie->term_id, $categorieIdsToExclude)) {
        unset($categories[$index]);
    }
}

Mais avec un peu de recul, puisque ton code utilise déjà une boucle pour afficher les catégories, on pourrait aussi exclure les catégories dans cette boucle au lieu de devoir recréer un tableau et une autre boucle.
Du coup, une solution plus courte que j'aurais pu te proposer dès le départ qui aurait éviter le problème avec les index :
<?php if (!defined('ABSPATH')) die('Restricted Area'); ?>

<?php if(get_categories()) : ?>

<?php
$current_cat_ID = 0;
if(is_category()) {
$current_cat = get_the_category();
$current_cat_ID = $current_cat[0]->term_id;
}
?>

<section class="text-center py-lg-5 pb-md-5">
<div class="container">
<?php foreach(get_categories() as $c) : 
    if (in_array($c->term_id, [1,7,9,28,29])) {
        continue;
    }
    if($c->term_id == $current_cat_ID) { $class_css = 'primary'; } else { $class_css = 'secondary'; } ?>
    <a href="<?php echo get_category_link($c); ?>" class="category-links <?php echo $class_css; ?>"><?php echo $c->name; ?></a>
<?php endforeach; ?>
</div>
</section>

<?php endif; ?>

<!-- <section id="blog-archive" [...] -->
-> Ici, dans la boucle foreach utilisée pour l'affichage, on vérifie juste avant d'afficher la catégorie si l'identifiant de la catégorie $c->term_id fait partie du tableau des catégories à exclure. Si c'est le cas, on utilise l'instruction continue pour passer immédiatement au prochain tour de boucle, on passe donc l'affichage de cette catégorie.

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 07 janv. 2022, 12:33

Et voici le résultat du Var_dump

array(7) {
[0]=>
object(WP_Term)#21891 (16) {
["term_id"]=>
int(7)
["name"]=>
string(17) "Chez Wild Stories"
["slug"]=>
string(17) "chez-wild-stories"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(7)
["taxonomy"]=>
string(8) "category"
["description"]=>
string(45) "La genèse, l'évolution, les valeurs..."
["parent"]=>
int(0)
["count"]=>
int(4)
["filter"]=>
string(3) "raw"
["cat_ID"]=>
int(7)
["category_count"]=>
int(4)
["category_description"]=>
string(45) "La genèse, l'évolution, les valeurs..."
["cat_name"]=>
string(17) "Chez Wild Stories"
["category_nicename"]=>
string(17) "chez-wild-stories"
["category_parent"]=>
int(0)
}
[3]=>
object(WP_Term)#21892 (16) {
["term_id"]=>
int(31)
["name"]=>
string(14) "Influence - RP"
["slug"]=>
string(12) "influence-rp"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(31)
["taxonomy"]=>
string(8) "category"
["description"]=>
string(20) "PROJETS Wild Stories"
["parent"]=>
int(0)
["count"]=>
int(1)
["filter"]=>
string(3) "raw"
["cat_ID"]=>
int(31)
["category_count"]=>
int(1)
["category_description"]=>
string(20) "PROJETS Wild Stories"
["cat_name"]=>
string(14) "Influence - RP"
["category_nicename"]=>
string(12) "influence-rp"
["category_parent"]=>
int(0)
}
[4]=>
object(WP_Term)#22004 (16) {
["term_id"]=>
int(32)
["name"]=>
string(10) "Lancements"
["slug"]=>
string(10) "lancements"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(32)
["taxonomy"]=>
string(8) "category"
["description"]=>
string(20) "PROJETS Wild Stories"
["parent"]=>
int(0)
["count"]=>
int(1)
["filter"]=>
string(3) "raw"
["cat_ID"]=>
int(32)
["category_count"]=>
int(1)
["category_description"]=>
string(20) "PROJETS Wild Stories"
["cat_name"]=>
string(10) "Lancements"
["category_nicename"]=>
string(10) "lancements"
["category_parent"]=>
int(0)
}
[6]=>
object(WP_Term)#17377 (16) {
["term_id"]=>
int(9)
["name"]=>
string(17) "Satellite of love"
["slug"]=>
string(17) "satellite-of-love"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(9)
["taxonomy"]=>
string(8) "category"
["description"]=>
string(35) "Les clients parlent de Wild Stories"
["parent"]=>
int(0)
["count"]=>
int(1)
["filter"]=>
string(3) "raw"
["cat_ID"]=>
int(9)
["category_count"]=>
int(1)
["category_description"]=>
string(35) "Les clients parlent de Wild Stories"
["cat_name"]=>
string(17) "Satellite of love"
["category_nicename"]=>
string(17) "satellite-of-love"
["category_parent"]=>
int(0)
}
[7]=>
object(WP_Term)#22000 (16) {
["term_id"]=>
int(1)
["name"]=>
string(12) "Savoir faire"
["slug"]=>
string(12) "savoir-faire"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(1)
["taxonomy"]=>
string(8) "category"
["description"]=>
string(0) ""
["parent"]=>
int(0)
["count"]=>
int(1)
["filter"]=>
string(3) "raw"
["cat_ID"]=>
int(1)
["category_count"]=>
int(1)
["category_description"]=>
string(0) ""
["cat_name"]=>
string(12) "Savoir faire"
["category_nicename"]=>
string(12) "savoir-faire"
["category_parent"]=>
int(0)
}
[8]=>
object(WP_Term)#17378 (16) {
["term_id"]=>
int(28)
["name"]=>
string(8) "Showcase"
["slug"]=>
string(8) "showcase"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(28)
["taxonomy"]=>
string(8) "category"
["description"]=>
string(0) ""
["parent"]=>
int(0)
["count"]=>
int(3)
["filter"]=>
string(3) "raw"
["cat_ID"]=>
int(28)
["category_count"]=>
int(3)
["category_description"]=>
string(0) ""
["cat_name"]=>
string(8) "Showcase"
["category_nicename"]=>
string(8) "showcase"
["category_parent"]=>
int(0)
}
[9]=>
object(WP_Term)#21996 (16) {
["term_id"]=>
int(29)
["name"]=>
string(13) "We love art !"
["slug"]=>
string(11) "we-love-art"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(29)
["taxonomy"]=>
string(8) "category"
["description"]=>
string(0) ""
["parent"]=>
int(0)
["count"]=>
int(1)
["filter"]=>
string(3) "raw"
["cat_ID"]=>
int(29)
["category_count"]=>
int(1)
["category_description"]=>
string(0) ""
["cat_name"]=>
string(13) "We love art !"
["category_nicename"]=>
string(11) "we-love-art"
["category_parent"]=>
int(0)
}
}

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 07 janv. 2022, 12:33

Bonjour, oui les identifiants des catégories à exclure sont bons...
J'ai intégré le var_dump au code, voici le dernier code :


<?php if (!defined('ABSPATH')) die('Restricted Area'); ?>


<?php if(get_categories()) : ?>

<pre>
<?php var_dump(get_categories()); ?>
</pre>

<?php
$current_cat_ID = 0;
if(is_category()) {
$current_cat = get_the_category();
$current_cat_ID = $current_cat[0]->term_id;
}


$categorieIdsToExclude = [1,7,9,28,29];
$categories = get_categories();
for ($i = 0; $i < count($categories); $i++) {
if (in_array($categories[$i]->term_id, $categorieIdsToExclude)) {
unset($categories[$i]);
}
}
?>

<?php endif; ?>

<section class="text-center py-lg-5 pb-md-5">
<div class="container">
<?php
foreach($categories as $c) : if($c->term_id == $current_cat_ID) { $class_css = 'primary'; } else { $class_css = 'secondary'; } ?>
<a href="<?php echo get_category_link($c); ?>" class="category-links <?php echo $class_css; ?>"><?php echo $c->name; ?></a>
<?php endforeach; ?>
</div>
</section>

<section id="blog-archive" class="pb-4">
<div class="col-xl-10 offset-xl-1">
<div class="row">

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts('cat=31,32,33,34'); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="col-xl-3 col-md-6">
<?php set_query_var('post_id', get_the_ID()); ?>
<?php get_template_part('template-parts/card', 'projets'); ?>
</div>
<?php endwhile; endif; ?>
</div>
</div>
</section>

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par ynx » 06 janv. 2022, 18:39

Désolé, difficile aussi pour moi de voir la cause sans voir les données.
Dans la boucle pour exclure les catégories, la valeur de $categories[$i]->term_id correspond bien aux identifiants des catégories que tu veux exclure ?

Est-ce que tu pourrais ajouter un var_dump des catégories dans ton code, puis nous remontrer ton dernier code et le résultats du var_dump stp ?

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 06 janv. 2022, 15:36

Je viens de comprendre la logique de disparition de catégories dans le menu, même si je ne comprends pas ce qui cause cela !
Il y a une logique d'alphabet.
Seule la catégorie 7 disparait, parce qu'alphabétiquement, son nom commence par un C et quelle se trouve avant une catégorie qui doit apparaitre et qui elle, commence par un L. Dès lors, toutes les catégories suivant celle qui doit apparaitre, apparaissent également, même si je les ai exclues.
Exemple de catégories pour que ce soit plus parlant : Cas / Lancement / Savoir-faire.
Dans le code, j'ai exclu les ID des catégories "Cas" et "Savoir-faire". Mais "Savoir-faire" apparait quand même dans le menu parce qu'alphabétiquement, elle est placée après Lancement, qui elle, est une catégorie non-exclue.
Qu'est-ce qui peut causer cela ? Sachant que j'ai ce problème sur la page "projets", mais pas sur la page "blog"...

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 06 janv. 2022, 15:19

Tout d'abord merci beaucoup de m'épauler sur ce problème et de prendre le temps ;)
Si je remets le premier code fonctionnel, j'ai quand même le problème d'affichage. J'ai donc gardé ton code et j'ai adapté la ligne suivante avec les ID des catégories, dans <section id="blog-archive" class="pb-4"> :

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts('cat=31,32,33,34'); ?>

Ceci me permet d'afficher les articles des catégories souhaitées. Par contre, j'ai toujours le problème que seule une catégorie disparait de l'affichage du menu, et c'est toujours la même, peu importe dans quel ordre je dispose les ID... C'est l'ID 7. Les autres ne sont pas prises en compte, j'ignore pourquoi !

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par ynx » 06 janv. 2022, 14:02

Le problème d'affichage des articles sur la page projets ne semble pas venir du code ajouté pour exclure les catégories ? Si tu reprends le premier code fonctionnel de la page blog sans exclure de catégorie pour la page projets, tu as quand même le problème d'affichage des articles ?
Si oui, je suppose que le problème doit venir du paramétrage de WP pour cette page projets, mais ne connaissant pas très bien WP je ne sait pas très bien comment te guider.

Tu pourrais peut-être comparer les catégories retournées par la fonction get_categories() sur chacune des deux pages pour voir les différences.
Quel résultats tu obtiens en ajoutant par exemple un var_dump au début de chacune des deux pages :
<?php if(get_categories()) : ?>

<pre>
<?php var_dump(get_categories()); ?>
</pre>

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 06 janv. 2022, 13:21

Exact ! J'avais vu qu'il manquait la parenthèse mais je n'avais pas fait attention au point virgule ;)
Cela fonctionne parfaitement pour ma page blog, merci beaucoup !

MAIS, j'ai un second soucis...

J'ai créé un template php de page nommé "projets", à partir du modèle de page Blog. (Pour avoir une autre page type blog, mais qui affiche une sélection de catégories différentes). Et le code ne fonctionne pas sur ce nouveau template. Seule une catégorie disparait de l'affichage du menu, et c'est toujours la même, peu importe dans quel ordre je dispose les ID... Si tu as une idée du problème, je suis également preneur :)

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par ynx » 06 janv. 2022, 11:49

Oups, j'ai laissé quelques erreurs de syntaxe dans le code que j'ai proposé.

Il manque un point-virgule à la fin de la ligne $categories = get_categories() et il manque une parenthèse pour fermer la fonction in_array dans la condition if.
$categories = get_categories();

//  [...]

if (in_array($categories[$i]->term_id, $categorieIdsToExclude)) {
N'hésites pas à préciser le message d'erreur si tu as d'autres soucis.

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 06 janv. 2022, 11:01

Malheureusement le code ne fonctionne pas ainsi. Lorsque j'affiche la page, j'ai un message d'erreur critique... Peut-être que cela crée un problème avec le reste du code de la page ? Je colle ci-dessous le code complet :

<?php if (!defined('ABSPATH')) die('Restricted Area'); ?>


<?php if(get_categories()) : ?>

<?php
$current_cat_ID = 0;
if(is_category()) {
$current_cat = get_the_category();
$current_cat_ID = $current_cat[0]->term_id;
}

$categorieIdsToExclude = [7, 8, 1, 27, 28,];
$categories = get_categories()
for ($i = 0; $i < count($categories); $i++) {
if (in_array($categories[$i]->term_id, $categorieIdsToExclude) {
unset($categories[$i]);
}
}

?>


<section class="text-center py-lg-5 pb-md-5">
<div class="container">
<?php
foreach($categories as $c) : if($c->term_id == $current_cat_ID) { $class_css = 'primary'; } else { $class_css = 'secondary'; } ?>
<a href="<?php echo get_category_link($c); ?>" class="category-links <?php echo $class_css; ?>"><?php echo $c->name; ?></a>
<?php endforeach; ?>
</div>
</section>


<?php endif; ?>

<section id="blog-archive" class="pb-4">
<div class="col-xl-10 offset-xl-1">
<div class="row">

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts('category_name=projets&paged=$paged'); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="col-xl-3 col-md-6">
<?php set_query_var('post_id', get_the_ID()); ?>
<?php get_template_part('template-parts/card', 'post'); ?>
</div>
<?php endwhile; endif; ?>
</div>
</div>
</section>

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 05 janv. 2022, 18:01

Merci, je vais tester ce code demain et je reviens par ici pour faire un retour 👍

Re: Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par ynx » 05 janv. 2022, 14:52

Bonjour,

Une solution possible serait de récupérer le tableau des catégories via la fonction get_categories(), puis de parcourir ce tableau (avec une boucle for par exemple) afin de supprimer de ce tableau (via unset) les catégories à exclure.
Enfin dans la boucle foreach qui affiche les catégories, il faudra utiliser ce nouveau tableau à la place de la la fonction get_categories().

Par exemple, pour exclure les catégories dont les identifiants sont 1, 2 et 3 (code non testé) :
<?php if(get_categories()) : ?>

<?php
$current_cat_ID = 0;
if(is_category()) {
    $current_cat = get_the_category();
    $current_cat_ID = $current_cat[0]->term_id;
}

// les identifiants des catégories à exlure
$categorieIdsToExclude = [1, 2, 3];
// le tableau des catégories
$categories = get_categories()
// pour chaque catégorie
for ($i = 0; $i < count($categories); $i++) {
    // si l'identifiant de la catégorie parcouru correspond à un des identifiants des catégories à exclure
    if (in_array($categories[$i]->term_id, $categorieIdsToExclude) {
        // on supprime la catégorie du tableau
        unset($categories[$i]);
    }
}
?>

<section class="text-center py-lg-5 pb-md-5">
<div class="container">
<?php 
// ne pas oublier d'utiliser la nouveau tableau des catégorie dans la boucle foreach
foreach($categories as $c) : if($c->term_id == $current_cat_ID) { $class_css = 'primary'; } else { $class_css = 'secondary'; } ?>
<a href="<?php echo get_category_link($c); ?>" class="category-links <?php echo $class_css; ?>"><?php echo $c->name; ?></a>
<?php endforeach; ?>
</div>
</section>

<?php endif; ?>

Comment exclure une ou plusieurs catégories d'articles d'un menu ?

par seberes » 05 janv. 2022, 11:25

Bonjour,
Débutant en php, j'ai une page type "blog" wordpress, avec un menu en haut de page regroupant les catégories des articles. Je cherche à exclure plusieurs catégories de ce menu, mais je n'y parviens pas pour le moment. Si quelqu'un peut m'apporter ses lumières, je suis preneur ! Voici mon code pour ce menu :

<?php if(get_categories()) : ?>

<?php
$current_cat_ID = 0;
if(is_category()) {
$current_cat = get_the_category();
$current_cat_ID = $current_cat[0]->term_id;
}
?>

<section class="text-center py-lg-5 pb-md-5">
<div class="container">
<?php foreach(get_categories() as $c) : if($c->term_id == $current_cat_ID) { $class_css = 'primary'; } else { $class_css = 'secondary'; } ?>
<a href="<?php echo get_category_link($c); ?>" class="category-links <?php echo $class_css; ?>"><?php echo $c->name; ?></a>
<?php endforeach; ?>
</div>
</section>


<?php endif; ?>