Vérifier l’accès à une page
Pour vérifier les droits d’accès à une page, le hook idéal est template_redirect
. Cette action est appelée juste avant que WordPress détermine quel modèle de page charger.
Il suffit donc d’intégrer une contrainte dans cet appel si l’accès à la page en cours d’affichage doit être protégé :
class Sukellos_Authorization_Manager {
/**
* Constructor
*/
public function __construct() {
// Filters the newsletter template before displaying or sending.
add_action( 'template_redirect', array( $this, 'action_template_redirect' ), 10 );
}
/**
* Used to verify authorizations
*/
public function action_template_redirect() {
// Get post name
global $post;
// List protected pages
$protected_pages = array(
'page-administrateur',
);
if ( !in_array( $post->post_name, $protected_pages ) ) {
return;
}
// Only admin can access
// Check if user has administrator role
$has_admin_role = false;
if ( is_user_logged_in() ) {
// Check role
$wp_user = get_currentuserinfo();
if ( in_array( 'administrator', (array)$wp_user->roles ) ) {
$has_admin_role = true;
}
}
if ( !$has_admin_role ) {
// Redirect to the home page
wp_safe_redirect( site_url() );
exit();
}
}
}
new Sukellos_Authorization_Manager();
Dans cet exemple, j’autorise uniquement aux administrateurs l’accès à la page dont le slug est page-administrateur
.
Si l’accès est refusé, l’internaute est redirigé vers la page d’accueil. J’ai volontairement utilisé wp_safe_redirect
au lieu de wp_redirect
afin que WordPress vérifie si la redirection est faite vers une URL appartenant au nom de domaine du site. L’appel à wp_safe_redirect
est suivi par exit();
de manière à stopper le script dans le cas où WordPress ignorerait l’entête Location:
lors de la redirection. Sans rentrer dans les détails, disons que cela est une bonne manière de faire afin d’éviter des erreurs de fonctionnement.