¿Cómo muestro contenido específico para cada usuario?
Tengo un sitio que muestra contenido solo a usuarios registrados. La mayor parte del contenido está disponible para todos los usuarios, pero algunos son específicos para cada usuario (es decir, todos los usuarios tienen esa página, pero cada uno ve su propio contenido que nadie más puede ver). ¿Alguna idea sobre cómo puedo restringir (y mostrar) contenido específico para cada usuario en particular?

Hace un tiempo codifiqué algo así y recuerdo que quería subirlo al repositorio de plugins pero nunca tuve tiempo. Básicamente, añade una meta caja a la pantalla de edición de entradas o páginas y permite al usuario seleccionar usuarios específicos por nombre o roles, luego verifica usando el filtro the_content
. Aquí lo tienes:
Actualización:
Acaba de ser aprobado en el repositorio de plugins de WordPress, así que puedes descargarlo Contenido específico para usuarios desde allí o desde tu panel de control y escribí un poco sobre ello aquí.
<?php
/*
Plugin Name: Contenido Específico para Usuarios
Plugin URI: http://en.bainternet.info
Description: Este plugin te permite seleccionar usuarios específicos por nombre o rol que pueden ver el contenido de una entrada o página específica.
Version: 0.1
Author: Bainternet
Author URI: http://en.bainternet.info
*/
/* Define la caja personalizada */
add_action('add_meta_boxes', 'User_specific_content_box');
/* Añade una caja a la columna principal en las pantallas de edición de tipos de contenido personalizados */
function User_specific_content_box() {
add_meta_box('User_specific_content', __( 'Caja de contenido específico para usuarios'),'User_specific_content_box_inner','post');
add_meta_box('User_specific_content', __( 'Caja de contenido específico para usuarios'),'User_specific_content_box_inner','post');
}
/* Imprime el contenido de la caja */
function User_specific_content_box_inner() {
global $post,$wp_roles;
$savedroles = get_post_meta($post->ID, 'U_S_C_roles',true);
//var_dump($savedroles);
$savedusers = get_post_meta($post->ID, 'U_S_C_users',true);
//var_dump($savedusers);
// Usa nonce para verificación
wp_nonce_field( plugin_basename(__FILE__), 'User_specific_content_box_inner' );
echo __('Selecciona los usuarios que pueden ver este contenido');
echo '<h4>'.__('Por Rol de Usuario:').'</h4>';
if ( !isset( $wp_roles ) )
$wp_roles = new WP_Roles();
foreach ( $wp_roles->role_names as $role => $name ) {
echo '<input type="checkbox" name="U_S_C_roles[]" value="'.$name.'"';
if (in_array($name,$savedroles)){
echo ' checked';
}
echo '>'.$name.' ';
}
echo '<h4>'.__('Por Nombre de Usuario:').'</h4>';
$blogusers = get_users('blog_id=1&orderby=nicename');
$usercount = 0;
foreach ($blogusers as $user) {
echo '<input type="checkbox" name="U_S_C_users[]" value="'.$user->ID.'"';
if (in_array($user->ID,$savedusers)){
echo ' checked';
}
echo '>'.$user->display_name.' ';
$usercount = $usercount + 1;
if ($usercount > 5){
echo '<br/>';
$usercount = 0;
}
}
echo '<h4>'.__('Mensaje de contenido bloqueado:').'</h4>';
echo '<textarea rows="3" cols="70" name="U_S_C_message" id="U_S_C_message">'.get_post_meta($post->ID, 'U_S_C_message',true).'</textarea><br/>'.__('Este mensaje se mostrará a cualquiera que no esté en la lista anterior.');
}
/* Guarda los datos de la Meta Caja */
add_action('save_post', 'User_specific_content_box_inner_save');
/* Cuando se guarda la entrada, guarda nuestros datos personalizados */
function User_specific_content_box_inner_save( $post_id ) {
global $post;
// verifica que esto venga de nuestra pantalla y con la autorización adecuada,
// porque save_post puede ser activado en otros momentos
if ( !wp_verify_nonce( $_POST['User_specific_content_box_inner'], plugin_basename(__FILE__) ) )
return $post_id;
// verifica si esto es una rutina de guardado automático.
// Si es así, nuestro formulario no ha sido enviado, así que no queremos hacer nada
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// OK, estamos autenticados: necesitamos encontrar y guardar los datos
$savedroles = get_post_meta($post_id, 'U_S_C_roles',true);
$savedusers = get_post_meta($post_id, 'U_S_C_users',true);
if (isset($_POST['U_S_C_roles']) && !empty($_POST['U_S_C_roles'] )){
foreach ($_POST['U_S_C_roles'] as $role){
$new_roles[] = $role;
}
update_post_meta($post_id, 'U_S_C_roles', $new_roles);
}else{
if (count($savedroles) > 0){
delete_post_meta($post_id, 'U_S_C_roles');
}
}
if (isset($_POST['U_S_C_users']) && !empty($_POST['U_S_C_users'])){
foreach ($_POST['U_S_C_users'] as $u){
$new_users[] = $u;
}
update_post_meta($post_id, 'U_S_C_users', $new_users);
}else{
if (count($savedusers) > 0){
delete_post_meta($post_id, 'U_S_C_users');
}
}
if (isset($_POST['U_S_C_message'])){
update_post_meta($post_id,'U_S_C_message', $_POST['U_S_C_message']);
}
}
add_filter('the_content','User_specific_content_filter');
function User_specific_content_filter($content){
global $post,$current_user;
$savedroles = get_post_meta($post->ID, 'U_S_C_roles',true);
$run_check = 0;
$savedusers = get_post_meta($post->ID, 'U_S_C_users',true);
if (!count($savedusers) > 0 && !count($savedroles) > 0 )
return $content;
if (isset($savedroles) && !empty($savedroles)){
foreach ($savedroles as $role){
if (current_user_can($role)) {
return $content;
exit;
}
}
//falló la verificación de rol
$run_check = 1;
}
if (isset($savedusers) && !empty($savedusers)){
get_currentuserinfo();
if (in_array($current_user->ID,$savedusers)){
return $content;
}
//fallaron ambas verificaciones
return get_post_meta($post->ID, 'U_S_C_message',true);
}
return $content;
}
?>

Asumiendo que este contenido es el típico bucle de publicaciones:
$current_user = wp_get_current_user();
if(get_the_author_meta('ID') === $current_user->ID):
// mostrar el contenido
endif;
Creo que esto solo funciona dentro del bucle.
Si lo necesitas fuera del bucle, simplemente consulta las publicaciones del $current_user->ID
:
$query = new WP_Query('author' => $current_user->ID);

el único problema aquí es que no es realmente intuitivo para el propietario del sitio establecer 'permisos' por publicación

entonces revisa el plugin "Members": http://justintadlock.com/archives/2009/09/17/members-wordpress-plugin es mucho más amigable para el usuario...

estaba pensando en este, solo que vi que no se actualiza desde hace un tiempo. ¿alguna idea si todavía funciona?

Además de lo que escribió One Trick Pony, si el propietario del sitio necesita la capacidad de restringir el contenido a cada usuario, puedes desarrollar un pequeño metabox personalizado que aparecerá dentro de cada publicación y mostrará casillas de verificación con los usuarios del sitio. Luego, tendrás en tu base de datos el post_meta necesario con los usuarios que tienen permiso para ver el contenido y podrás hacer la condición.
Si necesitas otra forma de controlar el contenido, es mejor que proporciones más detalles específicos sobre cómo debería manejarse y qué se necesita, para que sea más fácil pensar en soluciones apropiadas...
¡Buena suerte! :)

Primer enfoque:
- Un método para hacer esto es crear una página individual para cada estudiante y hacer que esta página esté protegida con contraseña. Esa contraseña se puede dar al estudiante.
- Puedes permitir comentarios en esa Página/Publicación para que el estudiante pueda agregar sus consultas y respuestas.
Segundo enfoque:
- Puedes usar WP Private Content Plus (https://wordpress.org/plugins/wp-private-content-plus/) y hacer que cada página/publicación sea visible solo para usuarios específicos.
- Puedes crear cualquier tipo de menú de usuario para el administrador.
También puedes usar el segundo enfoque junto con el primero para mayor seguridad, aunque es opcional.
