¿Cómo requerir autorización / inicio de sesión para ver un conjunto específico de publicaciones / páginas?
Estoy trabajando en un sitio WordPress para un cliente que quiere una 'intranet' interna para sus empleados. Las necesidades básicas son:
- Comunicar cosas internamente
- Almacenar documentos importantes de la empresa
- Proporcionar acceso rápido a recursos para los empleados.
Esta información es sensible y solo para empleados. Les gustaría que cada empleado tuviera un nombre de usuario / contraseña y solo pudiera ver información y documentos una vez que hayan iniciado sesión.
Vi estos plugins, y algunos similares, pero parecen limitados y, por supuesto, están completamente desactualizados ahora:
- http://wordpress.org/extend/plugins/wp-require-auth/
- http://wordpress.org/extend/plugins/members-only/
Sé que puedo proteger con contraseña publicaciones / páginas individuales. ¿Puedo proteger con contraseña una categoría completa de publicaciones, o mejor aún, un tipo de publicación personalizado? Básicamente, necesito agrupar algunas páginas / publicaciones bajo un inicio de sesión. La información es sensible por lo que no puede estar disponible, por ejemplo, en el feed RSS. ¿Cómo puedo hacer esto?
- Opción 1 (menos deseable): tener toda la instalación de WordPress detrás de un muro de inicio de sesión
- Opción 2 (más deseable): tener solo las páginas / publicaciones internas detrás del muro de inicio de sesión
En resumen: me interesa la opción 1 si es MUCHO más fácil, pero preferiría la opción 2. Actualmente, después de investigar, solo encuentro plugins desactualizados que ayudan con esto, y no puedo encontrar una manera confiable de implementar ninguna de las dos opciones. ¡Gracias por tu ayuda!

Esto es solo una modificación de la respuesta de timshutes - si quieres que páginas específicas requieran inicio de sesión y no deseas colocarlas en un tipo de contenido personalizado, puedes agregar a functions.php:
add_shortcode('need_login', 'shortcode_needLogin');
function shortcode_needLogin() {
if (!is_user_logged_in()) {
auth_redirect();
}
}
Y luego en la parte superior de las páginas para las que deseas requerir inicio de sesión, simplemente puedes hacer:
[need_login]

Es posible colocar la verificación en las páginas de archivo correspondientes y en las páginas individuales.
Pero lo que definitivamente deberías hacer junto con todas las demás soluciones que tomes es usar el filtro the_posts
. Este filtra los posts que cualquier WP_Query recupera. Obtendrás un array de objetos de posts. Verifica la condición y elimina el objeto si está presente. Este es útil cuando todas las demás soluciones son eludidas. Es el último recurso si algún plugin desconocido recupera los posts sin que tengas idea de ello.
Otra cosa que deberías usar es el filtro pre_get_posts
para verificar las variables de consulta y modificarlas según sea necesario.
También está el filtro posts_where
, úsalo para agregar otra cláusula WHERE a la consulta de MySQL.
Esto no es completamente seguro pero debería cubrir la mayoría de los casos e incluso la mayoría de los plugins externos.
Si usas un tipo de post personalizado, se vuelve mucho más fácil. Puedes establecer capacidades personalizadas para ese post_type y luego asignar esas capacidades solo a usuarios de un rol particular.
Puedes pedirle a tu cliente que configure manualmente cada post como privado, pero puedes estar seguro de que lo olvidarán de vez en cuando. Si la seguridad es importante, es mejor no optar por eso.

Esto es antiguo, pero así es como finalmente resolví este problema.
- Creé un tipo de publicación personalizada para Páginas de Intranet.
- Añadí una función "force_login" en functions.php
- Incluí la función force_login al inicio de todos los archivos de plantillas de página necesarios.
Podrías personalizar esto para permitir solo ciertos usuarios - por ejemplo, usando el plugin "Members" que mencionó @jason.
El código:
En functions.php
/* Requerir Autenticación para Intranet */
function my_force_login() {
global $post;
if (!is_user_logged_in()) {
auth_redirect();
}
}
Al inicio de page-intranet.php y single-intranet-pages.php
<?php my_force_login(); ?>
Y... eso es todo. Está funcionando.
Notas sobre seguridad:
- No sé exactamente por qué, pero no creo que la seguridad de este método sea completamente infalible.
- Funciona para mi situación, pero investiga más si necesitas una seguridad a prueba de balas.
- Consulta la respuesta de @Mridul abajo para más información.
Si tienes un método simple para esto que sea más seguro, déjalo abajo y lo marcaré como la respuesta.

Puedes configurar la visibilidad del contenido como privado en páginas específicas, lo que requeriría que los visitantes tengan un inicio de sesión de WordPress Y niveles de permisos para ver el contenido. Lo que tal vez sugeriría es crear una plantilla template-intranet.php
para la página "Intranet" y agregar un menú personalizado para las páginas que forman parte de la intranet, de modo que puedan listarse en esa página. Aún tendrías que establecer el estado de todas las páginas como Privado.
Una solución alternativa para hacer que todas las páginas de la intranet sean privadas sería en el archivo functions.php
, donde puedes escribir una condición para verificar si la página actual es una subpágina de la página "Intranet". Si la página es una subpágina de la intranet, entonces verifica si el usuario ha iniciado sesión, y si no es así, redirígelo; de lo contrario, continúa.

Si deseas gestionar manualmente la autenticación e integrarla en la autenticación de WordPress, entonces @Rezen tiene la idea correcta. Sin embargo, yo preferiría simplemente usar una Plantilla de Página específica o una lista de Plantillas de Página para verificar la autenticación.
También puedes revisar el plugin "Members" de Justin Tadlock, que tiene mucha gestión de roles personalizados que podrías aprovechar, probablemente.

Filtros:
add_filter('template_include', 'theme_check_user_permissions', 1, 1);
add_filter('logout_url','theme_logout_redirect');
if(!current_user_can('edit_users')) add_filter( 'wp_die_handler', create_function('',"return 'theme_wp_die_handler';"));
Si el usuario no está registrado, redirigir a la página de inicio de sesión del sitio (guest.php, sin panel de control)
function theme_check_user_permissions($template)
{
return (is_user_logged_in() ? $template : TEMPLATEPATH.'/guest.php');
}
Después del inicio de sesión, redirigir a la página de inicio
function theme_logout_redirect($url, $redirect = null)
{
return $url.'&redirect_to='.urlencode(get_bloginfo('url'));
}
Eliminar la página wp die (redirigir a inicio)
function theme_wp_die_handler()
{
wp_redirect(get_bloginfo('url'),307);
exit;
}
