// ============================================ // 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 .= '
'; $html .= '
'; $html .= '
' . $avatar_letter . '
'; $html .= '
'; $html .= '
' . htmlspecialchars($author_name) . '
'; $html .= '
' . $time_ago . '
'; $html .= '
'; $html .= '
'; $html .= '
' . nl2br(htmlspecialchars($comment['comment'])) . '
'; if (is_logged_in()) { $html .= '
'; $html .= '💬 Responder'; $html .= '
'; $html .= ''; } // Respuestas $replies = get_comments($content_type, $content_id, $comment['id']); if (!empty($replies)) { $html .= render_comments($replies, $content_type, $content_id, $depth + 1); } $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()]; } } Avistamiento OVNI en el Valle del Elqui - FakeGhost
?>
← Volver al blog
Ufología

Avistamiento OVNI en el Valle del Elqui

Autor: Administrador FakeGhost Fecha: 09/02/2026 Vistas: 6

Múltiples testigos reportan luces inexplicables realizando maniobras imposibles en los cielos del norte.

El Valle del Elqui, reconocido por sus cielos despejados y su energía especial, fue escenario de múltiples avistamientos de objetos voladores no identificados durante el último mes.

Testigos locales y turistas reportaron luces brillantes moviéndose en patrones imposibles para aeronaves convencionales. Los objetos realizaban giros cerrados a alta velocidad y cambios de dirección instantáneos que desafían las leyes de la física conocida.

Logramos capturar varias fotografías y videos que muestran claramente estos objetos luminosos. Expertos en aviación consultados confirmaron que los movimientos observados no corresponden a ningún tipo de avión, helicóptero o dron conocido.

El fenómeno OVNI en el Valle del Elqui no es nuevo. Los registros históricos muestran avistamientos desde la época precolombina, cuando los pueblos originarios ya hablaban de 'luces sagradas' en el cielo.
Tags: ovnis valle del elqui avistamientos