La boucle de WordPress inclut par défaut les contenus protégés par mot de passe. Pour des raisons de confidentialité, il peut être nécessaire de masquer ces contenus en filtrant au préalable la boucle via le hook pre_get_posts. Ce dernier est appelé avant que la requête ne soit exécutée nous permettant ainsi de l'altérer en lui passant de nouveaux arguments.

Nous allons donc créer une nouvelle fonction que vous pourrez coller dans le fichier functions.php de votre thème. Le fait de placer ce bout de code directement dans le thème prend ici tout son sens étant donné que nous modifions l’affichage des boucles.

On commence par vérifier que nous ne sommes pas dans le back-office de WordPress et que nous modifions bien la boucle principale. Ensuite, on définit un nouvel argument has_password que l’on passera sur false. Les contenus avec mot de passe seront donc automatiquement exclus de toutes les boucles.

Si vous faites des requêtes Ajax, n’oubliez pas d’indiquer à nouveau ce paramètre dans vos requêtes personnalisées.

function wpc_exclude_protected_posts($query) {
	if (! is_admin() && $query->is_main_query()) {
		$query->set('has_password', false);
	}
}
add_action('pre_get_posts', 'wpc_exclude_protected_posts');

Pour en savoir plus sur pre_get_posts, je vous recommande l’excellent billet de Rémi Corson.

Peu usité, les contenus protégés par mot de passe n’en reste pas moins un cas possible qu’il nous faut traiter pour éviter qu’une information sensible ne soit révélée au public comme le titre ou l’extrait d’un article.