Validación de valores y campos requeridos en Meta Boxes personalizados
Algo que nunca he visto cubierto es la mejor manera de validar que ciertos campos de formulario se completen correctamente para las meta boxes de tipos de contenido personalizados.
Busco obtener opiniones expertas sobre cómo validar mejor los campos personalizados para cualquier metabox que uno pueda crear. Mis intereses son:
- asegurar que la validación de campos se realice antes de que la entrada sea publicada/actualizada
- utilizar una clase/código que no entre en conflicto con otros javascript de WordPress
- permitir definir campos específicos como requeridos mientras otros podrían ser opcionales
- validar campos basándose en reglas personalizables incluyendo expresiones regulares para cosas como formato de email
- controlar la visualización de errores/avisos
¡Gracias por adelantado!

La forma más sencilla es añadir validación Javascript mediante el plugin jQuery Validate. Aquí tienes una guía básica:
Cerca de tu llamada add_meta_box, incluye el plugin jQuery Validate y un archivo JS para tu script simple:
add_action('admin_enqueue_scripts', 'add_my_js');
function add_my_js(){
wp_enqueue_script('my_validate', 'ruta/a/jquery.validate.min.js', array('jquery'));
wp_enqueue_script('my_script_js', 'ruta/a/my_script.js');
}
Luego en my_script.js incluye lo siguiente:
jQuery().ready(function() {
jQuery("#post").validate();
});
Esto habilitará la validación en el formulario de entrada. Luego, en el callback add_meta_box donde defines los campos personalizados, añadirías una clase "required" para cada campo que deseas validar, así:
<input type="text" name="my_custom_text_field" class="required"/>
Todos los campos con "required" en su clase serán validados cuando la entrada sea guardada/publicada/actualizada. Todas las demás opciones de validación (reglas, estilos de error, etc.) pueden configurarse en la función document.ready en my_script.js; consulta la documentación de jQuery Validate para ver todas las opciones.

Gracias, lo probaré mañana, pero ¿podrías explicarme cómo hacer diferentes validaciones? Por ejemplo, validar una dirección de correo electrónico correcta, validar que no haya más de o al menos XX caracteres, que un campo del formulario esté completado... cosas así?

Además, ¿esto se valida antes de que el post se guarde/actualice? Si no, ¿cómo puedo hacerlo?

Los ejemplos y documentación del plugin jQuery Validation (enlazado en mi respuesta) te mostrarán cómo hacer todo eso. Por defecto, la validación ocurre al enviar, pero puedes activarla al perder el foco (blur) o al cambiar (change) cualquier elemento del formulario para tus campos personalizados.

Implementé esta solución y parece muy prometedora, pero tengo un problema: ¿qué debo poner en el 'submitHandler'? Después de la validación con jquery.validate, WordPress no hace nada (el botón de guardar permanece en estado animado). ¿Cómo devuelvo el control a WP?

Si solo estás intentando que el botón Publicar vuelva a su estado normal cuando un campo requerido está vacío (o falla alguna otra validación), no deberías necesitar hacer nada con el submitHandler; simplemente edita el código validate() para cambiar el botón cuando falle la validación. Esto funciona: jQuery("#post").validate({ invalidHandler: function() { jQuery('#publish').removeClass('button-primary-disabled'); jQuery('#ajax-loading').css('visibility', 'hidden'); } });

Encontré este enfoque para resolver el problema de validar campos de metabox usando código PHP
https://tommcfarlin.com/post-meta-data-error-messages/
Espero que esto te ayude (a mí me funcionó en un escenario similar)

El Código Básico Completo para agregar Validación jQuery:
Cargar el script de validación. Asumo que jQuery ya está cargado.
add_action('admin_enqueue_scripts',function($id){ $validation',$validation_js_url = #tu fuente de validation.js; wp_register_script( 'validation',$validation_js_url,array(),'',true ); wp_enqueue_script( 'validation' ); });
En el archivo js o etiqueta script:
jQuery(document).ready(function($){ var form = $("form[name='post']"); $(form).find("input[type='submit']").click(function(e){ e.preventDefault(); $(form).validate(); if($(form).valid()) { $("#ajax-loading").show(); $(form).submit(); }else{ $("#publish").removeClass().addClass("button-primary"); $("#ajax-loading").hide(); } }); });
Listo :)

Usé este código, muy útil, solo cambié:
$(form).find("input[type='submit']").click(function(e){
Por:
$(form).find("#publish").click(function(e){
Porque si tienes otro formulario dentro del formulario principal, esto inicia el script.
Y:
$(form).submit();
Por:
$(this).submit();
Porque la primera línea solo guarda el post como borrador y no puedes publicarlo más.
Escribí todo aquí: http://allgraphics.it/blog/2012/10/jquery-validation-sui-campi-di-input-postcustom-post-di-wordpress/

Si deseas poder validar en el lado del servidor, la opción más fácil es usar Advanced Custom Fields para definir tus diseños de campos personalizados, y luego el complemento Validated Field para establecer tu validación por campo en el Admin de WordPress.
