feat: Added more option to handle subcategories

This commit is contained in:
MrRaph_
2025-05-23 14:14:50 +00:00
parent e89e4ad7c2
commit 1704d64ed5
3 changed files with 77 additions and 14 deletions

View File

@@ -311,6 +311,33 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base
]
);
$this->add_control(
'only_subcats_of_selected',
[
'label' => esc_html__('Afficher seulement les sous-catégories des catégories sélectionnées', 'category-grid-widget-for-elementor'),
'type' => \Elementor\Controls_Manager::SWITCHER,
'label_on' => esc_html__('Oui', 'category-grid-widget-for-elementor'),
'label_off' => esc_html__('Non', 'category-grid-widget-for-elementor'),
'return_value' => 'yes',
'default' => 'no',
'description' => esc_html__('Si activé, seules les sous-catégories des catégories choisies seront affichées (et pas les catégories parentes).', 'category-grid-widget-for-elementor'),
]
);
// Contrôle : Afficher les sous-catégories de la page catégorie actuelle
$this->add_control(
'subcats_of_current',
[
'label' => esc_html__('Afficher les sous-catégories de la catégorie actuelle', 'category-grid-widget-for-elementor'),
'type' => \Elementor\Controls_Manager::SWITCHER,
'label_on' => esc_html__('Oui', 'category-grid-widget-for-elementor'),
'label_off' => esc_html__('Non', 'category-grid-widget-for-elementor'),
'return_value' => 'yes',
'default' => 'no',
'description' => esc_html__('Si activé et que lon est sur une page darchive de catégorie, affichera ses sous-catégories.', 'category-grid-widget-for-elementor'),
]
);
// ----------------------------------------------------------------------
// Contrôle : Ne montrer que les catégories avec image
$this->add_control(
@@ -426,16 +453,49 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base
// Déterminer les catégories à afficher (inclure les sous-catégories si demandé).
$category_ids_to_show = $selected_ids;
if (!empty($settings['show_subcategories']) && $settings['show_subcategories'] === 'yes') {
// Ajouter les sous-catégories de chaque catégorie sélectionnée.
foreach ($selected_ids as $cat_id) {
$child_ids = get_term_children($cat_id, 'category');
if (is_array($child_ids) && !empty($child_ids)) {
$category_ids_to_show = array_merge($category_ids_to_show, $child_ids);
}
// if (!empty($settings['show_subcategories']) && $settings['show_subcategories'] === 'yes') {
// // Ajouter les sous-catégories de chaque catégorie sélectionnée.
// foreach ($selected_ids as $cat_id) {
// $child_ids = get_term_children($cat_id, 'category');
// if (is_array($child_ids) && !empty($child_ids)) {
// $category_ids_to_show = array_merge($category_ids_to_show, $child_ids);
// }
// }
// // Éliminer les doublons d'ID au cas où.
// $category_ids_to_show = array_unique($category_ids_to_show);
// }
// 1) Cas : on veut les sous-catégories de la page actuelle
if ('yes' === $settings['subcats_of_current']) {
$queried = get_queried_object();
if ($queried && isset($queried->term_id) && 'category' === $queried->taxonomy) {
$category_ids_to_show = get_term_children($queried->term_id, 'category');
} else {
// si pas en archive catégorie, rien à afficher
return;
}
// 2) Sinon, on part des catégories sélectionnées
} else {
$category_ids_to_show = $selected_ids;
// Si on veut uniquement leurs sous-catégories
if ('yes' === $settings['only_subcats_of_selected']) {
$sub_ids = [];
foreach ($selected_ids as $cat_id) {
$children = get_term_children($cat_id, 'category');
if (is_array($children)) {
$sub_ids = array_merge($sub_ids, $children);
}
}
$category_ids_to_show = array_unique($sub_ids);
}
// Sinon, lancienne logique : on ajoute ou pas les sous-catégories selon show_subcategories
elseif ('yes' === $settings['show_subcategories']) {
foreach ($selected_ids as $cat_id) {
$category_ids_to_show = array_merge($category_ids_to_show, get_term_children($cat_id, 'category') ?: []);
}
$category_ids_to_show = array_unique($category_ids_to_show);
}
// Éliminer les doublons d'ID au cas où.
$category_ids_to_show = array_unique($category_ids_to_show);
}
// Préparer les args pour get_terms() on ne précise PAS le tri si c'est par count
@@ -511,7 +571,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base
// Rendu HTML
echo '<div class="elementor-category-grid ' . esc_attr($grid_class) . '">';
foreach ($terms as $term) {
$thumbnail_id = get_term_meta( $term->term_id, 'thumbnail_id', true );
$thumbnail_id = get_term_meta($term->term_id, 'thumbnail_id', true);
echo '<div class="category-card">';
echo '<a href="' . esc_url(get_term_link($term)) . '">';
if (esc_url($term->_image_url)) {