Como reordenar campos del formulario de comentarios con filtros en PHP en WordPress

Contents

Introducción

En este artículo se explica, con detalle y ejemplos prácticos, cómo reordenar los campos del formulario de comentarios en WordPress utilizando filtros en PHP. Cubriremos los filtros más relevantes, diferencias entre versiones de WordPress, ejemplos de código para mover el área de comentario arriba o abajo, cómo añadir campos personalizados y cómo validar y guardar esos campos. Todos los fragmentos de código están listos para pegar en el archivo functions.php de tu tema hijo o en un plugin personalizado.

Conceptos clave

  • comment_form_fields: filtro (desde WP 4.4) que permite modificar el array completo de campos del formulario de comentarios, incluyendo el campo de comentario (comment). Es ideal para reordenar.
  • comment_form_default_fields: filtro que devuelve los campos por defecto (author, email, url, cookies). Se emplea para modificar o añadir a esos campos antes de que se rendericen.
  • Prioridad de filtros: algunos temas y plugins pueden alterar los campos si tu reordenación no se aplica, aumenta la prioridad del filtro (valor más alto ejecuta la función después).
  • Escaping y localización: usa funciones de traducción como __() o esc_html__() y escaping (esc_attr, esc_html) en los valores que renderices para seguridad.
  • Validación y guardado: para campos personalizados, debes validar durante la preprocesación (preprocess_comment) o en comment_post y guardarlos como meta del comentario.

Situación habitual y objetivo

Por defecto, WordPress renderiza los campos de autor, correo y URL antes del área de comentario. Muchas veces se desea mover el área de comentario al principio (para fomentar respuestas rápidas) o reorganizar el orden de nombre/email/url. A continuación se muestran varios enfoques y ejemplos.

1) Reordenar campos: mover el textarea de comentario al principio

Este es el ejemplo más común: colocar el campo de texto del comentario antes de los demás campos. Funciona con el filtro comment_form_fields.

lt?php
// Mover el textarea comment al principio de los campos
add_filter( comment_form_fields, mi_reordenar_campos_comentario , 20 )
function mi_reordenar_campos_comentario( fields ) {
    if ( isset( fields[comment] ) ) {
        comment_field = fields[comment]
        unset( fields[comment] )
        // Prepend the comment field
        new_fields = array( comment =gt comment_field )
        // Merge el resto respetando sus claves
        new_fields = array_merge( new_fields, fields )
        return new_fields
    }
    return fields
}
?gt

Explicación rápida: se extrae el campo comment, se elimina de la matriz original y se inserta al principio creando un nuevo array y mezclándolo con los restantes.

2) Reordenar de forma explícita según una lista de orden

Si quieres un orden fijo y robusto (por ejemplo: comment, author, email, url, cookies), usa una lista con el orden deseado. Esto evita dependencias del orden original del tema o plugins.

lt?php
add_filter( comment_form_fields, mi_orden_personalizado_campos, 20 )
function mi_orden_personalizado_campos( fields ) {
    // Define el orden deseado (las claves posibles)
    order = array( comment, author, email, url, cookies )
    new_fields = array()

    foreach ( order as key ) {
        if ( isset( fields[ key ] ) ) {
            new_fields[ key ] = fields[ key ]
            unset( fields[ key ] )
        }
    }
    // Si quedan campos no previstos, los añadimos al final
    if ( ! empty( fields ) ) {
        foreach ( fields as key =gt value ) {
            new_fields[ key ] = value
        }
    }
    return new_fields
}
?gt

3) Añadir un campo personalizado y colocarlo donde quieras

Supongamos que quieres añadir un campo teléfono al formulario y colocarlo después del nombre (author). Primero añadimos el campo con comment_form_default_fields o directamente en comment_form_fields, y luego lo posicionamos.

lt?php
// 1) Agregar el campo phone a los default fields
add_filter( comment_form_default_fields, mi_agregar_campo_telefono )
function mi_agregar_campo_telefono( fields ) {
    fields[phone] = ltp class=comment-form-phonegtltlabel for=phonegt . esc_html__( Teléfono, text-domain ) . lt/labelgt .
        ltinput id=phone name=phone type=text value= /gtlt/pgt
    return fields
}

// 2) Reordenar para que phone esté detrás de author
add_filter( comment_form_fields, mi_posicionar_telefono, 20 )
function mi_posicionar_telefono( fields ) {
    order = array( comment, author, phone, email, url, cookies )
    new = array()
    foreach ( order as k ) {
        if ( isset( fields[ k ] ) ) {
            new[ k ] = fields[ k ]
            unset( fields[ k ] )
        }
    }
    if ( ! empty( fields ) ) {
        foreach ( fields as k =gt v ) {
            new[ k ] = v
        }
    }
    return new
}

// 3) Validar y guardar phone cuando se publique el comentario
add_action( comment_post, mi_guardar_telefono_comentario, 10, 3 )
function mi_guardar_telefono_comentario( comment_ID, comment_approved, commentdata ) {
    if ( isset( _POST[phone] ) ) {
        phone = sanitize_text_field( wp_unslash( _POST[phone] ) )
        if (  !== phone ) {
            add_comment_meta( comment_ID, phone, phone, true )
        }
    }
}
?gt

Notas importantes: valida y sanitiza siempre datos provenientes de _POST. En el ejemplo se usa sanitize_text_field y wp_unslash para seguridad.

4) Validación previa (evitar comentarios sin el nuevo campo si es obligatorio)

Si el campo personalizado es obligatorio, valida antes de insertar el comentario usando el filtro preprocess_comment y devuelve un WP_Error en caso de fallo.

lt?php
add_filter( preprocess_comment, mi_validar_campo_telefono, 10 )
function mi_validar_campo_telefono( commentdata ) {
    if ( isset( _POST[phone] ) ) {
        phone = trim( wp_unslash( _POST[phone] ) )
        if ( empty( phone ) ) {
            wp_die( esc_html__( Por favor, añade tu teléfono., text-domain ) )
        }
        // Validación adicional: solo dígitos y signos   - espacios
        if ( ! preg_match( /^[0-9 -s] /, phone ) ) {
            wp_die( esc_html__( Número de teléfono inválido., text-domain ) )
        }
    }
    return commentdata
}
?gt

5) Orden dinámico según configuración o admin

Puedes permitir que el orden se configure desde el Customizer o desde una opción en la base de datos. La técnica es la misma: obtener la opción, construir la matriz de orden y aplicar la reordenación como se mostró arriba.

Consideraciones de compatibilidad y mejores prácticas

  • Compatibilidad de versiones: Antes de WP 4.4 el campo comment no siempre estaba disponible en la matriz que devuelve comment_form_fields si trabajas con versiones antiguas, utiliza comment_form_default_fields y modifica comment_field por separado.
  • Prioridades: Si un plugin modifica campos con prioridad 10, usa 20 o 999 para asegurarte de que tu reordenación se aplique después.
  • Accesibilidad: Respeta etiquetas ltlabelgt, atributos aria-required y tabindex cuando personalices campos.
  • Traducción: Usa funciones __(), _e(), esc_html__() y text-domain de tu tema o plugin.
  • Sanitización: Sanitiza todo antes de guardar (sanitize_text_field, sanitize_email, esc_url_raw según el tipo).
  • Seguridad: Evita salida sin escapar usa esc_attr() y esc_html() al imprimir valores procedentes de la base de datos o de POST.

Ejemplo avanzado: reordenar respetando campos añadidos por plugins

Un método robusto para reordenar consiste en definir un orden preferido e insertar cualquier campo desconocido al final, tal como mostramos antes. Si quieres que tu reordenación tenga la última palabra incluso cuando otros filtros actúen más tarde, puedes engancharte con una prioridad alta y usar remove_filter si conoces la función que provoca el conflicto.

lt?php
// Reordenación definitiva con prioridad muy alta
add_filter( comment_form_fields, mi_reorden_final, 999 )
function mi_reorden_final( fields ) {
    preferred = array( comment, author, email, phone, url, cookies )
    result = array()

    foreach ( preferred as k ) {
        if ( isset( fields[ k ] ) ) {
            result[ k ] = fields[ k ]
            unset( fields[ k ] )
        }
    }
    // Adjuntar cualquier campo restante (plugins o temas)
    foreach ( fields as k =gt v ) {
        result[ k ] = v
    }
    return result
}
?gt

Depuración y pruebas

  1. Activa WP_DEBUG durante la implementación para detectar errores PHP.
  2. Prueba en distintos navegadores y dispositivos para comprobar que la interfaz es usable.
  3. Desactiva temporalmente plugins de comentarios (si hay) para ver si son ellos los que alteran el orden.
  4. Revisa la base de datos (wp_commentmeta) para verificar que los metadatos se guardan correctamente cuando añades campos personalizados.

Resumen y buenas prácticas

  • Usa comment_form_fields para reordenar fácilmente e incluir el campo comment.
  • Si solo modificas los campos por defecto (author, email, url), comment_form_default_fields también es válido.
  • Asegura prioridad adecuada en tu add_filter para que tu reordenación no sea sobrescrita.
  • Valida y guarda correctamente cualquier campo personalizado y recuerda sanitizar y escapar los datos.
  • Mantén la accesibilidad (labels, atributos required) y la internacionalización (funciones de traducción).

Ejemplos rápidos de referencia

Resumen de los fragmentos más útiles: mover comentario al principio, ordenar explícitamente y añadir/guardar un campo phone.

Mover comment arriba

lt?php
add_filter( comment_form_fields, function( fields ) {
    if ( isset( fields[comment] ) ) {
        comment = fields[comment]
        unset( fields[comment] )
        return array_merge( array( comment =gt comment ), fields )
    }
    return fields
}, 20 )
?gt

Orden explícito

lt?php
add_filter( comment_form_fields, orden_explicito, 20 )
function orden_explicito( fields ) {
    order = array( comment, author, email, url, cookies )
    new = array()
    foreach ( order as k ) {
        if ( isset( fields[ k ] ) ) {
            new[ k ] = fields[ k ]
            unset( fields[ k ] )
        }
    }
    return array_merge( new, fields )
}
?gt

Agregar campo phone y guardarlo

lt?php
// Añadir phone
add_filter( comment_form_default_fields, function( fields ) {
    fields[phone] = ltp class=comment-form-phonegtltlabel for=phonegt . esc_html__( Teléfono, text-domain ) . lt/labelgt .
        ltinput id=phone name=phone type=text value= /gtlt/pgt
    return fields
})

// Guardar phone
add_action( comment_post, function( comment_ID ) {
    if ( isset( _POST[phone] ) ) {
        phone = sanitize_text_field( wp_unslash( _POST[phone] ) )
        if ( phone !==  ) {
            add_comment_meta( comment_ID, phone, phone, true )
        }
    }
} )
?gt

Conclusión

Reordenar campos del formulario de comentarios en WordPress es una tarea relativamente sencilla si se usan los filtros adecuados. Es recomendable trabajar con comment_form_fields para tener control total, respetar la seguridad y accesibilidad, y probar con distintas prioridades si otros elementos del tema o plugins interfieren. Los ejemplos incluidos cubren los casos más comunes: mover el textarea, ordenar explícitamente, añadir campos personalizados y validar/guardar esos datos.



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *