Exemple de code pour valider la métabox personnalisée?

8

J'ai trouvé très peu sur ce site ou dans les recherches Google pour des exemples de validation de champs personnalisés de metabox.

Si quelqu'un veut donner des exemples, voici quelques cas qui seraient utiles

1) La date entrée comme 05/02/2011 est un format de date valide
2) Le nombre entré dans la zone de texte est numérique et entre 100 et 500
3) Le texte dans la zone de texte est> 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? S'il s'accroche à la sauvegarde, des techniques pour faire face à l'échec de la validation - Mettre à jour la publication? Ne mettez pas à jour le message? - comment l'empêcher de se mettre à jour? Meilleure façon 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 pour écrire un article.) Merci

stvwlf
la source
Le point de ma question était plus comment afficher les messages d'erreur à l'utilisateur que comment valider les champs individuels en utilisant PHP ou Javascript. Après avoir recherché plusieurs approches, j'en ai finalement trouvé une à laquelle j'ai réussi à travailler wordpress.stackexchange.com/questions/15354/… Merci à ceux qui ont répondu.
stvwlf

Réponses:

2

Directement à partir du WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box , vous appelez le save_posthook 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 passer l'ID 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 vers des données valides 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 abordé l'ampleur de votre question, mais puisque j'ai mis du temps dans cela, je le laisse ici pour vous obtenir un quart du chemin là-bas.

tollmanz
la source
1

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

Oui checkdate(), mais comme mentionné dans les commentaires sur la page des documents, il ne peut pas être utilisé comme un moyen efficace de désinfecter la saisie de la date.

La première chose que je vérifie habituellement est le type de données, si vous attendez une chaîne, convertissez-la en chaîne et de même pour les valeurs entières 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, divisé en fonction de cela et convertissez les parties (autant que vous attendez) en 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 façon dont vous stockez la date et de ce que vous attendez dans ce domaine, c'est quelque chose que vous devrez simplement désinfecter de manière appropriée en fonction de vos besoins spécifiques.

Les valeurs numériques sont assez faciles, tout d'abord converties en int.

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

Vérifiez ensuite qu'il est dans votre plage 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
}

Vérifier si une chaîne a une longueur particulière est facile, donc facile en fait, je vais simplement vous lier à la documentation PHP pour strlen.

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

Les valeurs de date sont les plus délicates à mon avis, mais il s'agit vraiment d'écrire votre code pour répondre à ce que vous attendez de ce champ. Si vous avez un champ avec un format de date D/M/Ypar exemple, vous savez que la /(barre oblique) sera (devrait) être présente et que le fractionnement sur ce délimètre devrait vous donner un tableau de 3 valeurs numériques ... (si le fractionnement ne fonctionne pas) t vous donne 3 valeurs, ou aucune valeur numérique n'est valide, alors les données n'étaient pas valides) ..

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

t31os
la source
1

Pour valider correctement l'entrée, vous devrez utiliser une combinaison de Javascript et 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 signaler à l'utilisateur que quelque chose ne va pas.

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

Matthew Muro
la source