¿Cómo muestro contenido específico para cada usuario?

11 abr 2011, 00:17:04
Vistas: 13.7K
Votos: 3

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?

1
Comentarios

¿cuál fue tu solución? Estoy buscando algo similar. En mi caso, detrás de un sitio web restringido, un usuario verificado debe usar un formulario multipágina que recolecta toda la información necesaria y después de que todos los datos han sido recolectados, la información es enviada al administrador

alex alex
9 sept 2014 07:50:11
Todas las respuestas a la pregunta 4
3

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í.

Imagen descriptiva del plugin

<?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;
}
?>
11 abr 2011 04:47:55
Comentarios

¡Esto es exactamente lo que estaba buscando! Solo quería darte las gracias, ¡eres un crack!

Cris Cris
30 dic 2011 12:47:42

@Bainternet Un usuario acaba de decir que tu plugin ya no funciona :)

kaiser kaiser
3 ene 2015 01:02:28

@kaiser ¿qué puedo decir??

Bainternet Bainternet
7 ene 2015 09:30:45
4

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);
11 abr 2011 00:42:12
Comentarios

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

hannit cohen hannit cohen
11 abr 2011 00:46:29

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

onetrickpony onetrickpony
11 abr 2011 00:48:52

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

hannit cohen hannit cohen
11 abr 2011 01:34:06

arroja algunas notificaciones con wp_debug, pero funciona. Lo estoy usando para controlar roles y capacidades

onetrickpony onetrickpony
11 abr 2011 03:14:25
0

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! :)

11 abr 2011 01:31:09
0

Primer enfoque:

  1. 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.
  2. Puedes permitir comentarios en esa Página/Publicación para que el estudiante pueda agregar sus consultas y respuestas.

Segundo enfoque:

  1. 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.
  2. 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.

30 jun 2016 08:42:40