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 !