Restreindre l’accès à l’administration mais avec accès a admin-post.php

Restreindre l’accès à l’administration mais avec accès a admin-post.php

Vous connaissez sans doute, ce hook afin de restreindre l’accès à l’administration seulement à certain rôle :

Simple

[pastacode lang= »php » message= »Restriction administration simple » highlight= » » provider= »manual »]

function restrict_admin(){

if ( !current_user_can('administrator') 
			&& !current_user_can('editor') 
	){
		wp_redirect( home_url('/') );
		exit();
	}
}
add_action('admin_init', 'restrict_admin', 1 ); 

[/pastacode]

Le problème que l’on risque de rencontré est le fait d’utiliser de l’ajax. Oui car la méthode WordPress nous fait passer par admin-ajax.php qui est un script en « admin ».
(Petite parenthèse; si vous souhaiter faire de l’ajax, je vous conseille cet article de boitaweb).

Avec Ajax

Nous devons donc identifier si l’accès est « Ajax » ou non, pour cela, le script définit une constante DOING_AJAX et nous permet donc de faire la part des choses :

[pastacode lang= »php » message= »Restriction administration avec Ajax » highlight= » » provider= »manual »]

function restrict_admin(){

if ( defined('DOING_AJAX') && DOING_AJAX {
			return;
}
if ( !current_user_can('administrator') 
			&& !current_user_can('editor') 
	){
		wp_redirect( home_url('/') );
		exit();
	}
}
add_action('admin_init', 'restrict_admin', 1 ); 

[/pastacode]

Et « Post » alors ? On l’oublie !

Nous allons encore compliquer les choses car sur mon projet actuel je souhaite que les abonnés ne puissent accéder à l’administration, qu’il puissent éxécuter mes scripts Ajax tranquillou, mais le comble, c’est qu’il y a un module de mise à jour du profil qui communique avec le script admin-post.php.

Alors comment faire ?

Une constante DOING_POST….ben non, dommage, elle s’appelle WP_ADMIN et c’est la même que pour accéder à l’administration.

Réfléchissons…?

Explorons le hook, admin_init est appelé sur chacun des scripts, donc si nous trouvons un hook qui ne soit pas appelé par admin-post.php ou admin-ajax.php, c’est gagné.

Conclusion

Après avoir parcouru les différents fichiers appelés lors de l’accès admin, j’ai trouvé un hook qui devrait nous satisfaire. Quelques lignes après le hook admin_init, WordPress charge le menu de la page avant de l’afficher et nous avons un hook : _admin_menu

[pastacode lang= »php » message= »Restreindre l’acces mais avec Ajax et Post » highlight= » » provider= »manual »]

function restrict_admin(){

if ( !current_user_can('administrator') 
			&& !current_user_can('editor') 
	){
		wp_redirect( home_url('/') );
		exit();
	}
}
add_action('admin_init', 'restrict_admin', 1 ); 

[/pastacode]

Si jamais vous trouvez une méthode plus simple ou plus propre, n’hésitez pas !


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *