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.
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 :
[PHP]
$categorieIdsToExclude = [1,7,9,28,29];
$categories = get_categories();
foreach ($categories as $index => $categorie) {
if (in_array($categorie->term_id, $categorieIdsToExclude)) {
unset($categories[$index]);
}
}[/PHP]
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]
<?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" [...] -->
[/PHP]
-> 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.