Como requerir imagen destacada antes de publicar con JS y PHP en WordPress

Contents

Cómo requerir imagen destacada antes de publicar en WordPress — Tutorial con JS y PHP

Este artículo explica, con todo lujo de detalles, una solución completa y segura para obligar a que las entradas (o tipos de contenido personalizados) tengan una imagen destacada antes de permitir su publicación. La solución contempla dos capas: una comprobación en el cliente (JavaScript) para una experiencia inmediata en el editor (tanto Classic como Gutenberg) y una comprobación en el servidor (PHP) para evitar que cualquier bypass (peticiones REST, APIs externas, plugins, etc.) publique una entrada sin imagen destacada.

Por qué usar las dos capas

  • Cliente (JS): proporciona feedback inmediato al usuario y evita acciones repetidas.
  • Servidor (PHP): garantiza integridad y seguridad: protege contra publicaciones hechas fuera del editor (REST API, scripts, imports).

Requisitos y consideraciones

  • WordPress 5.x (Gutenberg) o editores clásicos el código incluye detección para ambos.
  • Acceso para añadir código al tema (functions.php) o crear un pequeño plugin.
  • Se mostrará un aviso en el administrador si el servidor cancela la publicación.
  • Soporta posts y puede extenderse a cualquier post_type.

Implementación cliente (JavaScript)

La lógica cliente detecta si el editor es Gutenberg o el editor clásico y evita la acción de publicar mostrando un aviso. Para Gutenberg usamos la API de wp.data para detectar intentos de guardado/publicación y crear una notificación. Para el editor clásico interceptamos el envío del formulario o el clic en el botón Publicar.

Código JavaScript (enfilébralo con wp_enqueue_script en admin):

(function() {
  // Código que funciona tanto en Gutenberg como en Classic
  if ( typeof wp !== undefined  wp.data  wp.data.select ) {
    // Gutenberg
    var select = wp.data.select
    var dispatch = wp.data.dispatch
    var lastIsSaving = select(core/editor).isSavingPost()

    wp.data.subscribe(function() {
      try {
        var isSaving = select(core/editor).isSavingPost()
        // detecta el inicio de guardado/publicación
        if (isSaving  !lastIsSaving) {
          var featured = select(core/editor).getEditedPostAttribute(featured_media)
          if (!featured  featured === 0) {
            // evitar que quede publicado: forzamos a draft y mostramos aviso
            dispatch(core/editor).editPost({ status: draft })
            if (wp.data.dispatch(core/notices)) {
              wp.data.dispatch(core/notices).createNotice(
                error,
                Debe añadir una imagen destacada antes de publicar.,
                { isDismissible: true }
              )
            } else {
              alert(Debe añadir una imagen destacada antes de publicar.)
            }
          }
        }
        lastIsSaving = isSaving
      } catch (e) {
        // no bloquear ejecuciones si algo falla
        console.error(Error checking featured image:, e)
      }
    })
    return
  }

  // Editor clásico (fallback)
  document.addEventListener(DOMContentLoaded, function() {
    var form = document.getElementById(post)
    var publishButton = document.getElementById(publish)

    function hasThumbnailClassic() {
      // En editor clásico existe un input oculto con id _thumbnail_id
      var thumbInput = document.getElementById(_thumbnail_id)
      if (thumbInput) {
        return thumbInput.value  thumbInput.value !== 0
      }
      // fallback: buscar imagen en metabox
      var img = document.querySelector(#postimagediv .inside img)
      return !!img
    }

    if (form) {
      form.addEventListener(submit, function(e) {
        var isPublishing = (publishButton  publishButton.value  publishButton.value.toLowerCase().indexOf(publish) !== -1)  (document.activeElement === publishButton)
        // Si el usuario está intentando publicar
        if (isPublishing  !hasThumbnailClassic()) {
          e.preventDefault()
          alert(Debe añadir una imagen destacada antes de publicar.)
          // Para mejorar UX, desplazamos hasta el metabox
          var metabox = document.getElementById(postimagediv)
          if (metabox) metabox.scrollIntoView({ behavior: smooth })
          return false
        }
      }, true)
    }

    if (publishButton) {
      publishButton.addEventListener(click, function(e) {
        if (!hasThumbnailClassic()) {
          e.preventDefault()
          alert(Debe añadir una imagen destacada antes de publicar.)
          var metabox = document.getElementById(postimagediv)
          if (metabox) metabox.scrollIntoView({ behavior: smooth })
          return false
        }
      })
    }
  })
})()

Notas prácticas sobre el script:

  • Para Gutenberg se usan los paquetes de datos de WP: wp.data.select y wp.data.dispatch. El script crea un aviso con core/notices.
  • Para Classic se comprueba el input oculto _thumbnail_id y la presencia de imagen en el metabox.
  • El script no impide guardados a borrador ni autosaves sólo evita la publicación final si no hay imagen destacada.

Implementación servidor (PHP)

La comprobación en servidor intercepta el intento de publicar (hook wp_insert_post_data) y, si detecta que el estado pedido es publish y no existe imagen destacada, cambia el estado a draft y añade un parámetro a la URL para mostrar un aviso en el panel.

Código PHP (puedes colocarlo en functions.php o en un plugin):

Publicación cancelada: Es obligatorio establecer una imagen destacada antes de publicar.

} } ?>

Explicación y puntos importantes del código PHP:

Cómo instalar estos fragmentos (pasos)

  1. Crear un plugin mínimo o añadir al functions.php de tu tema hijo. Recomiendo crear un plugin para independizar la funcionalidad del tema.
  2. Guardar el código PHP (arriba) en el archivo principal del plugin (por ejemplo, require-featured-image.php) y activarlo.
  3. Encolar el script JS desde PHP para cargarse sólo en el admin y en la pantalla de edición de post:

Coloca el código JavaScript mostrado anteriormente en el archivo js/rfip-admin-check-thumbnail.js y encola el script como se muestra.

Casos especiales y cómo adaptarlo

Buenas prácticas y recomendaciones

Resumen

La combinación de comprobaciones en cliente (JavaScript) y servidor (PHP) ofrece una solución robusta para requerir imagen destacada antes de publicar. El JavaScript mejora la experiencia de usuario detectando y mostrando avisos inmediatamente en Gutenberg y Classic, mientras que el filtro en PHP protege la integridad de los datos evitando publicaciones sin imagen desde cualquier origen.

Implementa los fragmentos con cuidado: encola el JS solo en la pantalla de edición y adapta el PHP a los post_types que necesites. Esta arquitectura minimiza errores y evita que entradas queden publicadas sin la imagen destacada obligatoria.



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 *