Limitar el acceso a entradas/páginas por roles de usuario
Estoy buscando una manera de proteger el contenido según los roles de usuario.
Ejemplo:
hay que estar registrado para ver las entradas (frontend).
Si un usuario es suscriptor puede leer las entradas 1, 2 y 3, pero si el usuario es colaborador puede ver las entradas 1, 2, 3 y 4, 5, 6...
¿alguien sabe cómo puedo hacer esto?

puedes usar estas condiciones para mostrar publicaciones privadas solo a usuarios registrados con el rol contributor
. Ahora solo necesitas hacer la publicación private
para que esa publicación esté disponible para el colaborador.
<?php
if ( have_posts() ) : while ( have_posts() ) : the_post();
$private = get_post_custom_values("private");
if (isset($private[0]) && $private == "true") {
if ( current_user_can( 'contributor' ) ) { //pasar el rol puede no funcionar en algunos casos
the_title();
the_content();
} else { // texto para mostrar en lugar de la publicación
echo 'esta publicación es privada, solo los colaboradores pueden verla';
}
} else { // esto es visible para todos
the_title();
the_content();
}
endwhile;
endif;
?>

Aunque no lo he usado personalmente, probablemente estés buscando un plugin como este.
Parece que ofrece toda la funcionalidad que has solicitado anteriormente.

Acabo de probar este. No hace lo que necesito, pero casi... o... ¡demasiado complicado!

Acabo de instalar el plugin y es muy fácil configurar el acceso a ciertas publicaciones para los suscriptores y luego dar más acceso a los colaboradores.

sí, en el backend, pero necesito definir el acceso en el frontend. Quién puede o no puede leer publicaciones, definido por roles de usuario.

Sí, puedes hacer eso con el plugin (Ver captura de pantalla en http://s.wordpress.org/extend/plugins/advanced-access-manager/screenshot-4.jpg?r=580686)

Para lograr algo así puedes hacer que algunas publicaciones sean privadas y mostrarlas solo a usuarios registrados, primero necesitas agregar un campo personalizado, puedes nombrarlo "private" y darle el valor "True". Luego reemplaza el loop predeterminado de WP con este fragmento de código:
<?php if (have_posts()) : while (have_posts()) : the_post();
$private = get_post_custom_values("private");
if (isset($private[0]) && $private == "true") {
if (is_user_logged_in()) {
// Mostrar publicación privada a usuario registrado
}
} else {
// Mostrar publicación pública a todos
}
endwhile; endif; ?>
