¿Código de muestra para validar metabox personalizado?

8

Encontré muy poco en este sitio o en las búsquedas de Google de ejemplos de validación de campos personalizados de metabox.

Si alguien quiere dar ejemplos, aquí hay algunos casos que serían útiles.

1) La fecha ingresada como 05/02/2011 es un formato de fecha válido
2) El número ingresado en el cuadro de texto es numérico y entre 100 y 500
3) El texto en el cuadro de texto es> 25 caracteres de largo

Mi pregunta no es tanto el código para validar los campos sino dónde colocar el código de validación. ¿Usar Javascript o PHP? Si se engancha en guardar publicación, técnicas para lidiar con la validación fallida - ¿Actualizar la publicación? ¿No actualizas la publicación? - ¿Cómo evitas que se actualice? La mejor manera de notificar al usuario de los problemas.

Todas las sugerencias son apreciadas. El código de muestra es más útil que solo una descripción de una técnica. (Este sería un muy buen tema para que alguien escriba un artículo). Gracias

stvwlf
fuente
El punto de mi pregunta era más cómo mostrar los mensajes de error al usuario que cómo validar los campos individuales usando PHP o Javascript. Después de investigar varios enfoques, finalmente encontré uno que pude poner en funcionamiento wordpress.stackexchange.com/questions/15354/… Gracias a quienes respondieron.
stvwlf

Respuestas:

2

Directamente desde WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box , llama al save_postgancho y especifica la función que se ejecutará para validar / guardar sus datos:

/* Do something with the data entered */
add_action('save_post', 'myplugin_save_postdata');

Luego, defina esa función, a la que se le pasará automáticamente la identificación de la publicación. Además, puede acceder a la matriz $ _POST para obtener los valores en sus metaboxes:

/* When the post is saved, saves our custom data */
function myplugin_save_postdata( $post_id ) {
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
      return $post_id;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) ) )
      return $post_id;


  // Check permissions
  if ( 'page' == $_POST['post_type'] ) 
  {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return $post_id;
  }
  else
  {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;
  }

  // OK, we're authenticated: we need to find and save the data

  $mydata = $_POST['myplugin_new_field'];

  // Do something with $mydata 
  // probably using add_post_meta(), update_post_meta(), or 
  // a custom table (see Further Reading section below)

   return $mydata;
}

Todas sus rutinas a datos válidos se realizarán dentro de esta función. Al final, probablemente guardará los datos usando algo como: update_post_meta('meta_key', 'meta_value');

EDITAR: Me doy cuenta de que no abordé la amplitud de su pregunta, pero dado que dediqué tiempo a esto, lo dejo aquí para llevarlo a un cuarto del camino.

tollmanz
fuente
1

Realmente no hay una forma adecuada de validar un campo de fecha, todo lo que puede hacer es dividirlo y verificarlo en partes.

Hay checkdate(), pero como se menciona en los comentarios en la página de documentos, no se puede usar como un medio eficaz para desinfectar la entrada de fecha.

Lo primero que generalmente verifico es el tipo de datos, si se espera una cadena, se convierte en una cadena y del mismo modo para valores enteros y de matriz.

// Casting example
$string = (string) $string;
$num = (int) $num;
$array = (array) $array;

Para los campos de fecha, generalmente tiene un separador entre cada parte de la fecha, dividido en función de eso y proyectando las partes (por muchas que espere) como enteros.

$date = explode( '/', (string) $string );
$date = array_map( 'intval', $date );
// Now count the parts and validate them further - eg. you don't want negative values

Por supuesto, esto realmente depende de cómo almacene la fecha y lo que espera en ese campo, es algo que tendrá que desinfectar adecuadamente según sus necesidades específicas.

Los valores numéricos son bastante fáciles, primero emitidos a int ..

$num = (int) $var_with_num;
// Or
$num = absint( $var_with_expected_non_negative_num ); // absint is a WordPress function

Luego verifique que esté dentro de su rango dado (según su pregunta).

// If it's not in range
if( $num < 100 || $num > 500 ) {
    // Number is not in range
}

o..

// If it is in range - including 100 & 500 as possible values
if( $num >= 100 && $num <= 500 ) {
    // Number is in range
}

Verificar si una cadena es de una longitud particular es fácil, de hecho, tan fácil que solo voy a vincularlo a la documentación de PHP para strlen.

http://php.net/manual/en/function.strlen.php

Los valores de fecha son los más difíciles en mi opinión, pero en realidad se trata de escribir su código para que se ajuste a lo que espera de ese campo. Si tiene un campo con un formato de fecha, D/M/Ypor ejemplo, sabe que la /(barra diagonal) estará (debería) estar presente y que la división en ese delímetro debería proporcionarle una matriz de 3 valores numéricos ... (si la división no ' t le da 3 valores, o cualquiera no son valores numéricos válidos, entonces los datos no eran válidos).

Espero que ayude ... (y estoy abierto a la crítica si alguien tiene un mejor método para cualquiera de los anteriores).

t31os
fuente
1

Para validar correctamente la entrada, deberá usar una combinación de Javascript y PHP.

Recomiendo usar el complemento de validación jQuery: http://docs.jquery.com/Plugins/Validation . Le permitirá validar las entradas inmediatamente y proporcionar comentarios al usuario de que algo está mal.

El segundo paso es validar los datos usando PHP. WordPress tiene un montón de funciones de validación incorporadas , por lo que comenzaría allí y, si no puede encontrar lo que necesita, simplemente cree la lógica que necesita.

Matthew Muro
fuente