// ============================================
// SISTEMA DE LIKES Y REACCIONES
// ============================================
/**
* Obtener conteo de likes para un contenido
*/
function get_likes_count($content_type, $content_id) {
global $db;
$stmt = $db->prepare("SELECT COUNT(*) as count FROM likes WHERE content_type = ? AND content_id = ?");
$stmt->execute([$content_type, $content_id]);
$result = $stmt->fetch();
return $result['count'] ?? 0;
}
/**
* Verificar si el usuario actual ha dado like
*/
function user_has_liked($content_type, $content_id, $user_id) {
global $db;
$stmt = $db->prepare("SELECT id FROM likes WHERE content_type = ? AND content_id = ? AND user_id = ?");
$stmt->execute([$content_type, $content_id, $user_id]);
return $stmt->fetch() !== false;
}
/**
* Toggle like (agregar o quitar)
*/
function toggle_like($content_type, $content_id, $user_id) {
global $db;
try {
$db->beginTransaction();
// Verificar si ya existe
$stmt = $db->prepare("SELECT id FROM likes WHERE content_type = ? AND content_id = ? AND user_id = ?");
$stmt->execute([$content_type, $content_id, $user_id]);
$existing = $stmt->fetch();
if ($existing) {
// Eliminar like
$stmt = $db->prepare("DELETE FROM likes WHERE content_type = ? AND content_id = ? AND user_id = ?");
$stmt->execute([$content_type, $content_id, $user_id]);
$action = 'removed';
} else {
// Agregar like
$stmt = $db->prepare("INSERT INTO likes (content_type, content_id, user_id) VALUES (?, ?, ?)");
$stmt->execute([$content_type, $content_id, $user_id]);
$action = 'added';
}
// Actualizar contador en la tabla principal
$table_map = [
'blog_post' => 'blog_posts',
'investigation' => 'investigations',
'esoterism' => 'esoterism_content'
];
if (isset($table_map[$content_type])) {
$table = $table_map[$content_type];
$count = get_likes_count($content_type, $content_id);
$stmt = $db->prepare("UPDATE {$table} SET likes_count = ? WHERE id = ?");
$stmt->execute([$count, $content_id]);
}
$db->commit();
return ['success' => true, 'action' => $action, 'count' => get_likes_count($content_type, $content_id)];
} catch (Exception $e) {
$db->rollBack();
return ['success' => false, 'error' => $e->getMessage()];
}
}
// ============================================
// SISTEMA DE COMENTARIOS
// ============================================
/**
* Obtener comentarios de un contenido
*/
function get_comments($content_type, $content_id, $parent_id = null) {
global $db;
$sql = "SELECT c.*, u.username, u.first_name, u.last_name, u.profile_image
FROM comments c
INNER JOIN users u ON c.user_id = u.id
WHERE c.content_type = ? AND c.content_id = ? AND c.is_approved = 1";
if ($parent_id === null) {
$sql .= " AND c.parent_id IS NULL";
$params = [$content_type, $content_id];
} else {
$sql .= " AND c.parent_id = ?";
$params = [$content_type, $content_id, $parent_id];
}
$sql .= " ORDER BY c.created_at DESC";
$stmt = $db->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll();
}
/**
* Contar comentarios de un contenido
*/
function get_comments_count($content_type, $content_id) {
global $db;
$stmt = $db->prepare("SELECT COUNT(*) as count FROM comments WHERE content_type = ? AND content_id = ? AND is_approved = 1");
$stmt->execute([$content_type, $content_id]);
$result = $stmt->fetch();
return $result['count'] ?? 0;
}
/**
* Agregar comentario
*/
function add_comment($content_type, $content_id, $user_id, $comment, $parent_id = null) {
global $db;
try {
$db->beginTransaction();
// Insertar comentario
$stmt = $db->prepare("
INSERT INTO comments (content_type, content_id, user_id, comment, parent_id)
VALUES (?, ?, ?, ?, ?)
");
$stmt->execute([$content_type, $content_id, $user_id, $comment, $parent_id]);
// Actualizar contador
$table_map = [
'blog_post' => 'blog_posts',
'investigation' => 'investigations',
'esoterism' => 'esoterism_content'
];
if (isset($table_map[$content_type])) {
$table = $table_map[$content_type];
$count = get_comments_count($content_type, $content_id);
$stmt = $db->prepare("UPDATE {$table} SET comments_count = ? WHERE id = ?");
$stmt->execute([$count, $content_id]);
}
$db->commit();
return ['success' => true, 'message' => 'Comentario agregado exitosamente'];
} catch (Exception $e) {
$db->rollBack();
return ['success' => false, 'error' => $e->getMessage()];
}
}
/**
* Renderizar HTML de comentarios
*/
function render_comments($comments, $content_type, $content_id, $depth = 0) {
$html = '';
foreach ($comments as $comment) {
$author_name = !empty($comment['first_name'])
? $comment['first_name'] . ' ' . $comment['last_name']
: $comment['username'];
$avatar_letter = strtoupper(substr($author_name, 0, 1));
$time_ago = time_ago($comment['created_at']);
$html .= '
';
}
return $html;
}
/**
* Calcular tiempo transcurrido
*/
function time_ago($datetime) {
$timestamp = strtotime($datetime);
$diff = time() - $timestamp;
if ($diff < 60) {
return 'Hace un momento';
} elseif ($diff < 3600) {
$minutes = floor($diff / 60);
return "Hace {$minutes} minuto" . ($minutes > 1 ? 's' : '');
} elseif ($diff < 86400) {
$hours = floor($diff / 3600);
return "Hace {$hours} hora" . ($hours > 1 ? 's' : '');
} elseif ($diff < 604800) {
$days = floor($diff / 86400);
return "Hace {$days} día" . ($days > 1 ? 's' : '');
} else {
return date('d/m/Y', $timestamp);
}
}
// ============================================
// GALERÍA DE IMÁGENES
// ============================================
/**
* Obtener imágenes de galería de una investigación
*/
function get_investigation_gallery($investigation_id) {
global $db;
$stmt = $db->prepare("
SELECT ig.*, u.username
FROM investigation_gallery ig
LEFT JOIN users u ON ig.uploaded_by = u.id
WHERE ig.investigation_id = ?
ORDER BY ig.display_order ASC, ig.created_at ASC
");
$stmt->execute([$investigation_id]);
return $stmt->fetchAll();
}
/**
* Agregar imagen a galería
*/
function add_gallery_image($investigation_id, $image_path, $caption, $user_id, $display_order = 0) {
global $db;
try {
$stmt = $db->prepare("
INSERT INTO investigation_gallery (investigation_id, image_path, caption, uploaded_by, display_order)
VALUES (?, ?, ?, ?, ?)
");
$stmt->execute([$investigation_id, $image_path, $caption, $user_id, $display_order]);
return ['success' => true, 'message' => 'Imagen agregada a la galería'];
} catch (Exception $e) {
return ['success' => false, 'error' => $e->getMessage()];
}
}
Cementerio General: Voces en la Noche - FakeGhost
$status_colors = ['in_progress' => '#f39c12', 'completed' => '#27ae60'];
$status_labels = ['in_progress' => 'En Progreso', 'completed' => 'Completada'];
?>
← Volver a investigaciones
Warning : Undefined variable $status_labels in /var/www/test.fakeghost.cl/public_html/pages/investigacion-detalle.php on line 50
Warning : Trying to access array offset on value of type null in /var/www/test.fakeghost.cl/public_html/pages/investigacion-detalle.php on line 50
Cementerio General: Voces en la Noche
📍 Ubicación: Cementerio General, Santiago
📅 Fecha: 15/01/2026
👁️ Vistas: 6
Resumen
Investigación de fenómenos auditivos reportados por vigilantes nocturnos del Cementerio General de Santiago.
Detalles de la Investigación
El Cementerio General de Santiago es uno de los lugares más antiguos y emblemáticos de la capital. Durante años, los guardias de seguridad han reportado experiencias paranormales durante sus rondas nocturnas.
Nuestro equipo realizó tres sesiones de investigación durante las madrugadas de enero. Utilizamos grabadoras de audio de alta sensibilidad, detectores de campos electromagnéticos y cámaras con visión nocturna.
En la segunda noche, captamos lo que parece ser una voz femenina susurrando en español antiguo. El análisis de audio reveló que la voz no corresponde a ninguno de los miembros del equipo ni al personal de seguridad.
Además, registramos fluctuaciones electromagnéticas anómalas cerca de las tumbas más antiguas del cementerio, particularmente en la sección donde están enterradas víctimas de la Guerra Civil de 1891.