Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

[SOLUCIONADO] crear un sistema de cursos con seguimiento del progreso

Estas en el tema de crear un sistema de cursos con seguimiento del progreso en el foro de WordPress en Foros del Web. Hola a todos! Estoy planeando un blog basado en cursos, cada categoria es un curso, y cada entrada es una leccion. Utilizo buddypress para que ...
  #1 (permalink)  
Antiguo 10/12/2013, 06:11
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
crear un sistema de cursos con seguimiento del progreso

Hola a todos!

Estoy planeando un blog basado en cursos, cada categoria es un curso, y cada entrada es una leccion. Utilizo buddypress para que los usuarios se puedan registrar y tener un perfil y actividad.

Ahora lo que busco es que estos usuarios registrados, puedan ver un seguimiento de lo que han echo, es decir, que lecciones (entradas) han leido ya.

Alguien sabe de algun plugin que me permita mostrarles a los usuarios que entradas han leido y cuales no? Ya he probado:

-Buddypress courseware - desactualizado y me da fallos
-Namaste LMS - solo se ven los cursos en el front end, aunque creo su api permitiria guardar la actividad de lo que han leido
-Eduhack
-teachpress

Todos estos me permiten crear cursos, pero el caso es que yo ya tengo creado mis post types con las lecciones, y solo neceito saber que lecciones a leido y cuales no cada usuario.

Por lo tanto, tambien podria programarlo yo misma, pero no se que estrategia seguir. He pensado en usar
Código PHP:
add_user_meta 
o crear una nueva columna en la base de datos de los usuarios registrados, que opinan? Cual seria la mejor forma de hacerlo?
  #2 (permalink)  
Antiguo 10/12/2013, 09:38
Avatar de AlejandroGalvez  
Fecha de Ingreso: noviembre-2013
Mensajes: 189
Antigüedad: 10 años, 5 meses
Puntos: 49
Respuesta: crear un sistema de cursos con seguimiento del progreso

Si lo vas a programar tú la mejor opción es utilizar los meta de usuario como tu misma comentas. No deberías alterar las tablas de la base de datos de WordPress bajo ninguna circunstancia, aunque si puedes crear tus propias tablas si lo deseas. Pero para almacenar un array de IDs te basta y sobra con los user meta. Tendría un aspecto parecido a:

Código PHP:
Ver original
  1. $cursos_leidos  = array(
  2.     '123',
  3.     '432',
  4.     '732'
  5. );
  #3 (permalink)  
Antiguo 10/12/2013, 10:09
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Gracias voy a intentar hacerlo con los meta tags , ya comentare haber que me sale
  #4 (permalink)  
Antiguo 12/12/2013, 05:30
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: crear un sistema de cursos con seguimiento del progreso

Finalmente he conseguido crear un array para cada usuario loggeado con los ids de cada post que han visitado.

Código PHP:
//get each user read posts
function fab_set_read_posts($postID) {
    
    if( 
is_single() || user_is_logged_in() ) {
        
        
$user wp_get_current_user();
        
$user_id  $user->ID;
        
        
$meta_key 'read_post';
    
        
$meta_value $postID;
        
        
$user_meta get_user_meta($user_id$meta_keytrue);
        
        
//if $user_meta exist update it, is not, add new user meta
        
if($user_meta){
            
            
// be sure $user_meta is an array
            
if( ! is_array$user_meta ) )
                
$user_meta = array();
            
            
//if $meta_value is not in the array, push it into the array and update $user_meta
            
if(in_array($meta_value$user_meta)) {
                echo 
"Ya has leído este tema.";
            } else {
                   
array_push($user_meta$meta_value);
                
update_user_meta$user_id$meta_key$user_metafalse );
            }
    
        }else{
    
            
add_user_meta$user_id$meta_key$meta_valuetrue );
            
        }
    }


Se añade este codigo al archivo funtions.php y se llama a la funcion en el single.php

Código PHP:
<php fab_set_read_posts($post->ID?> 
Cuando un usuario que esta loggeado visite una post, se guardara el id de dicho post en el array. Después se puede usar estos datos para cosas varias, en mi caso quiero comprobar si un post ha sido ya leido o no. Solo hay que recuperar el array usando get_user_meta() y comprobar si el id actual se encuentra en el array. En el este caso, el codigo va dentro de un loop, pero se puede usar fuera del loop siempre que le pasemos el id de un post.

Código PHP:
          $user wp_get_current_user();
                    
$user_id  $user->ID;
                    
$meta_key 'read_post';
                    
$meta_value $post->ID;
                    
                    
$user_meta get_user_meta($user_id$meta_keytrue);
                    
                    if(
$user_meta){
                        
                        
// be sure $user_meta is an array
                        
if( ! is_array$user_meta ) )
                            
$user_meta = array();
                        
                        
//if $meta_value is not in the array, push it into the array and update $user_meta
                        
if(in_array($meta_value$user_meta)) {
                            
$read "Leido";
                        } else {
                            
$read "Sin leer";
                        }
                
                    } 
Espero que le sea util a alguien!
  #5 (permalink)  
Antiguo 12/12/2013, 05:59
Avatar de AlejandroGalvez  
Fecha de Ingreso: noviembre-2013
Mensajes: 189
Antigüedad: 10 años, 5 meses
Puntos: 49
Respuesta: crear un sistema de cursos con seguimiento del progreso

¡Muchas gracias por compartir tu código! Si lo permites me gustaría optimizarlo un poco y arreglar un par de pequeños fallos que podrían causar problemas:

1- La función para guardar el nuevo post leído:
Código PHP:
//get each user read posts
function fab_set_read_posts$postID ) {
    
    
//Comprobamos que es single Y que el usuario esté logueado.
    
if( is_single() && user_is_logged_in() ) {
        
        
//Obtenemos directamente la ID del usuario conectado.
        
$user_id    get_current_user_id();        
        
$meta_key    'read_post';    
        
$meta_value $postID;
        
        
$user_meta    get_user_meta$user_id$meta_keytrue );
        
//Si no existía el meta de usuario, lo inicializamos como un array vacío
        
$user_meta    = ( $user_meta ) ? $user_meta : array();
        
        
//if $meta_value is not in the array, push it into the array and update $user_meta
        
if( in_array$meta_value$user_meta ) ) {
         
            echo 
"Ya has leído este tema.";
            
        } else {
            
            
$user_meta[]    = $meta_value;
            
update_user_meta$user_id$meta_key$user_meta );
            
        }
        
    }


2- El código para recuperar si ha leído el post actual o no:

Código PHP:
//Obtenemos directamente la ID del usuario conectado.
$user_id    get_current_user_id();     
$meta_key    'read_post';
$meta_value    $post->ID;

$user_meta    get_user_meta$user_id$meta_keytrue );
//Si no existía el meta de usuario, lo inicializamos como un array vacío
$user_meta    = ( $user_meta ) ? $user_meta : array();

if( 
in_array$meta_value$user_meta ) ) {
    
    
$read "Leido";

} else {
        
    
$read "Sin leer";
    

Como comentario adicional sugerir el uso de add_action() y do_action() para ejecutar la función que actualiza el meta de usuario. Sería más estándar si se va a incluir en un producto que se vaya a distribuir.

Un saludo.
  #6 (permalink)  
Antiguo 12/12/2013, 14:35
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: crear un sistema de cursos con seguimiento del progreso

Gracias Alejandro, por mejorar mi código. La verdad es que es para mi propia web, pero nunca esta de más hacer las cosas bien.

Etiquetas: blog, cursos, plugin, post, progreso, seguimiento, sistema
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:11.