Tout savoir sur WordPress
Tutoriel WordPress

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 :)

Cet article a été mis à jour il y a 4550 jours - Il n'est peut être plus à jour !

Article écrit par Julio P.

Fondateur de SecuPress, l’extension de sécurité WordPress, Julio Potier est un Expert WordPress, un Formateur Expérimenté et un Consultant en Sécurité Web.

Il aime partager ses compétences et ses réflexions sur WordPress, donnant des conférences partout dans le monde.

6 Commentaires

  1. Hello !
    Petit complément, ça peut servir à d’autres.
    J’ai adapté le code pour l’appliquer aux catégories, ce qui donne ceci :

    function remove_bad_cat()
    {
    	if(isset($_POST['post_category'])) { // est-on en train d'envoyer des categories ?
    		$bad_cats = array( "ID_Categorie_interdite_1", "ID_Categorie_interdite_2"); // categories à interdire
    		$_POST['post_category'] = array_diff($_POST['post_category'], $bad_cats);
    	}
    }
    add_action( 'admin_init', 'remove_bad_cat' );
    
  2. 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 !