web-dev-qa-db-fra.com

Exemple de code pour la validation de metabox personnalisé?

Sur ce site ou dans Google, j'ai trouvé très peu de recherches sur des exemples de validation de champs personnalisés Metabox.

Si quelqu'un veut donner des exemples, voici quelques cas qui pourraient être utiles

1) La date entrée le 05/02/2011 est un format de date valide
2) Le nombre entré dans la zone de texte est numérique et compris entre 100 et 500
3) La longueur du texte dans la zone de texte est supérieure à 25 caractères.

Ma question n'est pas tant le code pour valider les champs, mais où mettre le code de validation? Utilisez Javascript ou PHP? Si cela dépend de save-post, des techniques pour traiter les erreurs de validation - Mettre à jour le post? Ne pas mettre à jour le post? - comment l'empêchez-vous de se mettre à jour? Meilleur moyen d'informer l'utilisateur des problèmes.

Toutes les suggestions sont appréciées. Un exemple de code est plus utile qu'une simple description d'une technique. (Ce serait un très bon sujet pour quelqu'un sur lequel écrire un article.) Merci

8
stvwlf

Directement à partir du WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box , vous appelez le hook save_post et spécifiez la fonction qui sera exécutée pour valider/enregistrer vos données:

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

Ensuite, vous définissez cette fonction, qui se verra automatiquement attribuer l’identifiant de publication. De plus, vous pouvez accéder au tableau $ _POST pour obtenir les valeurs dans vos métaboxes:

/* 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;
}

Toutes vos routines pour valider les données seront effectuées dans cette fonction. En fin de compte, vous enregistrerez probablement les données en utilisant quelque chose comme: update_post_meta('meta_key', 'meta_value');

EDIT: Je me rends compte que je n’ai pas répondu à l’ampleur de votre question, mais comme j’y ai mis le temps, je vous laisse le temps de vous faire faire un quart du chemin.

2
tollmanz

Il n'y a vraiment aucun moyen approprié de valider un champ de date, tout ce que vous pouvez faire est de le scinder et de le vérifier en plusieurs parties.

Il y a checkdate() , mais comme indiqué dans les commentaires de la page de documentation, il ne peut pas être utilisé comme un moyen efficace de désinfecter la saisie de la date.

La première chose que j’ai l'habitude de vérifier est le type de données. Si vous attendez une chaîne, convertissez-la en chaîne, ainsi que pour les valeurs d'entier et de tableau.

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

Pour les champs de date, vous avez généralement un séparateur entre chaque partie de la date, fractionné en fonction de celle-ci et converti les parties (quel que soit le nombre que vous attendez) sous forme d'entiers.

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

Bien sûr, cela dépend vraiment de la manière dont vous stockez la date et de ce que vous attendez dans ce domaine. Il vous suffira de l'assainir de manière appropriée en fonction de vos besoins spécifiques.

Les valeurs numériques sont assez faciles, premier casting à int ..

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

Ensuite, vérifiez que cela correspond à votre fourchette donnée (selon votre question).

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

ou..

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

Il est facile de vérifier si une chaîne a une longueur particulière, donc je vais simplement vous relier à la documentation PHP de strlen.

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

À mon avis, les valeurs de date sont les plus délicates, mais il s’agit en réalité d’écrire votre code en fonction de vos attentes. Si vous avez un champ avec un format de date de D/M/Y, par exemple, vous savez que le / (barre oblique) sera (devrait) être présent et que la division sur ce délimètre devrait vous donner un tableau de 3 valeurs numériques ... (si la division ne vous donne pas 3 valeurs, ou aucune valeur numérique n'est pas valide, alors les données n'étaient pas valides) ..

Espérons que cela aide .. (et je suis ouvert à la critique si quelqu'un a une meilleure méthode pour tout ce qui précède).

1
t31os

Pour valider correctement les entrées, vous devrez utiliser une combinaison de Javascript et de PHP.

Je recommande fortement d'utiliser le plugin jQuery Validation: http://docs.jquery.com/Plugins/Validation . Il vous permettra de valider les entrées immédiatement et de fournir à l'utilisateur un retour d'information indiquant que quelque chose ne va pas.

La deuxième étape consiste à valider les données en utilisant PHP. WordPress a un tas de fonctions de validation intégrées , donc je commencerais par là et si vous ne trouvez pas ce dont vous avez besoin, intégrez simplement la logique dont vous avez besoin.

1
Matthew Muro