function contigo_nombre_curso($course_id) { global $wpdb; return $wpdb->get_var($wpdb->prepare(" SELECT post_title FROM {$wpdb->prefix}posts WHERE ID = %d AND post_type = 'course' ", $course_id)) ?: "Curso {$course_id}"; } function contigo_auditar_progreso_modular() { global $wpdb; $log = ""; $modulos = $wpdb->get_results(" SELECT user_id, meta_key, meta_value FROM {$wpdb->prefix}usermeta WHERE meta_key LIKE '_module_progress_%' "); $usuarios = []; foreach ($modulos as $modulo) { $user_id = $modulo->user_id; $meta_key = $modulo->meta_key; $valor = intval($modulo->meta_value); if (preg_match('/_module_progress_(\d+)_(\d+)/', $meta_key, $matches)) { $course_id = intval($matches[1]); $module_id = intval($matches[2]); $usuarios[$user_id][$course_id][$module_id] = $valor; } } foreach ($usuarios as $user_id => $cursos) { $log .= "👤 Usuario {$user_id}\n"; foreach ($cursos as $course_id => $modulos) { $nombre = contigo_nombre_curso($course_id); $log .= " 📘 {$nombre} (ID: {$course_id})\n"; $total = count($modulos); $suma = array_sum($modulos); $promedio = $total > 0 ? round($suma / $total) : 0; foreach ($modulos as $module_id => $valor) { $log .= " 🔹 Módulo {$module_id}: {$valor}%\n"; } $log .= " 📊 Promedio curso: {$promedio}%\n\n"; } } return $log ?: "No se encontraron registros de progreso.\n"; } function contigo_auditor_integridad_progreso() { global $wpdb; $log = ""; // Obtener todos los registros de progreso modular $modulos = $wpdb->get_results(" SELECT user_id, meta_key, meta_value FROM {$wpdb->prefix}usermeta WHERE meta_key LIKE '_module_progress_%' "); $usuarios = []; foreach ($modulos as $modulo) { $user_id = $modulo->user_id; $meta_key = $modulo->meta_key; $valor = intval($modulo->meta_value); if (preg_match('/_module_progress_(\d+)_(\d+)/', $meta_key, $matches)) { $course_id = intval($matches[1]); $module_id = intval($matches[2]); $usuarios[$user_id][$course_id][$module_id] = $valor; } } foreach ($usuarios as $user_id => $cursos) { $log .= "👤 Usuario {$user_id}\n"; foreach ($cursos as $course_id => $modulos) { $nombre = contigo_nombre_curso($course_id); $log .= " 📘 {$nombre} (ID: {$course_id})\n"; $total = count($modulos); $suma = array_sum($modulos); $promedio = $total > 0 ? round($suma / $total) : 0; $completos = array_filter($modulos, fn($v) => $v === 100); $incompletos = array_filter($modulos, fn($v) => $v < 100); foreach ($modulos as $module_id => $valor) { $estado = $valor === 100 ? "✅" : "❌"; $log .= " {$estado} Módulo {$module_id}: {$valor}%\n"; } if (count($incompletos) === 0) { // Verificar si falta actividad de curso $existe_curso = $wpdb->get_var($wpdb->prepare(" SELECT COUNT(*) FROM {$wpdb->prefix}sensei_user_activity WHERE user_id = %d AND post_id = %d AND activity_type = 'sensei_course_end' ", $user_id, $course_id)); if (!$existe_curso) { $log .= " ⚠️ Curso completado pero sin actividad registrada (sensei_course_end)\n\n"; } else { $log .= " 🎯 Curso completado correctamente (100%)\n\n"; } } else { $log .= " ⚠️ Curso incompleto — promedio: {$promedio}%\n\n"; } } } return $log ?: "No se encontraron registros de progreso.\n"; } https://forjacontigo.com/wp-sitemap-posts-post-1.xmlhttps://forjacontigo.com/wp-sitemap-posts-page-1.xmlhttps://forjacontigo.com/wp-sitemap-posts-course-1.xmlhttps://forjacontigo.com/wp-sitemap-posts-certificate-1.xmlhttps://forjacontigo.com/wp-sitemap-taxonomies-category-1.xmlhttps://forjacontigo.com/wp-sitemap-taxonomies-module-1.xml