En este artículo vamos a ver cómo podemos proteger nuestro sitio hecho con WordPress para que no sea visitado por nadie excepto usuarios logados.
Peticiones de este tipo me han llegado muchas veces, y la realidad es que luego hay muchos «y sis». Es decir, puede que hacer una web privada con WordPress tenga sus excepciones y/o diferentes casuísticas… los famosos corner cases.
Como habrás podido imaginar, seguro que hay multitud de plugins para hacer esta labor, pero es tan sencilla que creo no merecen la pena. Además, con apenas unas líneas de código tendrás el control sobre lo que quieres hacer.
Para proteger una web desarrollada con WordPress para usuarios no logados, lo que tenemos que hacer es en todas las peticiones comprobar si estamos logados. En caso afirmativo, dejaremos que continue la carga de la página y en caso contrario enviaremos al usuario al login.
Añade estas líneas al functions.php o a tu plugin de utilidades:
function site_private(): void
{
if (is_user_logged_in()) {
return;
}
if (in_array($GLOBALS['pagenow'], ['wp-login.php', 'wp-register.php'], true)) {
return;
}
wp_redirect(wp_login_url());
exit;
}
add_action('wp', 'site_private');
Como se puede apreciar, simplemente hacemos dos comprobaciones. Si el usuario está logado, cortamos la ejecución del método y por lo tanto no haremos la redirección a la página de login. Si estamos en la página de login o register, cortamos la ejecución del mismo modo porque de lo contrario entraríamos en bucle y provocaríamos el error de ERR_TOO_MANY_REDIRECTS.
Ahora llegan los «y sis». Y si queremos que todo el site sea privado menos la home, ya que nos gustaría mostrar algo, o poner un formulario de registro con pago para acceder a lo privado, etc… bien, bastaría con poner un «if» más al código anterior comprobando si estamos en la home con la función is_home():
function site_private(): void
{
if (is_user_logged_in()) {
return;
}
if (is_home()) {
return;
}
if (in_array($GLOBALS['pagenow'], ['wp-login.php', 'wp-register.php'], true)) {
return;
}
wp_redirect(wp_login_url());
exit;
}
add_action('wp', 'site_private');
Así con todos los «y sis» que se te ocurran: página de contacto, usuarios con rol concreto, determinados Custom Post Types, IPs específicas…