Plugin Directory

Changeset 3414594


Ignore:
Timestamp:
12/08/2025 05:37:56 PM (4 months ago)
Author:
lyode
Message:

fix: display plugin icon on all admin pages

File:
1 edited

Legend:

Unmodified
Added
Removed
  • filikod/trunk/includes/admin/class-filikod-admin.php

    r3413113 r3414594  
    2323        add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
    2424        add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) );
     25        add_action( 'admin_footer', array( $this, 'inject_menu_icon_script' ) );
    2526    }
    2627   
     
    6566     */
    6667    public function enqueue_admin_assets( $hook ) {
    67         // Charger uniquement sur les pages du plugin
     68        // Charger le CSS sur toutes les pages admin pour que l'icône soit visible partout
     69        // C'est nécessaire car le menu est visible sur toutes les pages admin
     70        wp_enqueue_style(
     71            'filikod-admin',
     72            FILIKOD_PLUGIN_URL . 'assets/css/admin.css',
     73            array(),
     74            FILIKOD_VERSION
     75        );
     76       
     77        // Charger uniquement le JS complet sur les pages du plugin
    6878        // Le hook pour le menu principal est 'toplevel_page_filikod'
    6979        // Le hook pour les sous-menus est 'filikod_page_filikod-settings'
     
    7787            return;
    7888        }
    79        
    80         // CSS
    81         wp_enqueue_style(
    82             'filikod-admin',
    83             FILIKOD_PLUGIN_URL . 'assets/css/admin.css',
    84             array(),
    85             FILIKOD_VERSION
    86         );
    8789       
    8890        // JavaScript
     
    127129        );
    128130       
    129         // Ajouter le script inline pour injecter l'icône SVG du menu
     131        // Ajouter le script inline pour injecter l'icône SVG du menu (fallback pour les pages du plugin)
    130132        $svg = $this->get_svg_icon();
    131133        $inline_script = sprintf(
     
    139141                });
    140142            })(jQuery);",
    141             wp_json_encode( $svg )
     143            wp_json_encode( $svg, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT )
    142144        );
    143145        wp_add_inline_script( 'filikod-admin', $inline_script );
    144146    }
    145147   
     148    /**
     149     * Injecter l'icône SVG du menu via JavaScript
     150     * Utilise admin_footer pour s'exécuter sur toutes les pages admin
     151     * Conforme aux bonnes pratiques WordPress
     152     */
     153    public function inject_menu_icon_script() {
     154        // Vérifier que le menu existe avant d'injecter le script
     155        global $menu;
     156        $menu_exists = false;
     157        if ( is_array( $menu ) ) {
     158            foreach ( $menu as $menu_item ) {
     159                if ( isset( $menu_item[2] ) && 'filikod' === $menu_item[2] ) {
     160                    $menu_exists = true;
     161                    break;
     162                }
     163            }
     164        }
     165       
     166        if ( ! $menu_exists ) {
     167            return;
     168        }
     169       
     170        $svg = $this->get_svg_icon();
     171        // Utiliser wp_json_encode avec les flags appropriés pour sécuriser le SVG
     172        $svg_json = wp_json_encode( $svg, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT );
     173        ?>
     174        <script type="text/javascript">
     175        (function() {
     176            function injectFilikodIcon() {
     177                var menuIcon = document.querySelector('#toplevel_page_filikod .wp-menu-image');
     178                if (menuIcon && !menuIcon.querySelector('svg')) {
     179                    menuIcon.innerHTML = <?php echo $svg_json; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - wp_json_encode échappe déjà correctement ?>;
     180                }
     181            }
     182            // Exécuter immédiatement et après le chargement du DOM
     183            if (document.readyState === 'loading') {
     184                document.addEventListener('DOMContentLoaded', injectFilikodIcon);
     185            } else {
     186                injectFilikodIcon();
     187            }
     188            // Exécuter aussi après un court délai pour s'assurer que le menu est rendu
     189            setTimeout(injectFilikodIcon, 100);
     190        })();
     191        </script>
     192        <?php
     193    }
    146194   
    147195    /**
Note: See TracChangeset for help on using the changeset viewer.