From e89e4ad7c2c6924757f9a82bac291421b3059c22 Mon Sep 17 00:00:00 2001 From: MrRaph_ Date: Fri, 23 May 2025 13:00:45 +0000 Subject: [PATCH] feat: complies with plugin check --- category-grid-widget-for-elementor.php | 230 +++++++++++++++++++++++++ elementor-category-grid-widget.php | 184 -------------------- readme.txt | 12 +- widgets/category-grid-widget.php | 109 ++++++------ 4 files changed, 292 insertions(+), 243 deletions(-) create mode 100644 category-grid-widget-for-elementor.php delete mode 100644 elementor-category-grid-widget.php diff --git a/category-grid-widget-for-elementor.php b/category-grid-widget-for-elementor.php new file mode 100644 index 0000000..392038e --- /dev/null +++ b/category-grid-widget-for-elementor.php @@ -0,0 +1,230 @@ + esc_js(__('Sélectionner une image de catégorie', 'category-grid-widget-for-elementor')), + 'button' => esc_js(__('Sélectionner', 'category-grid-widget-for-elementor')), + ] + ); +} +add_action('admin_enqueue_scripts', 'ccgw_enqueue_media_uploader'); + +// 1) Déclarez la colonne "Image" dans le tableau des catégories +add_filter('manage_edit-category_columns', function ($columns) { + $new = []; + foreach ($columns as $key => $label) { + $new[$key] = $label; + if ('name' === $key) { + // après la colonne "Nom", on insère notre colonne "Image" + $new['category_image'] = esc_html__('Image', 'category-grid-widget-for-elementor'); + } + } + return $new; +}); + +// 2) Remplissez la colonne "Image" +add_filter('manage_category_custom_column', function ($out, $column, $term_id) { + if ('category_image' === $column) { + $thumb_id = get_term_meta($term_id, 'thumbnail_id', true); + if ($thumb_id) { + // Affiche la version 'thumbnail' de l'image + return wp_get_attachment_image($thumb_id, 'thumbnail', false, [ + 'style' => 'max-width:60px;height:auto;' + ]); + } + } + return $out; +}, 10, 3); + +// 3) Un peu de CSS pour la largeur de colonne et la mise en forme +add_action('admin_head-edit-tags.php', function () { + echo ''; +}); + +/** + * Affiche le champ d'upload dans le formulaire de création de catégorie. + */ +function ccgw_category_image_field($taxonomy) +{ ?> +
+ + +
+

+ + +

+ +
+term_id, 'thumbnail_id', true); + $image_url = $image_id ? wp_get_attachment_thumb_url($image_id) : ''; + ?> + + + + + + +
+ + 'max-width:60px;height:auto;'] + ); + ?> + +
+

+ + +

+ + + +register(new \Elementor_Category_Grid_Widget()); +} +add_action('elementor/widgets/register', 'register_category_grid_widget'); + +/** + * Enqueue styles front-end pour le widget. + */ +function ccgw_enqueue_front_styles() +{ + // Ne charger que si Elementor est actif + if (defined('ELEMENTOR_VERSION')) { + wp_enqueue_style( + 'ccgw-category-grid-style', + plugin_dir_url(__FILE__) . 'css/style.css', + [], + '1.2.1' + ); + } +} +add_action('wp_enqueue_scripts', 'ccgw_enqueue_front_styles'); diff --git a/elementor-category-grid-widget.php b/elementor-category-grid-widget.php deleted file mode 100644 index cce84fe..0000000 --- a/elementor-category-grid-widget.php +++ /dev/null @@ -1,184 +0,0 @@ - esc_js( __( 'Sélectionner une image de catégorie', 'category-grid-widget' ) ), - 'button' => esc_js( __( 'Sélectionner', 'category-grid-widget' ) ), - ] - ); -} -add_action( 'admin_enqueue_scripts', 'ccgw_enqueue_media_uploader' ); - -// 1) Déclarez la colonne "Image" dans le tableau des catégories -add_filter( 'manage_edit-category_columns', function( $columns ) { - $new = []; - foreach ( $columns as $key => $label ) { - $new[ $key ] = $label; - if ( 'name' === $key ) { - // après la colonne "Nom", on insère notre colonne "Image" - $new['category_image'] = esc_html__( 'Image', 'category-grid-widget' ); - } - } - return $new; -} ); - -// 2) Remplissez la colonne "Image" -add_filter( 'manage_category_custom_column', function( $out, $column, $term_id ) { - if ( 'category_image' === $column ) { - $thumb_id = get_term_meta( $term_id, 'thumbnail_id', true ); - if ( $thumb_id ) { - // Affiche la version 'thumbnail' de l'image - return wp_get_attachment_image( $thumb_id, 'thumbnail', false, [ - 'style' => 'max-width:60px;height:auto;' - ] ); - } - } - return $out; -}, 10, 3 ); - -// 3) Un peu de CSS pour la largeur de colonne et la mise en forme -add_action( 'admin_head-edit-tags.php', function() { - echo ''; -} ); - -/** - * Affiche le champ d'upload dans le formulaire de création de catégorie. - */ -function ccgw_category_image_field( $taxonomy ) { ?> -
- - -
-

- - -

-
-term_id, 'thumbnail_id', true ); - $image_url = $image_id ? wp_get_attachment_thumb_url( $image_id ) : ''; - ?> - - - - - - -
- - - -
-

- - -

- - -register( new \Elementor_Category_Grid_Widget() ); -} -add_action( 'elementor/widgets/register', 'register_category_grid_widget' ); - -/** - * Enqueue styles front-end pour le widget. - */ -function ccgw_enqueue_front_styles() { - // Ne charger que si Elementor est actif - if ( defined( 'ELEMENTOR_VERSION' ) ) { - wp_enqueue_style( - 'ccgw-category-grid-style', - plugin_dir_url( __FILE__ ) . 'css/style.css', - [], - '1.2.1' - ); - } -} -add_action( 'wp_enqueue_scripts', 'ccgw_enqueue_front_styles' ); diff --git a/readme.txt b/readme.txt index c0bbc16..e39e9bd 100644 --- a/readme.txt +++ b/readme.txt @@ -1,19 +1,17 @@ -=== Elementor Category Grid Widget === +=== Category Grid Widget for Elementor === Contributors: mrraph Donate link: https://your-site.example/donate Tags: elementor, category, grid, widget, posts Requires at least: 5.8 -Tested up to: 6.8.1 +Tested up to: 6.8 Requires PHP: 7.0 Stable tag: 1.2.1 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html - Responsive grid of post categories with images for Elementor. -Allows manual selection of categories to display, inclusion of subcategories, hiding categories without images, and control over number of columns, image sizes, style settings, and hover effects. == Description == -**Elementor Category Grid Widget** adds a simple yet powerful widget to Elementor for displaying your post categories in a grid: +**Category Grid Widget for Elementor** adds a simple yet powerful widget to Elementor for displaying your post categories in a grid: - Manual selection of categories to display - Option to show subcategories - Option to hide categories without an image @@ -26,8 +24,8 @@ Allows manual selection of categories to display, inclusion of subcategories, hi The widget uses WordPress’s native category image feature (a “Category Image” field added in the admin). == Installation == -1. Upload the `elementor-category-grid-widget` folder to `/wp-content/plugins/`. -2. Activate **Elementor Category Grid Widget** in the **Plugins** menu. +1. Upload the `elementor-category-grid-widget-for-elementor` folder to `/wp-content/plugins/`. +2. Activate **Category Grid Widget for Elementor** in the **Plugins** menu. 3. In Elementor, add the **Category Grid** widget to your layout. 4. Configure: select categories, columns, style, and hover effects. diff --git a/widgets/category-grid-widget.php b/widgets/category-grid-widget.php index a2b3f77..e254650 100644 --- a/widgets/category-grid-widget.php +++ b/widgets/category-grid-widget.php @@ -33,7 +33,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base */ public function get_title(): string { - return esc_html__('Grille de Catégories', 'category-grid-widget'); + return esc_html__('Grille de Catégories', 'category-grid-widget-for-elementor'); } /** @@ -71,14 +71,14 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->start_controls_section( 'section_style_grid', [ - 'label' => esc_html__('Grille', 'category-grid-widget'), + 'label' => esc_html__('Grille', 'category-grid-widget-for-elementor'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_responsive_control( 'grid_gap', [ - 'label' => esc_html__('Espacement (gap)', 'category-grid-widget'), + 'label' => esc_html__('Espacement (gap)', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::SLIDER, 'size_units' => ['px', 'em', '%'], 'range' => [ @@ -96,14 +96,14 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->start_controls_section( 'section_style_card', [ - 'label' => esc_html__('Carte', 'category-grid-widget'), + 'label' => esc_html__('Carte', 'category-grid-widget-for-elementor'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_control( 'card_bg_color', [ - 'label' => esc_html__('Fond de la carte', 'category-grid-widget'), + 'label' => esc_html__('Fond de la carte', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::COLOR, 'default' => '', 'selectors' => [ @@ -115,14 +115,14 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base Group_Control_Typography::get_type(), [ 'name' => 'card_title_typography', - 'label' => esc_html__('Typographie du titre', 'category-grid-widget'), + 'label' => esc_html__('Typographie du titre', 'category-grid-widget-for-elementor'), 'selector' => '{{WRAPPER}} .category-card-name', ] ); $this->add_control( 'card_border_radius', [ - 'label' => esc_html__('Border radius', 'category-grid-widget'), + 'label' => esc_html__('Border radius', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', '%'], 'selectors' => [ @@ -134,7 +134,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base \Elementor\Group_Control_Box_Shadow::get_type(), [ 'name' => 'card_box_shadow', - 'label' => esc_html__('Ombre de la carte', 'category-grid-widget'), + 'label' => esc_html__('Ombre de la carte', 'category-grid-widget-for-elementor'), 'selector' => '{{WRAPPER}} .category-card', ] ); @@ -144,7 +144,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->start_controls_section( 'section_style_title', [ - 'label' => esc_html__('Titre', 'category-grid-widget'), + 'label' => esc_html__('Titre', 'category-grid-widget-for-elementor'), 'tab' => Controls_Manager::TAB_STYLE, ] ); @@ -153,10 +153,10 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'disable_title_bg', [ - 'label' => esc_html__('Désactiver le fond du titre', 'category-grid-widget'), + 'label' => esc_html__('Désactiver le fond du titre', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::SWITCHER, - 'label_on' => esc_html__('Oui', 'category-grid-widget'), - 'label_off' => esc_html__('Non', 'category-grid-widget'), + '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', 'selectors' => [ @@ -170,7 +170,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'title_text_color', [ - 'label' => esc_html__('Couleur du texte', 'category-grid-widget'), + 'label' => esc_html__('Couleur du texte', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::COLOR, 'default' => '#ffffff', 'selectors' => [ @@ -183,7 +183,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'title_bg_color', [ - 'label' => esc_html__('Fond du titre', 'category-grid-widget'), + 'label' => esc_html__('Fond du titre', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::COLOR, 'default' => 'rgba(0,0,0,0.4)', 'selectors' => [ @@ -201,7 +201,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base Group_Control_Typography::get_type(), [ 'name' => 'card_title_typography', - 'label' => esc_html__('Typographie du titre', 'category-grid-widget'), + 'label' => esc_html__('Typographie du titre', 'category-grid-widget-for-elementor'), 'selector' => '{{WRAPPER}} .category-card-name', ] ); @@ -212,7 +212,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->start_controls_section( 'section_style_hover', [ - 'label' => esc_html__('Hover', 'category-grid-widget'), + 'label' => esc_html__('Hover', 'category-grid-widget-for-elementor'), 'tab' => Controls_Manager::TAB_STYLE, ] ); @@ -221,7 +221,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'hover_overlay_color', [ - 'label' => esc_html__('Couleur de l’overlay', 'category-grid-widget'), + 'label' => esc_html__('Couleur de l’overlay', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::COLOR, 'default' => 'rgba(0,0,0,0.3)', 'selectors' => [ @@ -235,7 +235,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'hover_overlay_opacity', [ - 'label' => esc_html__('Opacité de l’overlay', 'category-grid-widget'), + 'label' => esc_html__('Opacité de l’overlay', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::SLIDER, 'size_units' => ['%'], 'range' => [ @@ -253,7 +253,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'title_hover_color', [ - 'label' => esc_html__('Couleur du titre au hover', 'category-grid-widget'), + 'label' => esc_html__('Couleur du titre au hover', 'category-grid-widget-for-elementor'), 'type' => Controls_Manager::COLOR, 'default' => '#ffffff', 'selectors' => [ @@ -274,7 +274,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->start_controls_section( 'section_content', [ - 'label' => esc_html__('Catégories', 'category-grid-widget'), + 'label' => esc_html__('Catégories', 'category-grid-widget-for-elementor'), 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, ] ); @@ -288,12 +288,12 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'categories', [ - 'label' => esc_html__('Catégories à afficher', 'category-grid-widget'), + 'label' => esc_html__('Catégories à afficher', 'category-grid-widget-for-elementor'), 'type' => \Elementor\Controls_Manager::SELECT2, 'multiple' => true, 'label_block' => true, 'options' => $options, - 'description' => esc_html__('Sélectionnez les catégories d’articles à afficher.', 'category-grid-widget'), + 'description' => esc_html__('Sélectionnez les catégories d’articles à afficher.', 'category-grid-widget-for-elementor'), ] ); @@ -301,13 +301,13 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'show_subcategories', [ - 'label' => esc_html__('Afficher les sous-catégories', 'category-grid-widget'), + 'label' => esc_html__('Afficher les sous-catégories', 'category-grid-widget-for-elementor'), 'type' => \Elementor\Controls_Manager::SWITCHER, - 'label_on' => esc_html__('Oui', 'category-grid-widget'), - 'label_off' => esc_html__('Non', 'category-grid-widget'), + 'label_on' => esc_html__('Oui', 'category-grid-widget-for-elementor'), + 'label_off' => esc_html__('Non', 'category-grid-widget-for-elementor'), 'return_value' => 'yes', 'default' => 'yes', - 'description' => esc_html__('Inclure aussi les sous-catégories des catégories sélectionnées.', 'category-grid-widget'), + 'description' => esc_html__('Inclure aussi les sous-catégories des catégories sélectionnées.', 'category-grid-widget-for-elementor'), ] ); @@ -316,13 +316,13 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'hide_without_image', [ - 'label' => esc_html__('Afficher uniquement catégories avec image', 'category-grid-widget'), + 'label' => esc_html__('Afficher uniquement catégories avec image', 'category-grid-widget-for-elementor'), 'type' => \Elementor\Controls_Manager::SWITCHER, - 'label_on' => esc_html__('Oui', 'category-grid-widget'), - 'label_off' => esc_html__('Non', 'category-grid-widget'), + '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é, les catégories sans image seront masquées.', 'category-grid-widget'), + 'description' => esc_html__('Si activé, les catégories sans image seront masquées.', 'category-grid-widget-for-elementor'), ] ); @@ -330,12 +330,12 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'order_by', [ - 'label' => esc_html__('Trier par', 'category-grid-widget'), + 'label' => esc_html__('Trier par', 'category-grid-widget-for-elementor'), 'type' => \Elementor\Controls_Manager::SELECT, 'options' => [ - 'name' => esc_html__('Nom (alphabétique)', 'category-grid-widget'), - 'count' => esc_html__('Nombre d’articles', 'category-grid-widget'), - 'id' => esc_html__('ID (date de création)', 'category-grid-widget'), + 'name' => esc_html__('Nom (alphabétique)', 'category-grid-widget-for-elementor'), + 'count' => esc_html__('Nombre d’articles', 'category-grid-widget-for-elementor'), + 'id' => esc_html__('ID (date de création)', 'category-grid-widget-for-elementor'), ], 'default' => 'name', ] @@ -345,11 +345,11 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'order', [ - 'label' => esc_html__('Ordre', 'category-grid-widget'), + 'label' => esc_html__('Ordre', 'category-grid-widget-for-elementor'), 'type' => \Elementor\Controls_Manager::SELECT, 'options' => [ - 'ASC' => esc_html__('Croissant (A-Z / 0-9)', 'category-grid-widget'), - 'DESC' => esc_html__('Décroissant (Z-A / 9-0)', 'category-grid-widget'), + 'ASC' => esc_html__('Croissant (A-Z / 0-9)', 'category-grid-widget-for-elementor'), + 'DESC' => esc_html__('Décroissant (Z-A / 9-0)', 'category-grid-widget-for-elementor'), ], 'default' => 'ASC', ] @@ -361,7 +361,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->start_controls_section( 'section_layout', [ - 'label' => esc_html__('Mise en page', 'category-grid-widget'), + 'label' => esc_html__('Mise en page', 'category-grid-widget-for-elementor'), 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, ] ); @@ -370,7 +370,7 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'columns', [ - 'label' => esc_html__('Nombre de colonnes', 'category-grid-widget'), + 'label' => esc_html__('Nombre de colonnes', 'category-grid-widget-for-elementor'), 'type' => \Elementor\Controls_Manager::SELECT, 'options' => [ 1 => '1', @@ -388,13 +388,13 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base $this->add_control( 'image_size', [ - 'label' => esc_html__('Taille des images', 'category-grid-widget'), + 'label' => esc_html__('Taille des images', 'category-grid-widget-for-elementor'), 'type' => \Elementor\Controls_Manager::SELECT, 'options' => [ - 'thumbnail' => esc_html__('Miniature (thumbnail)', 'category-grid-widget'), - 'medium' => esc_html__('Moyen (medium)', 'category-grid-widget'), - 'large' => esc_html__('Grand (large)', 'category-grid-widget'), - 'full' => esc_html__('Plein (full)', 'category-grid-widget'), + 'thumbnail' => esc_html__('Miniature (thumbnail)', 'category-grid-widget-for-elementor'), + 'medium' => esc_html__('Moyen (medium)', 'category-grid-widget-for-elementor'), + 'large' => esc_html__('Grand (large)', 'category-grid-widget-for-elementor'), + 'full' => esc_html__('Plein (full)', 'category-grid-widget-for-elementor'), ], 'default' => 'medium', ] @@ -511,18 +511,23 @@ class Elementor_Category_Grid_Widget extends \Elementor\Widget_Base // Rendu HTML echo '
'; foreach ($terms as $term) { - $name = esc_html($term->name); - $link = esc_url(get_term_link($term)); - $image_url = esc_url($term->_image_url); - + $thumbnail_id = get_term_meta( $term->term_id, 'thumbnail_id', true ); echo ''; }