Te pasaré el código de mi sitio web con react, por partes, solo confirma que las recibiste.
Part 1:
## File: api/autenticar.php
```php
<?php
session_start();
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: http://localhost:3000'); // Ajusta según corresponda
header('Access-Control-Allow-Credentials: true');

require 'conexion.php';

$data = json_decode(file_get_contents('php://input'), true);

$nombre_usuario = trim($data['nombre_usuario']);
$contrasena = $data['contrasena'];

// Consulta preparada para obtener el usuario
$stmt = $conn->prepare("SELECT id, nombre_usuario, contrasena, email FROM usuarios WHERE nombre_usuario = ? OR email = ?");
$stmt->bind_param("ss", $nombre_usuario, $nombre_usuario);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
    $usuario = $result->fetch_assoc();
    if (password_verify($contrasena, $usuario['contrasena'])) {
        // Contraseña correcta
        // Establecer las variables de sesión
        $_SESSION['usuario_id'] = $usuario['id'];
        $_SESSION['nombre_usuario'] = $usuario['nombre_usuario'];
        $_SESSION['email'] = $usuario['email'];

        echo json_encode([
            'success' => true,
            'usuario' => [
                'id' => $usuario['id'],
                'nombre_usuario' => $usuario['nombre_usuario'],
                'email' => $usuario['email'],
            ]
        ]);
    } else {
        echo json_encode(['success' => false, 'message' => 'Contraseña incorrecta.']);
    }
} else {
    echo json_encode(['success' => false, 'message' => 'Usuario no encontrado.']);
}

$stmt->close();
$conn->close();
?>
```

## File: api/conexion.php
```php
<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: http://localhost:3000'); // Ajusta según el dominio de tu frontend
header('Access-Control-Allow-Credentials: true');

// Datos de conexión a la base de datos
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "tus_noticias";

// Crear conexión
$conn = new mysqli($servername, $username, $password, $dbname);

// Establecer el conjunto de caracteres a UTF-8
$conn->set_charset("utf8");

// Verificar la conexión
if ($conn->connect_error) {
    die("Conexión fallida: " . $conn->connect_error);
}
?>
```

## File: api/obtener_articulos.php
```php
<?php
// obtener_articulos.php
session_start();
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: http://localhost:3000'); // Ajusta según tu dominio
header('Access-Control-Allow-Credentials: true');

require 'conexion.php';

$id = intval($_GET['id']);

$stmt = $conn->prepare("SELECT * FROM articulos WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
    $articulo = $result->fetch_assoc();

    echo json_encode([
        'success' => true,
        'articulo' => [
            'id' => $articulo['id'],
            'titulo' => $articulo['titulo'],
            'contenido' => $articulo['contenido'],
            'fecha_publicacion' => $articulo['fecha_publicacion'],
            'autor' => $articulo['autor'],
            'imagen' => $articulo['imagen'],
        ]
    ]);
} else {
    echo json_encode(['success' => false, 'message' => 'Artículo no encontrado.']);
}

$stmt->close();
$conn->close();
?>
```

## File: api/obtener_comentarios.php
```php
<?php
// obtener_comentarios.php
session_start();
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: http://localhost:3000'); // Ajusta según el dominio de tu frontend
header('Access-Control-Allow-Credentials: true');

require 'conexion.php';

// Obtener el ID del artículo
$articulo_id = intval($_GET['articulo_id']);

// Obtener los comentarios del artículo
$stmt = $conn->prepare("SELECT c.id, c.contenido, c.usuario_id, c.parent_comment_id, u.nombre_usuario, c.fecha_publicacion FROM comentarios c JOIN usuarios u ON c.usuario_id = u.id WHERE c.articulo_id = ? ORDER BY c.fecha_publicacion ASC");
$stmt->bind_param("i", $articulo_id);
$stmt->execute();
$result = $stmt->get_result();

$comentarios = array();

while ($row = $result->fetch_assoc()) {
    $comentarios[] = [
        'id' => $row['id'],
        'contenido' => $row['contenido'],
        'usuario_id' => $row['usuario_id'],
        'parent_comment_id' => $row['parent_comment_id'],
        'usuario' => $row['nombre_usuario'],
        'fecha' => $row['fecha_publicacion'],
    ];
}

echo json_encode(['success' => true, 'comentarios' => $comentarios]);

$stmt->close();
$conn->close();
?>
```

## File: api/obtener_total_likes.php
```php
<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: http://localhost:3000'); // Ajusta según el dominio de tu frontend
header('Access-Control-Allow-Credentials: true');

require 'conexion.php';

$articulo_id = intval($_GET['articulo_id']);

// Obtener la cantidad total de "Me Gusta" para el artículo
$stmt = $conn->prepare("SELECT COUNT(*) as totalLikes FROM likes WHERE articulo_id = ?");
$stmt->bind_param("i", $articulo_id);
$stmt->execute();
$result = $stmt->get_result();
$totalLikes = $result->fetch_assoc()['totalLikes'];

echo json_encode(['success' => true, 'totalLikes' => $totalLikes]);

$stmt->close();
$conn->close();
?>
```

## File: api/procesar_comentarios.php
```php
<?php
session_start();
header('Access-Control-Allow-Origin: http://localhost:3000'); // Ajusta según el dominio de tu frontend
header('Access-Control-Allow-Credentials: true');

require 'conexion.php';

if (!isset($_SESSION['usuario_id'])) {
    echo json_encode(['success' => false, 'message' => 'Usuario no autenticado.']);
    exit();
}


// Obtener datos del formulario
$articulo_id = isset($_POST['articulo_id']) ? intval($_POST['articulo_id']) : 0;
$usuario_id = $_SESSION['usuario_id'];
$comentario = isset($_POST['comentario']) ? trim($_POST['comentario']) : '';
$parent_comment_id = isset($_POST['parent_comment_id']) ? intval($_POST['parent_comment_id']) : null;

if ($articulo_id <= 0 || $comentario === '') {
    echo json_encode(['success' => false, 'message' => 'Datos inválidos.']);
    exit();
}

// Validar el parent_comment_id
if ($parent_comment_id !== null) {
    // Verificar si el comentario padre existe y pertenece al mismo artículo
    $stmt = $conn->prepare("SELECT id FROM comentarios WHERE id = ? AND articulo_id = ?");
    $stmt->bind_param("ii", $parent_comment_id, $articulo_id);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows == 0) {
        echo json_encode(['success' => false, 'message' => 'El comentario al que intentas responder no existe.']);
        exit();
    }
    $stmt->close();
}

// Sanitizar el comentario para evitar ataques XSS
$comentario = htmlspecialchars($comentario, ENT_QUOTES, 'UTF-8');

// Insertar el comentario en la base de datos
$stmt = $conn->prepare("INSERT INTO comentarios (articulo_id, usuario_id, contenido, parent_comment_id) VALUES (?, ?, ?, ?)");
$stmt->bind_param("iisi", $articulo_id, $usuario_id, $comentario, $parent_comment_id);

if ($stmt->execute()) {
    echo json_encode(['success' => true]);
} else {
    echo json_encode(['success' => false, 'message' => 'Error al guardar el comentario: ' . $stmt->error]);
}

$stmt->close();
$conn->close();
?>
```

## File: api/procesar_like.php
```php
<?php
session_start();
header('Access-Control-Allow-Origin: http://localhost:3000'); // Ajusta según el dominio de tu frontend
header('Access-Control-Allow-Credentials: true');

require 'conexion.php';

if (password_verify($contrasena, $usuario['contrasena'])) {
    // Contraseña correcta
   
// Verificar si el usuario ha iniciado sesión
if (!isset($_SESSION['usuario_id'])) {
    echo json_encode(['success' => false, 'message' => 'Usuario no autenticado']);
    exit();
}

$articulo_id = intval($_POST['articulo_id']);
$usuario_id = $_SESSION['usuario_id'];

// Verificar si el usuario ya dio "Me Gusta" al artículo
$stmt = $conn->prepare("SELECT id FROM likes WHERE articulo_id = ? AND usuario_id = ?");
$stmt->bind_param("ii", $articulo_id, $usuario_id);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
    // Si ya dio "Me Gusta", eliminar el registro (quitar el "Me Gusta")
    $stmt = $conn->prepare("DELETE FROM likes WHERE articulo_id = ? AND usuario_id = ?");
    $stmt->bind_param("ii", $articulo_id, $usuario_id);
    $stmt->execute();
    $liked = false;
} else {
    // Si no ha dado "Me Gusta", insertarlo
    $stmt = $conn->prepare("INSERT INTO likes (articulo_id, usuario_id) VALUES (?, ?)");
    $stmt->bind_param("ii", $articulo_id, $usuario_id);
    $stmt->execute();
    $liked = true;
}

$stmt->close();
$conn->close();

echo json_encode(['success' => true, 'liked' => $liked]);
?>
```

## File: api/procesar_registro.php
```php
<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');

require 'conexion.php';

$data = json_decode(file_get_contents('php://input'), true);

$nombre_usuario = trim($data['nombre_usuario']);
$email = trim($data['email']);
$contrasena = $data['contrasena'];
$confirmar_contrasena = $data['confirmar_contrasena'];

if ($contrasena !== $confirmar_contrasena) {
    echo json_encode(['success' => false, 'message' => 'Las contraseñas no coinciden.']);
    exit();
}

$stmt = $conn->prepare("SELECT id FROM usuarios WHERE nombre_usuario = ? OR email = ?");
$stmt->bind_param("ss", $nombre_usuario, $email);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows > 0) {
    echo json_encode(['success' => false, 'message' => 'El nombre de usuario o correo electrónico ya están registrados.']);
    $stmt->close();
    exit();
}
$stmt->close();

$contrasena_hasheada = password_hash($contrasena, PASSWORD_DEFAULT);

$stmt = $conn->prepare("INSERT INTO usuarios (nombre_usuario, email, contrasena) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $nombre_usuario, $email, $contrasena_hasheada);

if ($stmt->execute()) {
    echo json_encode(['success' => true]);
} else {
    echo json_encode(['success' => false, 'message' => 'Error al registrar el usuario.']);
}

$stmt->close();
$conn->close();
?>
```

## File: api/verificar_like.php
```php
<?php
session_start();
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *'); // Habilitar CORS (ajustar en producción)

require 'conexion.php';

// Verificar si el usuario ha iniciado sesión
if (!isset($_SESSION['usuario_id'])) {
    echo json_encode(['success' => false, 'message' => 'Usuario no autenticado']);
    exit();
}

// Incluir la conexión a la base de datos
require 'conexion.php';

$articulo_id = intval($_GET['articulo_id']);
$usuario_id = $_SESSION['usuario_id'];

// Verificar si el usuario ya dio "Me Gusta" al artículo
$stmt = $conn->prepare("SELECT id FROM likes WHERE articulo_id = ? AND usuario_id = ?");
$stmt->bind_param("ii", $articulo_id, $usuario_id);
$stmt->execute();
$result = $stmt->get_result();

$liked = ($result->num_rows > 0);

$stmt->close();
$conn->close();

echo json_encode(['success' => true, 'liked' => $liked]);
?>
```

## File: frontend/react-app/public/index.html
```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <!-- public/index.html -->
    <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <!--
      manifest.json provides metadata used when your web app is installed on a
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>React App</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html>

```