Si vous avez déjà vu un écran blanc après avoir collé “un petit snippet” dans functions.php, vous savez pourquoi ce fichier fait peur… et pourquoi il peut vous sauver la journée quand il est bien utilisé.
Le problème / Le besoin
Vous voulez personnaliser WordPress 6.9.4 (avril 2026) sans installer 12 plugins pour 12 micro-fonctions. Typiquement : nettoyer l’admin, ajouter un shortcode, désactiver des comportements, ajuster des emails, améliorer de petits détails SEO/perf. Le réflexe de beaucoup de blogueurs est de coller du code “trouvé sur Google” dans functions.php. Le problème vient de deux choses : le code est souvent vieux (incompatible WP 6.9+ / PHP 8.1+), et il est collé au mauvais endroit, sans garde-fous.
À la fin, vous saurez :
- où placer proprement des snippets (sans casser votre thème)
- comment activer 10 personnalisations utiles (et actuelles) sur WordPress 6.9.4
- comment reconnaître un hook (action/filtre) et l’utiliser au bon moment
- comment tester et dépanner sans paniquer
Où coller le code (important)
Avant le premier bloc de code : évitez de coller 10 snippets dans le functions.php du thème parent. Faites l’un de ces choix :
- Option recommandée (propre) : un mini-plugin “custom” (un seul fichier). Avantage : indépendant du thème.
- Option acceptable :
functions.phpd’un thème enfant. - Option avancée : un mu-plugin (plugin must-use) si vous voulez que ce soit inactivable uniquement via FTP.
Fonctions et APIs WordPress utilisées (avec doc)
- Hooks (actions/filtres) : Plugin API / Hooks
- Ajouter une action/filtre : add_action(), add_filter()
- Charger CSS/JS proprement : wp_enqueue_script(), wp_enqueue_style()
- Shortcodes : add_shortcode()
- Sécurité (nonce/capabilités) : Nonces, Roles & capabilities
- Sanitization / escaping : Data sanitization, Escaping
Résumé rapide
- Vous installez un mini-plugin “Snippets essentiels” (1 fichier) au lieu d’empiler du code dans le thème.
- Vous activez 10 snippets : sécurité, admin, front, emails, performance légère.
- Chaque snippet est derrière un filtre/constante pour pouvoir le désactiver sans supprimer le code.
- Vous testez dans un environnement de staging, puis vous déployez sur production.
- Vous apprenez à repérer les erreurs classiques : hook trop tôt, oubli de point-virgule, cache non vidé.
Quand utiliser cette solution
- Vous avez besoin de petites personnalisations (5 à 50 lignes) qui ne justifient pas un plugin complet.
- Vous voulez réduire le nombre de plugins (et les risques de plugins abandonnés).
- Vous changez parfois de thème (Divi 5, Avada, thème bloc) et vous voulez garder vos réglages.
- Vous avez un site client et vous voulez centraliser des ajustements récurrents (logo admin, emails, nettoyage, etc.).
Quand ne PAS utiliser cette solution
- Vous ajoutez une fonctionnalité “métier” complexe (CPT + champs + API + UI). Là, créez un vrai plugin structuré (classes, fichiers séparés).
- Vous avez besoin d’une UI (réglages) : un snippet sans page d’options devient vite ingérable.
- Vous copiez du code sans le comprendre. J’ai souvent vu des snippets “SEO” qui cassent les canonical ou qui empêchent l’indexation.
- Vous voulez modifier le cœur de WordPress : ne touchez jamais aux fichiers core. Utilisez hooks, plugins, thème enfant.
Prérequis / avant de commencer
Versions
- WordPress : 6.9.4+
- PHP : 8.1+ (idéalement 8.2/8.3 si votre hébergeur suit)
Sauvegarde et environnement
- Faites une sauvegarde fichiers + base (ou un snapshot). Ne testez pas directement sur production.
- Préparez un staging. Même un clone local suffit.
Outils utiles
- Activer
WP_DEBUGen staging (et logs) : Debug WordPress - Un accès FTP/SFTP au cas où vous deviez désactiver le snippet qui casse tout.
Précautions sécurité
- Tout code qui traite une entrée (URL, formulaire, admin) doit vérifier : capabilités + nonce + sanitization.
- Tout affichage doit être échappé (escaping) :
esc_html(),esc_attr(),esc_url(), etc.
L’approche naïve (et pourquoi l’éviter)
La version “débutant pressé” ressemble à ça : 10 bouts de code copiés-collés dans functions.php du thème parent, sans commentaires, parfois en doublon, parfois avec des fonctions qui n’existent plus.
<?php
// ❌ Mauvaise idée : thème parent + pas de garde-fou + noms de fonctions génériques.
add_filter('the_content', 'custom');
function custom($c) { return $c . '<script>alert(1)</script>'; }
// ❌ Mauvaise idée : désactiver des choses “au hasard” sans condition.
remove_action('wp_head', 'wp_generator');
Pourquoi ça pose problème :
- Perte au changement de thème : votre code disparaît si vous changez de thème.
- Maintenance impossible : pas de structure, pas d’option pour désactiver un snippet.
- Risque sécurité : scripts injectés, absence de nonce, ou suppression de protections.
- Erreurs fatales : une parenthèse manquante et c’est l’écran blanc (fatal error).
La bonne approche — tutoriel pas à pas
- Créez un mini-plugin pour vos snippets.
- Structurez : 1 section = 1 snippet, avec un commentaire clair.
- Ajoutez des garde-fous : nommage préfixé, conditions, filtres pour désactiver.
- Testez en staging avec logs activés.
Étape 1 — Créer le plugin “Snippets essentiels”
Créez un fichier :
wp-content/plugins/snippets-essentiels/snippets-essentiels.php
Puis activez-le dans Extensions > Ajouter (ou via l’écran Extensions si le dossier est déjà en place).
Étape 2 — Comprendre “hook”, “action”, “filtre” (sans jargon inutile)
Un hook est un point d’accroche dans l’exécution de WordPress.
- Une action (add_action) exécute votre fonction à un moment donné (ex : quand WordPress charge les scripts).
- Un filtre (add_filter) reçoit une valeur, la modifie, puis la renvoie (ex : modifier un extrait, un email, un titre).
Étape 3 — Coller le code (complet) ci-dessous
Copiez-collez le code de la section Code complet dans snippets-essentiels.php. Ne le collez pas dans un article, ni dans un widget, ni dans un builder.
Code complet
Ce plugin regroupe 10 snippets utiles, compatibles WordPress 6.9.4+ et PHP 8.1+. Tout est commenté, et les noms de fonctions sont préfixés pour éviter les collisions.
<?php
/**
* Plugin Name: Snippets essentiels (site)
* Description: 10 snippets pratiques pour personnaliser WordPress sans dépendre du thème.
* Version: 1.0.0
* Author: Votre Nom
* Requires at least: 6.9
* Requires PHP: 8.1
*/
if (!defined('ABSPATH')) {
exit; // Sécurité : empêche l'accès direct au fichier.
}
/**
* Petit helper : permet de désactiver un snippet via un filtre.
* Exemple : add_filter('bpcab_snippet_enabled', fn($enabled, $key) => $key === 'admin_bar' ? false : $enabled, 10, 2);
*/
function bpcab_snippet_is_enabled(string $key): bool {
/**
* Filtre: bpcab_snippet_enabled
* @param bool $enabled True par défaut
* @param string $key Identifiant du snippet
*/
return (bool) apply_filters('bpcab_snippet_enabled', true, $key);
}
/* ------------------------------------------------------------
* SNIPPET 1 — Nettoyer l'en-tête HTML : retirer la version WP (wp_generator)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('remove_generator')) {
add_action('init', function () {
// Retire la balise meta generator (<meta name="generator" ...>).
remove_action('wp_head', 'wp_generator');
});
}
/* ------------------------------------------------------------
* SNIPPET 2 — Désactiver l'édition de fichiers depuis l'admin (sécurité)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('disable_file_editor')) {
add_action('admin_init', function () {
// On évite de redéfinir une constante si elle existe déjà dans wp-config.php.
if (!defined('DISALLOW_FILE_EDIT')) {
define('DISALLOW_FILE_EDIT', true);
}
});
}
/* ------------------------------------------------------------
* SNIPPET 3 — Changer l'expéditeur des emails WordPress (wp_mail)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('mail_from')) {
add_filter('wp_mail_from', function ($from_email) {
$domain = wp_parse_url(home_url(), PHP_URL_HOST);
if (!$domain) {
return $from_email;
}
// Adresse simple, évite "wordpress@".
return 'no-reply@' . $domain;
});
add_filter('wp_mail_from_name', function ($from_name) {
// Nom du site comme expéditeur.
return wp_specialchars_decode(get_bloginfo('name'), ENT_QUOTES);
});
}
/* ------------------------------------------------------------
* SNIPPET 4 — Ajouter une classe CSS au <body> selon le rôle (utile pour styliser)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('body_class_role')) {
add_filter('body_class', function (array $classes) {
if (is_user_logged_in()) {
$user = wp_get_current_user();
if (!empty($user->roles)) {
foreach ($user->roles as $role) {
$classes[] = 'role-' . sanitize_html_class($role);
}
}
} else {
$classes[] = 'role-guest';
}
return $classes;
});
}
/* ------------------------------------------------------------
* SNIPPET 5 — Masquer la barre d'admin sur le front pour les non-admins
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('hide_admin_bar')) {
add_filter('show_admin_bar', function ($show) {
// Laisser la barre aux administrateurs uniquement.
if (is_admin()) {
return $show;
}
return current_user_can('manage_options');
});
}
/* ------------------------------------------------------------
* SNIPPET 6 — Shortcode [annee] et [site_name] (pratique pour footer)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('shortcodes_basic')) {
add_shortcode('annee', function () {
// Échappement : on renvoie une chaîne sûre.
return esc_html(wp_date('Y'));
});
add_shortcode('site_name', function () {
return esc_html(get_bloginfo('name'));
});
}
/* ------------------------------------------------------------
* SNIPPET 7 — Charger un CSS "micro-custom" proprement (front)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('enqueue_custom_css')) {
add_action('wp_enqueue_scripts', function () {
// Changez ce chemin si vous préférez un fichier dans votre thème enfant.
$handle = 'bpcab-micro-custom';
$css = "
/* Exemple : petite amélioration lisibilité */
.entry-content a { text-underline-offset: 0.15em; }
.entry-content a:hover { text-decoration-thickness: 2px; }
";
// On enregistre une feuille "vide", puis on injecte du CSS inline.
wp_register_style($handle, false, [], '1.0.0');
wp_enqueue_style($handle);
wp_add_inline_style($handle, $css);
}, 20);
}
/* ------------------------------------------------------------
* SNIPPET 8 — Forcer des images en lazy-loading (si un thème l'a désactivé)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('force_lazy_loading')) {
add_filter('wp_lazy_loading_enabled', function ($default, $tag_name, $context) {
// WordPress gère déjà très bien le lazy-load ; ce snippet sert surtout si un thème/plugin l'a coupé.
if ($tag_name === 'img') {
return true;
}
return $default;
}, 10, 3);
}
/* ------------------------------------------------------------
* SNIPPET 9 — Rediriger les auteurs (sans droits) loin de /wp-admin/
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('redirect_low_roles_admin')) {
add_action('admin_init', function () {
// Ne pas bloquer AJAX, REST, cron.
if (wp_doing_ajax() || (defined('REST_REQUEST') && REST_REQUEST) || wp_doing_cron()) {
return;
}
// Si l'utilisateur n'a pas accès à l'admin, on le renvoie sur la page d'accueil.
// "read" est très large ; ici on veut plutôt filtrer ceux qui n'ont pas "edit_posts".
if (is_user_logged_in() && !current_user_can('edit_posts')) {
wp_safe_redirect(home_url('/'));
exit;
}
});
}
/* ------------------------------------------------------------
* SNIPPET 10 — Ajouter une page "Santé rapide" dans Outils (diagnostic simple)
* ------------------------------------------------------------ */
if (bpcab_snippet_is_enabled('tools_health_page')) {
add_action('admin_menu', function () {
add_management_page(
'Santé rapide',
'Santé rapide',
'manage_options',
'bpcab-sante-rapide',
'bpcab_render_quick_health_page'
);
});
/**
* Affiche une page de diagnostic minimaliste.
* Capabilité : manage_options (admin).
*/
function bpcab_render_quick_health_page(): void {
if (!current_user_can('manage_options')) {
wp_die(esc_html__('Accès refusé.', 'default'));
}
// Nonce pour une action de "purge opcache" fictive (exemple pédagogique).
$nonce_action = 'bpcab_quick_health_action';
$nonce_name = '_bpcab_nonce';
// Traitement d'une action admin (exemple : vider caches plugin via hooks, etc.)
if (isset($_POST['bpcab_action']) && $_POST['bpcab_action'] === 'noop') {
check_admin_referer($nonce_action, $nonce_name);
// Ici vous pourriez déclencher une action interne, un flush, etc.
add_settings_error('bpcab_messages', 'bpcab_noop', 'Action exécutée (démo).', 'updated');
}
settings_errors('bpcab_messages');
$php_version = PHP_VERSION;
$wp_version = get_bloginfo('version');
$theme = wp_get_theme();
$memory = ini_get('memory_limit');
echo '<div class="wrap">';
echo '<h1>' . esc_html__('Santé rapide', 'default') . '</h1>';
echo '<p>Cette page évite d’installer un plugin de diagnostic juste pour 3 infos. Je l’utilise souvent en dépannage client.</p>';
echo '<table class="widefat striped"><tbody>';
echo '<tr><th>WordPress</th><td>' . esc_html($wp_version) . '</td></tr>';
echo '<tr><th>PHP</th><td>' . esc_html($php_version) . '</td></tr>';
echo '<tr><th>Thème actif</th><td>' . esc_html($theme->get('Name')) . ' (' . esc_html($theme->get_stylesheet()) . ')</td></tr>';
echo '<tr><th>Memory limit (PHP)</th><td>' . esc_html((string) $memory) . '</td></tr>';
echo '</tbody></table>';
echo '<hr />';
echo '<form method="post">';
wp_nonce_field($nonce_action, $nonce_name);
echo '<input type="hidden" name="bpcab_action" value="noop" />';
submit_button('Lancer une action (démo)');
echo '</form>';
echo '</div>';
}
}
Explication du code
Structure générale : pourquoi un plugin et pas functions.php
Un plugin reste actif même si vous changez de thème. Sur des sites Divi/Avada, c’est un vrai gain : ces thèmes sont souvent remplacés lors de refontes, et les snippets “dans le thème” disparaissent.
Le garde-fou if (!defined('ABSPATH')) exit; empêche l’exécution si quelqu’un appelle le fichier directement. Ce n’est pas “la” sécurité, mais c’est une bonne hygiène.
Le helper bpcab_snippet_is_enabled()
Ce helper s’appuie sur un filtre (hook de type filtre) : apply_filters(). L’idée : vous pouvez désactiver un snippet sans supprimer de code, juste en ajoutant un filtre ailleurs (ou dans un mu-plugin). C’est un pattern que j’utilise souvent quand un client me dit “on garde le code, mais on coupe ça pour l’instant”.
Snippet 1 : retirer wp_generator
remove_action('wp_head', 'wp_generator') supprime la balise meta qui affiche la version. Ce n’est pas une protection magique (la version peut fuiter ailleurs), mais ça évite au minimum d’afficher l’info en clair sur le front.
Snippet 2 : désactiver l’éditeur de fichiers
WordPress permet d’éditer thèmes/plugins depuis l’admin. Sur un site compromis, c’est une porte ouverte. La constante DISALLOW_FILE_EDIT coupe cette interface. Idéalement, mettez-la dans wp-config.php, mais ce snippet aide quand vous n’avez pas la main sur ce fichier.
Snippet 3 : expéditeur des emails
Les filtres wp_mail_from et wp_mail_from_name modifient l’expéditeur de tous les emails envoyés via wp_mail(). Ça réduit les cas où les emails arrivent en spam parce que l’expéditeur “wordpress@serveur” ne correspond à rien. Attention : pour une délivrabilité propre, il faut aussi SPF/DKIM côté DNS (hors snippet).
Snippet 4 : classe body selon rôle
Le filtre body_class reçoit un tableau de classes. On ajoute role-editor, role-author, etc. C’est pratique pour afficher/masquer des éléments via CSS (sans plugin). On sanitise avec sanitize_html_class().
Snippet 5 : masquer la barre d’admin
Le filtre show_admin_bar renvoie un booléen. Ici : barre visible uniquement si l’utilisateur a la capacité manage_options (généralement admin). Si vous avez des éditeurs qui gèrent le site, adaptez la capacité.
Snippet 6 : shortcodes
[annee] et [site_name] servent souvent dans un footer (y compris dans un builder). Les valeurs sont échappées avec esc_html(). Le but est d’éviter de coller du PHP dans un template pour un détail.
Snippet 7 : charger du CSS correctement
Beaucoup de débutants collent du CSS dans un bloc HTML ou dans un header builder, puis ça casse au cache/minification. Là, on passe par wp_enqueue_scripts et on injecte du CSS inline via wp_add_inline_style(). C’est propre, et ça respecte l’ordre de chargement.
Snippet 8 : lazy-loading
Sur WordPress moderne, le lazy-loading est déjà géré. Mais j’ai croisé des thèmes “optimisation” qui le désactivaient globalement, puis les pages devenaient lourdes. Le filtre wp_lazy_loading_enabled vous permet de forcer l’activation pour img.
Snippet 9 : redirection hors admin
Ce snippet évite que des comptes “abonnés” se baladent dans /wp-admin/. On respecte les cas spéciaux : AJAX, REST, cron. Et on utilise wp_safe_redirect() (plus sûr que wp_redirect() si une URL externe se glisse quelque part).
Snippet 10 : page Outils > Santé rapide
On ajoute une page via add_management_page(). On vérifie la capacité manage_options. Et on montre un exemple de formulaire admin sécurisé avec nonce :
wp_nonce_field()génère le champ noncecheck_admin_referer()valide le nonce
Même si l’action est une “démo”, la structure est la même que pour une vraie action (purge cache, resync, etc.).
Variantes et cas d’usage
Variante 1 — Désactiver un snippet sans toucher au plugin
Ajoutez ceci dans un mu-plugin (ou dans votre thème enfant si vous acceptez le couplage) :
<?php
// À placer dans wp-content/mu-plugins/bpcab-toggles.php par exemple.
add_filter('bpcab_snippet_enabled', function (bool $enabled, string $key): bool {
if ($key === 'force_lazy_loading') {
return false; // On coupe le snippet 8.
}
return $enabled;
}, 10, 2);
Variante 2 — Adapter la redirection admin pour renvoyer vers “Mon compte”
Si vous avez une page “Mon compte” (WooCommerce, membership, etc.), remplacez la destination :
<?php
// Dans le snippet 9, remplacez home_url('/') par :
wp_safe_redirect(home_url('/mon-compte/'));
exit;
Variante 3 — Mettre le CSS dans un vrai fichier (mieux si ça grossit)
Créez wp-content/plugins/snippets-essentiels/assets/micro-custom.css puis :
<?php
add_action('wp_enqueue_scripts', function () {
$handle = 'bpcab-micro-custom';
$url = plugin_dir_url(__FILE__) . 'assets/micro-custom.css';
wp_enqueue_style($handle, $url, [], '1.0.0');
}, 20);
Avantage : versionning facile, édition propre, compatible avec minification.
Compatibilité Divi 5 / Elementor / Avada
Les snippets ci-dessus sont “builder-agnostic” : ils ciblent WordPress (hooks, shortcodes, enqueue). C’est précisément ce que vous voulez quand vous utilisez Divi 5, Elementor ou Avada : éviter de dépendre d’un module propriétaire pour des besoins simples.
Divi 5
- Les shortcodes
[annee]et[site_name]fonctionnent dans un module Texte (ou dans le Theme Builder). - La classe
role-*dans<body>permet de cibler des styles dans Divi (Options du thème > CSS personnalisé) ou via le snippet CSS (7).
Elementor
- Les shortcodes fonctionnent via le widget “Shortcode” ou directement dans certains widgets texte selon votre configuration.
- Si Elementor charge ses propres CSS, le snippet 7 reste valide : il s’exécute via
wp_enqueue_scriptset se place dans la file de styles WordPress.
Avada
- Les shortcodes fonctionnent dans les éléments texte/Fusion Builder.
- La redirection admin (snippet 9) est indépendante d’Avada et évite des tickets “je tombe sur /wp-admin/ alors que je suis abonné”.
Vérifications après mise en place
- Extensions : le plugin “Snippets essentiels (site)” est activé.
- Front :
- Inspectez le code source : la meta generator n’apparaît plus.
- Ajoutez
[annee]dans un footer : l’année s’affiche. - Connecté en “abonné” : pas de barre admin (snippet 5).
- Admin :
- Outils > Santé rapide : la page s’affiche et le bouton “démo” fonctionne.
- Apparence/Extensions : l’éditeur de fichiers n’est plus accessible (selon votre configuration).
Tableau de diagnostic rapide
| Symptôme | Cause probable | Vérification | Solution |
|---|---|---|---|
| Écran blanc / erreur critique après activation | Erreur PHP (point-virgule, accolade), fichier encodé bizarrement | Consultez wp-content/debug.log (staging) ou logs serveur |
Désactivez le plugin via FTP, corrigez la ligne indiquée |
| Le shortcode affiche “[annee]” au lieu de l’année | Shortcodes désactivés dans l’éditeur/builder, ou plugin non actif | Testez dans un article standard, vérifiez Extensions | Activez le plugin, testez dans un bloc “Paragraphe” |
| Le CSS ne change rien | Cache (plugin/CDN), priorité CSS, thème/builder surcharge | Inspecteur navigateur (onglet Styles), purge cache | Videz cache, augmentez la spécificité CSS, passez en fichier CSS |
| Redirection admin bloque des actions (API/REST) | Site headless / plugins qui utilisent REST en admin | Regardez les requêtes réseau, testez éditeur bloc | Ajustez les exceptions (REST_REQUEST) ou la capacité |
Si ça ne marche pas
- Désactivez le plugin depuis l’admin. Si vous n’avez plus accès : renommez le dossier
snippets-essentielsvia FTP. - Activez le debug en staging :
- Dans
wp-config.php:define('WP_DEBUG', true);et log (voir doc officielle) - Doc : Debug WordPress
- Dans
- Vérifiez la version PHP : certains hébergeurs laissent des sites en 7.4/8.0. Ce code cible PHP 8.1+.
- Videz les caches :
- cache plugin (LiteSpeed/WP Rocket/etc.)
- cache serveur/CDN (Cloudflare)
- cache navigateur (Ctrl+F5)
- Isolez le snippet fautif : commentez un bloc à la fois (ou désactivez via le filtre
bpcab_snippet_enabled). - Conflits : si un plugin fait déjà la même chose (emails, lazy load), gardez une seule source de vérité.
Pièges et erreurs courantes
| Erreur | Cause | Solution |
|---|---|---|
| Coller le code dans le mauvais endroit (éditeur d’article, widget HTML) | Confusion entre PHP et contenu | Le PHP va dans un plugin / thème enfant. Jamais dans un bloc de contenu. |
Parse error: syntax error, unexpected ... |
Point-virgule oublié, accolade manquante | Relisez la ligne indiquée dans les logs. Un éditeur avec coloration (VS Code) aide énormément. |
| Utiliser un hook inadapté (trop tôt) | Exécuter du code avant que WordPress soit prêt | Pour retirer wp_generator : init suffit. Pour enqueue : wp_enqueue_scripts. |
| Confusion action vs filtre | Vous utilisez add_action sur un hook qui attend un retour |
Si vous devez retourner une valeur, c’est un filtre : add_filter. |
| CSS/JS non chargé | Mauvais hook, mauvais handle, cache | Chargez via wp_enqueue_scripts, vérifiez dans l’onglet Réseau, purgez le cache. |
| Snippet cassé par un plugin de snippets | Double exécution, ordre de chargement différent | Choisissez une seule méthode : soit plugin custom, soit plugin de snippets. Pas les deux pour la même chose. |
| Erreur après mise à jour PHP | Vieux snippet d’un tutoriel 2018 (fonctions dépréciées, code non typé) | Vérifiez la compatibilité PHP 8.1+. Réécrivez avec les APIs actuelles. |
| Redirection /wp-admin/ trop agressive | Bloque REST/AJAX nécessaires à l’éditeur ou à un plugin | Conservez les exceptions wp_doing_ajax(), REST_REQUEST, wp_doing_cron(). |
| “Ça ne change rien” | Cache CDN + cache plugin | Purge partout, test en navigation privée, vérifiez l’HTML généré. |
Conseils sécurité, performance et maintenance
- Préfixez vos fonctions : ici
bpcab_. Sans ça, vous finirez par entrer en collision avec un plugin. - Évitez les snippets “magiques” qui désactivent des fonctionnalités core à l’aveugle. Sur WP 6.9+, beaucoup d’optimisations sont déjà gérées (images, scripts, etc.).
- Nonces + capabilités : dès que vous ajoutez une action admin (bouton, formulaire), faites les deux. Doc nonce : Nonces.
- Échappement systématique à l’affichage. Doc : Escaping.
- Surveillance : gardez un changelog interne. Le jour où un snippet “mineur” casse un builder après mise à jour, vous serez content d’avoir un historique.
- Performance : ces snippets sont légers. Le vrai coût vient plutôt des plugins lourds, du tracking, et des images. Ne sur-optimisez pas au détriment de la lisibilité.
Ressources
- Hooks (actions & filtres) — Plugin API
- add_action() et add_filter()
- wp_enqueue_script() / wp_enqueue_style()
- Nonces (sécurité formulaires/admin)
- Sanitization et Escaping
- Répertoire officiel des plugins
- Code source WordPress (wordpress-develop) sur GitHub
- WordPress Core Trac (tickets & historique)
- PHP : déclarations de types (PHP.net)
FAQ
Est-ce que je dois vraiment éviter functions.php ?
Non. functions.php d’un thème enfant est acceptable. Mais si vos snippets ne dépendent pas du thème (emails, sécurité, shortcodes), un plugin custom est plus stable.
Pourquoi ne pas utiliser un plugin de snippets (type “Code Snippets”) ?
Ça marche, et c’est pratique. Mais j’ai souvent vu des sites où un plugin de snippets s’est retrouvé désactivé “par erreur”, et tout un ensemble de comportements a disparu. Un plugin custom versionné est plus prévisible. Si vous choisissez un plugin de snippets, centralisez tout dedans et documentez.
Ces snippets sont-ils compatibles WooCommerce ?
Oui, globalement. Attention surtout au snippet 9 (redirection admin) si WooCommerce ou un plugin membership s’appuie sur des endpoints admin/REST. Testez le back-office et les pages compte.
Je peux coller ces snippets dans Divi/Elementor (custom code) ?
Non pour le PHP. Les zones “Custom Code” des builders sont faites pour du HTML/CSS/JS, pas pour exécuter du PHP côté serveur.
Que faire si j’ai une “Erreur critique sur ce site” après activation ?
Désactivez le plugin via FTP (renommez le dossier), puis lisez les logs. 8 fois sur 10, c’est une erreur de syntaxe introduite au copier-coller.
Pourquoi mon CSS inline ne s’applique pas ?
Souvent : cache, ou CSS du thème/builder plus spécifique. Vérifiez dans l’inspecteur (quelle règle gagne), puis augmentez la spécificité ou passez à un fichier CSS chargé après.
Le snippet “retirer la version WP” améliore-t-il vraiment la sécurité ?
Ça réduit une fuite d’information, mais ça ne remplace pas les mises à jour, des mots de passe forts, un WAF, et des permissions propres. Traitez-le comme une petite couche, pas comme un bouclier.
Je veux ajouter un 11e snippet : comment m’organiser ?
Ajoutez un nouveau bloc commenté, avec une clé dans bpcab_snippet_is_enabled('ma_cle'). Gardez des noms de fonctions uniques et préfixés.
Faut-il régénérer les permaliens après ces changements ?
Pas pour ces snippets. On régénère surtout après création/modification de types de contenus (CPT) ou de réécritures d’URL. Si vous ajoutez des règles de rewrite plus tard, oui : Réglages > Permaliens > Enregistrer.
Est-ce que ça ralentit mon site ?
Non, l’impact est négligeable. Le seul snippet qui ajoute du “poids” est le CSS inline (quelques lignes). Le vrai risque performance vient plutôt des scripts tiers et des plugins lourds.