Snippet php para poner un bloque de comentarios personalizados para las entradas de WordPress

Snippet php para poner un bloque de comentarios personalizados para las entradas de WordPress.


Snippet php sistema personalizado de comentarios para WordPress:

function obtener_color_por_inicial($inicial) {
$colores = [
'A' => '#F44336', 'B' => '#E91E63', 'C' => '#9C27B0', 'D' => '#673AB7',
'E' => '#3F51B5', 'F' => '#2196F3', 'G' => '#03A9F4', 'H' => '#00BCD4',
'I' => '#009688', 'J' => '#4CAF50', 'K' => '#8BC34A', 'L' => '#CDDC39',
'M' => '#FFEB3B', 'N' => '#FFC107', 'O' => '#FF9800', 'P' => '#FF5722',
'Q' => '#795548', 'R' => '#9E9E9E', 'S' => '#607D8B', 'T' => '#FF4081',
'U' => '#B388FF', 'V' => '#8C9EFF', 'W' => '#80D8FF', 'X' => '#A7FFEB',
'Y' => '#CCFF90', 'Z' => '#FFAB91'
];

$inicial = strtoupper($inicial);
return $colores[$inicial] ?? '#cccccc';
}

function mostrar_comentarios_independientes($post_id) {
global $wpdb;

$current_user = wp_get_current_user();
$post_author_id = get_post_field('post_author', $post_id);

// Insertar comentario
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['comentario_submit'])) {
if (!empty($_POST['acepto_reglas'])) {
$nombre = sanitize_text_field($_POST['nombre']);
$comentario = sanitize_textarea_field($_POST['comentario']);

$wpdb->insert('wp_custom_comments', [
'post_id' => $post_id,
'author' => $nombre,
'content' => $comentario,
'parent_id' => 0,
'created_at' => current_time('mysql')
]);
}
}

// Insertar respuesta
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['respuesta_submit'])) {
if (is_user_logged_in() && ($current_user->ID == $post_author_id || in_array('administrator', $current_user->roles))) {
$nombre = sanitize_text_field($_POST['nombre_resp']);
$comentario = sanitize_textarea_field($_POST['comentario_resp']);
$parent_id = intval($_POST['parent_id']);

$wpdb->insert('wp_custom_comments', [
'post_id' => $post_id,
'author' => $nombre,
'content' => $comentario,
'parent_id' => $parent_id,
'created_at' => current_time('mysql')
]);
}
}

// Eliminar comentario
if (isset($_GET['eliminar_comentario'])) {
$comentario_id = intval($_GET['eliminar_comentario']);
$comentario = $wpdb->get_row($wpdb->prepare("SELECT * FROM wp_custom_comments WHERE id = %d", $comentario_id));

$puede_eliminar = false;

if (is_user_logged_in() && $comentario) {
if ($current_user->ID == $post_author_id || in_array('administrator', $current_user->roles)) {
$puede_eliminar = true;
} elseif ($comentario->author === $current_user->display_name) {
$puede_eliminar = true;
}
}

if ($puede_eliminar) {
$wpdb->delete('wp_custom_comments', ['id' => $comentario_id]);
}

wp_redirect(get_permalink($post_id));
exit;
}

// Mostrar comentarios
$comentarios = $wpdb->get_results($wpdb->prepare("
SELECT * FROM wp_custom_comments WHERE post_id = %d AND parent_id = 0 ORDER BY created_at DESC
", $post_id));

echo '<div style="background:#111; color:white; padding:20px; border-radius:10px;">';
echo '<h3>Comentarios:</h3>';

if ($comentarios) {
foreach ($comentarios as $comentario) {
$inicial = strtoupper(substr($comentario->author, 0, 1));
$color_avatar = obtener_color_por_inicial($inicial);

echo '<div style="margin-bottom:20px; padding:10px; border:1px solid white;">';
echo '<div style="display:flex; align-items:flex-start; gap:10px;">';
echo '<div style="min-width:40px; height:40px; border-radius:50%; background:' . esc_attr($color_avatar) . '; color:white; display:flex; align-items:center; justify-content:center; font-weight:bold;">' . esc_html($inicial) . '</div>';
echo '<div>';
echo '<strong>' . esc_html($comentario->author) . '</strong>';
echo '<p style="margin:5px 0;">' . esc_html($comentario->content) . '</p>';
echo '<small>' . esc_html($comentario->created_at) . '</small><br>';

// Opciones de eliminar y responder
$mostrar_eliminar = false;
if (is_user_logged_in()) {
if ($current_user->ID == $post_author_id || in_array('administrator', $current_user->roles)) {
$mostrar_eliminar = true;
} elseif ($comentario->author === $current_user->display_name) {
$mostrar_eliminar = true;
}
}

if ($mostrar_eliminar) {
echo '<a href="?eliminar_comentario=' . intval($comentario->id) . '" style="color:red;">Eliminar</a> | ';
}

if (is_user_logged_in() && ($current_user->ID == $post_author_id || in_array('administrator', $current_user->roles))) {
echo '<a href="#" class="responder" data-id="' . $comentario->id . '" style="color:#00ffcc;">Responder</a>';
}

echo '</div></div>'; // cierre flex padre y contenido

// Respuestas
$respuestas = $wpdb->get_results($wpdb->prepare("
SELECT * FROM wp_custom_comments WHERE post_id = %d AND parent_id = %d ORDER BY created_at ASC
", $post_id, $comentario->id));

foreach ($respuestas as $respuesta) {
$inicial_r = strtoupper(substr($respuesta->author, 0, 1));
$color_avatar_r = obtener_color_por_inicial($inicial_r);

echo '<div style="margin-left:20px; margin-top:10px; background:#222; padding:10px; border-radius:5px;">';
echo '<div style="display:flex; align-items:flex-start; gap:10px;">';
echo '<div style="min-width:30px; height:30px; border-radius:50%; background:' . esc_attr($color_avatar_r) . '; color:white; display:flex; align-items:center; justify-content:center; font-weight:bold;">' . esc_html($inicial_r) . '</div>';
echo '<div>';
echo '<strong style="background:#ADD8E6; color:black; padding:2px 6px; border-radius:4px;">' . esc_html($respuesta->author) . '</strong>';
echo '<p style="margin:5px 0;">' . esc_html($respuesta->content) . '</p>';
echo '<small>' . esc_html($respuesta->created_at) . '</small>';

if (is_user_logged_in() && ($current_user->ID == $post_author_id || in_array('administrator', $current_user->roles) || $respuesta->author === $current_user->display_name)) {
echo ' | <a href="?eliminar_comentario=' . intval($respuesta->id) . '" style="color:red;">Eliminar</a>';
}

echo '</div></div></div>'; // cierre flex y contenedor respuesta
}

// Formulario de respuesta
if (is_user_logged_in() && ($current_user->ID == $post_author_id || in_array('administrator', $current_user->roles))) {
echo '<div class="form-respuesta" id="respuesta-' . $comentario->id . '" style="display:none; margin-top:10px; margin-left:20px;">';
echo '<form method="post">';
echo '<input type="hidden" name="parent_id" value="' . $comentario->id . '">';
echo '<input type="text" name="nombre_resp" placeholder="Tu nombre" required><br>';
echo '<textarea name="comentario_resp" placeholder="Tu respuesta..." required></textarea><br>';
echo '<button type="submit" name="respuesta_submit">Responder</button>';
echo '</form></div>';
}

echo '</div>'; // cierre comentario padre
}
} else {
echo '<p>No hay comentarios aún.</p>';
}

echo '</div>';

// Formulario principal
echo '
<div style="background:#111; color:white; padding:20px; border-radius:10px; margin-top:20px;">
<h3>Dejar comentario:</h3>
<form method="post">
<input type="text" name="nombre" placeholder="Tu nombre" required style="width:100%; padding:10px;"><br>
<textarea name="comentario" placeholder="Escribe tu comentario..." required style="width:100%; padding:10px;"></textarea><br>
<label><input type="checkbox" name="acepto_reglas" id="acepto_reglas"> Acepto las reglas</label><br>
<button type="submit" name="comentario_submit" id="boton-comentar" disabled style="margin-top:10px;">Dejar comentario</button>
</form>
</div>';

// Script
echo '
<script>
document.querySelectorAll(".responder").forEach(btn => {
btn.addEventListener("click", e => {
e.preventDefault();
const id = btn.dataset.id;
const form = document.getElementById("respuesta-" + id);
form.style.display = form.style.display === "none" ? "block" : "none";
});
});

document.getElementById("acepto_reglas").addEventListener("change", function() {
document.getElementById("boton-comentar").disabled = !this.checked;
});
</script>';
}

add_action('the_content', 'incluir_comentarios_en_post');
function incluir_comentarios_en_post($content) {
if (is_single() && in_the_loop() && is_main_query()) {
ob_start();
mostrar_comentarios_independientes(get_the_ID());
$comentarios = ob_get_clean();
return $content . $comentarios;
}
return $content;
}

Explicación a fondo para que entiendas qué hace este código, dónde aplicarlo, y cómo usarlo correctamente en tu sitio WordPress.


✅ ¿Qué hace este código?

Este código es un sistema personalizado de comentarios para WordPress, con las siguientes características:

🔹 1. Comentarios personalizados (no usa el sistema nativo de WP):

  • Guarda los comentarios en una tabla personalizada llamada wp_custom_comments.
  • Se pueden dejar comentarios públicos sin iniciar sesión.
  • Se puede responder a un comentario (solo el autor del post o un administrador).
  • Elimina comentarios si el autor es el dueño del comentario o un admin.

🔹 2. Interfaz visual:

  • Cada comentario tiene un avatar circular basado en la primera letra del nombre del autor.
  • El color del avatar cambia según la letra.
  • Las respuestas se muestran indentadas y el nombre del autor de la respuesta tiene fondo azul claro y texto negro.
  • Hay un formulario para dejar un nuevo comentario, con validación para aceptar las reglas.

🔹 3. Estilos y comportamiento:

  • Todo está diseñado con estilos inline (directamente en HTML).
  • Usa un poco de JavaScript para mostrar u ocultar los formularios de respuesta.
  • No requiere CSS externo.

🛠️ ¿Qué necesita para funcionar?.

✔️ 1. Crear la tabla wp_custom_comments:

Este código usa una tabla personalizada para guardar los comentarios. Debes crear esta tabla manualmente en tu base de datos. Aquí tienes el SQL:

CREATE TABLE wp_custom_comments (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    post_id BIGINT UNSIGNED NOT NULL,
    author VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    parent_id BIGINT UNSIGNED DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Puedes ejecutar este código en phpMyAdmin o a través de un plugin como WP phpMyAdmin.

Asegúrate de que el prefijo (wp_) coincida con el de tu instalación de WordPress.


📌 ¿Dónde colocar este código?.

Tienes 2 opciones principales:

Opción 1: En tu archivo functions.php (tema hijo):

  1. Abre el archivo functions.php de tu tema hijo (nunca el tema padre).
  2. Pega todo el código PHP completo al final del archivo.

Opción 2: Usar un plugin de Code Snippets (más seguro):

  1. Instala y activa el plugin Code Snippets.
  2. Ve a Snippets → Añadir nuevo.
  3. Pon un nombre como: Comentarios Personalizados.
  4. Pega todo el código PHP completo en el campo de código.
  5. Elige “Ejecutar en el sitio completo” y guarda.

🧩 ¿Dónde se muestra?.

Este sistema solo aparece en los posts individuales, gracias a esta condición:

if (is_single() && in_the_loop() && is_main_query())

👉 Es decir:

  • No aparece en páginas estáticas.
  • No aparece en el blog ni archivos.
  • Solo aparece en entradas individuales (single post).

🛑 ¿Qué no hace este código?.

  • No reemplaza el sistema de comentarios nativo de WordPress, sino que lo complementa.
  • No protege contra spam automáticamente (no tiene CAPTCHA).
  • No envía notificaciones por correo cuando alguien responde.
  • No incluye paginación ni Ajax, todo se maneja vía recarga de página.

💬 ¿Qué es un “snippet” PHP?.

Un snippet PHP es un bloque de código que puedes insertar en WordPress para extender su funcionalidad, sin necesidad de crear un plugin completo.

👉 El plugin Code Snippets permite insertar estos fragmentos sin tocar archivos del tema.


📦 Resumen final:

CaracterísticaEstado
Tabla personalizada para comentarios✅ Requiere crearla en la base de datos
Sistema de comentarios independientes
Formulario de respuestas con roles✅ Solo autor del post o admin
Estilo visual con avatares y colores✅ Totalmente inline
Eliminar comentario✅ Si eres admin, autor del post o autor del comentario
Integración fácil✅ Vía functions.php o Code Snippets
Compatible con posts individuales

Páginas de mi sitio:


Servicios o productos disponibles:

Categorías de la tienda:


Entradas de blog:

100 entradas:

Otras 100:

Otras 100 entradas:

Otras 100 entradas:

Categorías de blog:


Deja un comentario