Sitio web visible solo para usuarios registrados
¿Cómo puedo deshabilitar el acceso a usuarios no registrados? Si el usuario no ha iniciado sesión me gustaría redirigirlo a una página personalizada de registro/login. ¿Es posible hacer esto con el siguiente código ya que no quiero usar un plugin?
<?php
if ( is_user_logged_in() ) {
echo '¡Bienvenido, usuario registrado!';
} else {
echo '¡Bienvenido, visitante!';
}
?>
Gracias.

Escribe esto en un plugin:
add_action( 'template_redirect', 'auth_redirect' );
Como plugin en GitHub.
Esto forzará a todos los visitantes a iniciar sesión si no lo han hecho ya.
En algunos casos, esto solicita un inicio de sesión cada vez. Esto podría funcionar mejor:
is_admin() || add_action( 'template_redirect', function() {
if ( ! is_user_logged_in() )
auth_redirect();
});
Si deseas enviar un estado 404 en su lugar, puedes reemplazar el auth_redirect()
con:
wp_die( 'No.', 'No encontrado', [ 'response' => 404 ] );

Por defecto el visitante será redirigido a la página que intentó ver. Podrías escribir un envoltorio muy similar a auth_redirect()
y configurar $login_url
a una página específica.

Creo que puede ser aún más simple eliminando is_user_logged_in()
y dejando solo auth_redirect()
porque auth_redirect()
funciona de la siguiente manera: si el usuario está logueado no hace nada. Si el usuario no está logueado lo redirige a la página de inicio de sesión.

@cybnet Sin esa verificación adicional, a veces falla.

Si no deseas modificar tu código, podrías utilizar este plugin en su lugar: Restricted Site Access. Tiene una alta valoración y, en mi experiencia personal, funciona muy bien.
Limita el acceso a tu sitio solo a visitantes que hayan iniciado sesión o accedan desde un conjunto de direcciones IP específicas. Puedes enviar a los visitantes restringidos a la página de inicio de sesión, redirigirlos o mostrarles un mensaje o página. Una gran solución para Extranets, Intranets alojadas públicamente o sitios de desarrollo/pruebas paralelos.

Obtuve la respuesta, es fácil con CSS...
- El div principal (.lor1) significa el div común que comienza después del encabezado y termina antes del pie de página
- Añade una nueva clase (.lor1.kun) en el div principal cuando el usuario inicie sesión, esta clase principal tendrá display: block;
- Crea un nuevo HTML Ej. mostrar mensaje "inicia sesión primero" (.lor1.user_not_login)
AÑADE este código en header.php
<?php
if (!is_user_logged_in()) {
?>
<style>
.lor1{ display:none;}
.lor1.kun{ display: block;}
.lor1.user_not_login{ display: block;}
</style>
<?php } ?>

Añade esta función a tu archivo functions.php.
Cuando un usuario no esté conectado e intente acceder a la página de inicio (ID de página == 2), será redirigido a la página de login.
<?php
add_action('template_redirect','wpse64899_check_if_logged_in');
function wpse64899_check_if_logged_in()
{
$pageid = 2; // o el ID que desees
if(!is_user_logged_in() && is_page($pageid))
{
$url = add_query_arg(
'redirect_to',
get_permalink($pageid),
site_url('wp-login.php')
);
wp_redirect($url);
exit;
}
} ?>

Agrega este código en el archivo function.php de tu tema hijo o tema padre
add_action( 'template_redirect', 'redirect_to_specific_page' );
function redirect_to_specific_page() {
if ( is_page('home') && ! is_user_logged_in() ) {
wp_redirect( 'https://example.com/login', 301 );
exit;
}
}
Por favor reemplaza "home" con el slug de la página, es decir, esta es la página que no quieres que tus usuarios accedan sin iniciar sesión. También reemplaza esta URL "https://example.com/login" con la URL de destino a donde quieres redirigir a tus usuarios si no han iniciado sesión, es decir, esta URL debería dirigir a tu página de inicio de sesión o registro.
