Interdire certains tags lors de la sauvegarde d’un article
Si vous avez des contributeurs et des auteurs, vous avez peut-être envie d’empêcher ces personnes d’ajouter certains mots-clés. Cette astuce va vous permettre de régler ce problème.
Copier le code ci-dessous dans le fichier functions.php
présent à la racine de votre thème :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
add_action('admin_init', 'baw_remove_bad_tags' );
function baw_remove_bad_tags() {
// est-on en train d'envoyer des tags ?
if( isset( $_POST['tax_input'], $_POST['tax_input']['post_tag'] ) ) {
// mots à interdire (casse non prise en compte)
$bad_tags = array( 'motinterdit', 'autre mot' );
// on filtre les tags envoyés
$_POST['tax_input']['post_tag'] = trim( str_ireplace( $bad_tags, '', $_POST['tax_input']['post_tag'] ), ',' );
}
}
[/pastacode]
Je n’utilise pas le hook save_post
car les tags seraient déjà enregistrés, donc des requêtes auraient été lancées pour la création de ces tags, puis je devrais alors en refaire pour les supprimer … Pas très optimisé tout ça.
Je préfère tapper plus haut dans les hooks avec admin_init
puis je vérifie si nous sommes en train d’envoyer des tags, alors je filtre le contenu de ces tags en supprimant ceux qui sont interdits.
BONUS : Créer un filtre de mauvais tags
Je vais ajouter un hook perso pour que des plugins (de votre création ?) puissent ajouter leurs propres mots, ou aussi pour permettre aux administrateurs d’avoir le droit d’ajouter ces mots interdits.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
add_action('admin_init', 'baw_remove_bad_tags' );
function baw_remove_bad_tags() {
// est-on en train d'envoyer des tags ?
if( isset( $_POST['tax_input'], $_POST['tax_input']['post_tag'] ) ) {
// mots à interdire (casse non prise en compte) + hook 'bad_tags'
$bad_tags = apply_filters( 'bad_tags', array( 'motinterdit', 'autre mot' ) );
// on filtre les tags envoyés
$_POST['tax_input']['post_tag'] = trim( str_ireplace( $bad_tags, '', $_POST['tax_input']['post_tag'] ), ',' );
}
}
[/pastacode]
J’insère un apply_filters()
avec le nom de nom choix (j’ai pris “bad_tags” arbitrairement).
L’exemple ci-dessous vous illustre comment on peut modifier le filtre bad_tags
pour ajouter des mots interdits :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
add_filter('bad_tags', 'baw_add_bad_tag' );
function baw_add_bad_tag( $bad_tags ) {
$bad_tags[] = 'nouveaumotinterdit';
$bad_tags[] = 'undeuxiemenouveaumotinterdit';
return $bad_tags;
}
[/pastacode]
Maintenant, on pousse l’exemple un peu plus loin afin que les admins puissent ajouter tous les tags et ainsi passer au travers de ce filtre :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
add_action('admin_init', 'baw_allow_admin_bad_tags' );
function baw_allow_admin_bad_tags( $bad_tags ) {
return current_user_can( 'administrator' ) ? array() : $bad_tags;
}
[/pastacode]
Il convient de vérifier que l’utilisateur courant a des droits d’admin. Si tel est le cas, il faut retourner un tableau vide et aucun tags ne sera interdit. A défaut, il est nécessaire de renvoyer les tags comme ils m’ont été donnés.
Bon codage, merci de m’avoir lu une fois de plus :)
6 Commentaires
J’ai comme une impression de déjà vu … ;)
Tu es source d’inspiration ! ;)
Hello !
Petit complément, ça peut servir à d’autres.
J’ai adapté le code pour l’appliquer aux catégories, ce qui donne ceci :
@Fabien : Il va falloir que je test cela. Merci pour le partage !
Excellent ! Merci, on va l’ajouter en astuce :p
Salut,
A partir de votre code, auriez-vous une idée sur le comment interdire toute création de tag aux contributeurs d’un site ?
J’aimerai obliger les contributeurs à utiliser les tag existants (et qu’ils arrêtent de créer n’importe quoi), mais les plugin de gestion des rôles ne permettent apparemment pas de limiter ce droit…
Merci !