WordPress : récupérer les emails des utilisateurs et commentateurs

Voici plusieurs méthodes pour récupérer la liste des adresses email des utilisateurs et des commentateurs d’un site WordPress.

On peut le faire directement en SQL, avec WP-CLI, ou en exportant un fichier CSV. La meilleure méthode dépend de votre accès au serveur, du volume de données, du besoin exact, et du contexte dans lequel vous voulez utiliser ces emails.

Petite précision avant de commencer : une adresse email est une donnée personnelle. Techniquement, l’export est simple. Juridiquement, l’usage doit rester conforme au consentement donné par les personnes et à votre politique de confidentialité. Pour une newsletter ou de la prospection, on ne mélange pas “a commenté un article en 2014” avec “a demandé à recevoir mes emails marketing”. La CNIL rappelle que, pour les particuliers, la prospection par email nécessite en principe un consentement préalable, libre, spécifique, éclairé et univoque. CNIL : prospection commerciale par courrier électronique

Emails des membres WordPress

Dans WordPress, les utilisateurs enregistrés sont stockés dans la table wp_users si le préfixe de base de données est wp_. Cette table contient notamment la colonne user_email. La documentation du schéma de base WordPress liste bien wp_users comme table des utilisateurs. WordPress Codex : Database Description

La requête SQL la plus simple pour récupérer les emails des membres est :

SELECT DISTINCT user_email
FROM wp_users
WHERE user_email <> ''
ORDER BY user_email ASC;Langage du code : HTML, XML (xml)

La clause DISTINCT évite les doublons. Le GROUP BY n’est pas nécessaire ici, car on ne fait pas d’agrégation. DISTINCT suffit.

Si votre préfixe WordPress n’est pas wp_, adaptez le nom de table :

SELECT DISTINCT user_email
FROM monprefix_users
WHERE user_email <> ''
ORDER BY user_email ASC;Langage du code : HTML, XML (xml)

Emails des commentateurs

Les commentaires WordPress sont stockés dans la table wp_comments. L’adresse email du commentateur se trouve dans la colonne comment_author_email. WP-CLI expose d’ailleurs ce champ dans la commande wp comment list, ce qui confirme son usage courant côté WordPress. WP-CLI : wp comment list

Pour récupérer les emails des commentateurs en excluant le spam :

SELECT DISTINCT comment_author_email
FROM wp_comments
WHERE comment_author_email <> ''
AND comment_approved <> 'spam'
ORDER BY comment_author_email ASC;Langage du code : HTML, XML (xml)

Je préfère toutefois une version plus stricte : ne récupérer que les emails des commentaires approuvés.

SELECT DISTINCT comment_author_email
FROM wp_comments
WHERE comment_author_email <> ''
AND comment_approved = '1'
ORDER BY comment_author_email ASC;Langage du code : JavaScript (javascript)

Cette requête évite les commentaires en attente, spam, corbeille ou autres statuts non approuvés. Pour une liste propre, c’est généralement mieux.

Fusionner membres et commentateurs

Si vous voulez récupérer une seule liste dédupliquée contenant à la fois les utilisateurs enregistrés et les commentateurs approuvés, utilisez UNION.

SELECT email
FROM (
    SELECT user_email AS email
    FROM wp_users
    WHERE user_email <> ''

    UNION

    SELECT comment_author_email AS email
    FROM wp_comments
    WHERE comment_author_email <> ''
    AND comment_approved = '1'
) AS emails
ORDER BY email ASC;Langage du code : PHP (php)

UNION supprime les doublons par défaut. Si vous utilisez UNION ALL, les doublons seront conservés.

Exporter avec WP-CLI : utilisateurs

Si vous avez accès au serveur, WP-CLI est souvent plus confortable que SQL brut. La commande wp user list permet de lister les utilisateurs et propose notamment le champ user_email. WP-CLI : wp user list

Pour afficher les emails des utilisateurs :

wp user list --field=user_emailLangage du code : PHP (php)

Pour exporter les utilisateurs en CSV avec quelques champs utiles :

wp user list \
  --fields=ID,user_login,display_name,user_email,user_registered,roles \
  --format=csv > users-emails.csvLangage du code : PHP (php)

Pour récupérer uniquement les abonnés :

wp user list \
  --role=subscriber \
  --fields=ID,user_login,display_name,user_email,user_registered \
  --format=csv > subscribers-emails.csvLangage du code : PHP (php)

C’est plus lisible, plus réutilisable, et moins dépendant du préfixe de table que du SQL direct.

Kinsta: Premium Managed WordPress hosting

Exporter avec WP-CLI : commentateurs

WP-CLI permet aussi de lister les commentaires. Pour exporter les emails des commentaires approuvés :

wp comment list \
  --status=approve \
  --fields=comment_author,comment_author_email,comment_date \
  --format=csv > commenters-emails.csvLangage du code : PHP (php)

Si vous voulez uniquement les adresses email, dédupliquées et triées :

wp comment list \
  --status=approve \
  --field=comment_author_email \
  | grep -E '.+@.+' \
  | sort -fu > commenters-emails.txtLangage du code : PHP (php)

Le sort -fu trie la liste, supprime les doublons, et ignore la casse. Pratique pour éviter d’avoir Matt@example.com et matt@example.com deux fois.

Exporter membres et commentateurs en une seule liste avec WP-CLI

Voici une méthode simple pour fusionner les utilisateurs et les commentateurs approuvés :

{
  wp user list --field=user_email
  wp comment list --status=approve --field=comment_author_email
} | grep -E '.+@.+' | sort -fu > wordpress-emails.txtLangage du code : PHP (php)

Vous obtenez un fichier texte avec une adresse email par ligne :

wordpress-emails.txtLangage du code : CSS (css)

Pour un CSV très simple :

{
  echo "email"
  {
    wp user list --field=user_email
    wp comment list --status=approve --field=comment_author_email
  } | grep -E '.+@.+' | sort -fu
} > wordpress-emails.csvLangage du code : PHP (php)

Exporter avec wp db query

WP-CLI permet aussi d’exécuter directement une requête SQL avec wp db query.

Exporter les membres :

wp db query "
SELECT DISTINCT user_email
FROM wp_users
WHERE user_email <> ''
ORDER BY user_email ASC;
" --skip-column-names > members-emails.txtLangage du code : HTML, XML (xml)

Exporter les commentateurs approuvés :

wp db query "
SELECT DISTINCT comment_author_email
FROM wp_comments
WHERE comment_author_email <> ''
AND comment_approved = '1'
ORDER BY comment_author_email ASC;
" --skip-column-names > commenters-emails.txtLangage du code : HTML, XML (xml)

Exporter les deux listes fusionnées :

wp db query "
SELECT email
FROM (
    SELECT user_email AS email
    FROM wp_users
    WHERE user_email <> ''

    UNION

    SELECT comment_author_email AS email
    FROM wp_comments
    WHERE comment_author_email <> ''
    AND comment_approved = '1'
) AS emails
ORDER BY email ASC;
" --skip-column-names > wordpress-emails.txtLangage du code : HTML, XML (xml)

Ces exemples supposent que le préfixe est wp_. Si votre préfixe est différent, adaptez les noms de tables.

Gérer automatiquement le préfixe avec WP-CLI

Pour éviter de hardcoder wp_, vous pouvez récupérer le préfixe avec WP-CLI :

prefix=$(wp db prefix)Langage du code : JavaScript (javascript)

Puis utiliser ce préfixe dans une requête :

prefix=$(wp db prefix)

wp db query "
SELECT DISTINCT user_email
FROM ${prefix}users
WHERE user_email <> ''
ORDER BY user_email ASC;
" --skip-column-names > members-emails.txtLangage du code : HTML, XML (xml)

Et pour membres + commentateurs :

prefix=$(wp db prefix)

wp db query "
SELECT email
FROM (
    SELECT user_email AS email
    FROM ${prefix}users
    WHERE user_email <> ''

    UNION

    SELECT comment_author_email AS email
    FROM ${prefix}comments
    WHERE comment_author_email <> ''
    AND comment_approved = '1'
) AS emails
ORDER BY email ASC;
" --skip-column-names > wordpress-emails.txtLangage du code : HTML, XML (xml)

C’est plus robuste, surtout sur les installations dont le préfixe n’est pas standard.

Filtrer les emails invalides

En SQL, on peut faire un premier filtrage simple :

SELECT DISTINCT LOWER(TRIM(user_email)) AS email
FROM wp_users
WHERE user_email <> ''
AND user_email LIKE '%_@_%._%'
ORDER BY email ASC;Langage du code : PHP (php)

Ce n’est pas une validation parfaite d’adresse email, mais cela élimine déjà les valeurs vides ou manifestement incorrectes.

Pour une validation plus fiable, il vaut mieux passer par PHP et is_email(), la fonction WordPress dédiée à la validation d’une adresse email.

wp eval '
$emails = array();

foreach ( get_users( array( "fields" => array( "user_email" ) ) ) as $user ) {
    if ( is_email( $user->user_email ) ) {
        $emails[] = strtolower( trim( $user->user_email ) );
    }
}

$emails = array_unique( $emails );
sort( $emails );

echo implode( PHP_EOL, $emails );
' > valid-members-emails.txtLangage du code : PHP (php)

Cette méthode est plus WordPress-native, mais elle peut être moins adaptée aux très gros sites si vous chargez énormément d’utilisateurs d’un coup. À utiliser selon le volume.

Exporter uniquement les clients WooCommerce

Si le site utilise WooCommerce, les utilisateurs ayant le rôle customer peuvent être exportés avec WP-CLI :

wp user list \
  --role=customer \
  --fields=ID,display_name,user_email,user_registered \
  --format=csv > woocommerce-customers.csvLangage du code : PHP (php)

Attention : un rôle customer ne signifie pas forcément que la personne accepte une newsletter. Cela signifie seulement qu’elle possède un compte client WooCommerce.

Pour une vraie liste marketing WooCommerce, il vaut mieux s’appuyer sur l’outil qui gère le consentement : plugin newsletter, MailPoet, Mailchimp, Brevo, AutomateWoo, FluentCRM ou autre système d’opt-in.

Cas multisite WordPress

En multisite, les utilisateurs sont stockés dans une table globale, généralement wp_users. Les commentaires, eux, sont stockés dans les tables de chaque site : wp_2_comments, wp_3_comments, etc.

Pour cibler un site précis avec WP-CLI, utilisez --url :

wp user list --url=https://example.com --field=user_emailLangage du code : PHP (php)

Pour les commentateurs d’un sous-site :

wp comment list \
  --url=https://example.com \
  --status=approve \
  --field=comment_author_email \
  | grep -E '.+@.+' \
  | sort -fu > commenters-emails.txtLangage du code : PHP (php)

Sur un multisite, je déconseille de lancer une grosse requête SQL globale sans bien identifier les tables concernées. Le risque de sortir une liste incohérente est assez élevé.

Créer un petit script d’export réutilisable

Voici un script Bash simple qui exporte les emails des membres et commentateurs approuvés dans un fichier CSV.

#!/usr/bin/env bash

set -euo pipefail

output="wordpress-emails-$(date +%Y%m%d-%H%M%S).csv"

{
  echo "email"
  {
    wp user list --field=user_email
    wp comment list --status=approve --field=comment_author_email
  } | grep -E '.+@.+' | sort -fu
} > "$output"

printf 'Export terminé : %s\n' "$output"Langage du code : PHP (php)

Rendez-le exécutable :

chmod +x export-wordpress-emails.shLangage du code : JavaScript (javascript)

Lancez-le depuis la racine du site WordPress :

./export-wordpress-emails.shLangage du code : JavaScript (javascript)

Le fichier généré contiendra une adresse email par ligne, avec un en-tête CSV.

Version PHP dans un plugin ou mu-plugin

Si vous préférez rester dans WordPress, voici une fonction PHP qui récupère les emails des utilisateurs et des commentateurs approuvés, puis retourne une liste dédupliquée.

<?php
/**
 * Get unique email addresses from WordPress users and approved commenters.
 *
 * @return string[] List of unique lowercase email addresses.
 */
function sky_get_users_and_commenters_emails(): array {
	global $wpdb;

	$emails = array();

	$user_emails = $wpdb->get_col(
		"SELECT user_email
		FROM {$wpdb->users}
		WHERE user_email <> ''"
	);

	$commenter_emails = $wpdb->get_col(
		$wpdb->prepare(
			"SELECT comment_author_email
			FROM {$wpdb->comments}
			WHERE comment_author_email <> ''
			AND comment_approved = %s",
			'1'
		)
	);

	foreach ( array_merge( $user_emails, $commenter_emails ) as $email ) {
		$email = strtolower( trim( (string) $email ) );

		if ( is_email( $email ) ) {
			$emails[] = $email;
		}
	}

	$emails = array_values( array_unique( $emails ) );
	sort( $emails );

	return $emails;
}Langage du code : HTML, XML (xml)

Cette version utilise $wpdb->users et $wpdb->comments, donc elle respecte le préfixe de table WordPress. Elle valide aussi les emails avec is_email().

À ne pas exposer publiquement dans une page accessible à tous, évidemment. Un export d’emails doit rester réservé à un administrateur autorisé.

Ce qu’il ne faut pas faire

Évitez d’utiliser cette liste pour envoyer une newsletter à toutes les personnes qui ont simplement commenté un article. Un commentaire n’est pas un consentement à recevoir une campagne email.

Évitez aussi de mélanger :

  • les utilisateurs inscrits ;
  • les clients WooCommerce ;
  • les commentateurs ;
  • les abonnés newsletter ;
  • les prospects ;
  • les personnes ayant explicitement accepté la prospection.

Ces groupes peuvent se recouper, mais ils ne veulent pas dire la même chose. Pour une newsletter, exportez plutôt la liste depuis l’outil qui a recueilli l’inscription et le consentement.

La CNIL rappelle que la publicité par courrier électronique auprès de particuliers est possible à condition que les personnes aient explicitement donné leur consentement avant d’être démarchées. CNIL : consentement et prospection par email

Mémo rapide

-- Emails des membres.
SELECT DISTINCT user_email
FROM wp_users
WHERE user_email <> ''
ORDER BY user_email ASC;

-- Emails des commentateurs approuvés.
SELECT DISTINCT comment_author_email
FROM wp_comments
WHERE comment_author_email <> ''
AND comment_approved = '1'
ORDER BY comment_author_email ASC;

-- Membres + commentateurs approuvés.
SELECT email
FROM (
    SELECT user_email AS email
    FROM wp_users
    WHERE user_email <> ''

    UNION

    SELECT comment_author_email AS email
    FROM wp_comments
    WHERE comment_author_email <> ''
    AND comment_approved = '1'
) AS emails
ORDER BY email ASC;

# WP-CLI : utilisateurs.
wp user list --field=user_email

# WP-CLI : utilisateurs en CSV.
wp user list \
  --fields=ID,user_login,display_name,user_email,user_registered,roles \
  --format=csv > users-emails.csv

# WP-CLI : commentateurs approuvés.
wp comment list \
  --status=approve \
  --field=comment_author_email \
  | grep -E '.+@.+' \
  | sort -fu > commenters-emails.txt

# WP-CLI : fusion utilisateurs + commentateurs.
{
  wp user list --field=user_email
  wp comment list --status=approve --field=comment_author_email
} | grep -E '.+@.+' | sort -fu > wordpress-emails.txtLangage du code : PHP (php)

Conclusion

Pour récupérer les emails des membres WordPress, la requête SQL la plus directe consiste à lire la colonne user_email de la table wp_users.

Pour les commentateurs, il faut lire comment_author_email dans wp_comments, idéalement en ne conservant que les commentaires approuvés avec comment_approved = '1'.

Pour un export propre, WP-CLI est souvent plus pratique que SQL brut :

wp user list --field=user_email
wp comment list --status=approve --field=comment_author_emailLangage du code : PHP (php)

Enfin, gardez une séparation nette entre export technique et usage marketing. Récupérer une adresse email dans WordPress ne signifie pas que vous pouvez l’utiliser pour n’importe quel envoi. Le SQL est permissif ; le RGPD, beaucoup moins. Et contrairement à MySQL, il répond rarement avec un simple warning.

Demandez à l'IA son opinion
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

Opinions