it-swarm.com.de

Beispielcode zur Validierung einer benutzerdefinierten Metabox?

Ich habe auf dieser Website oder in Google nur sehr wenige Beispiele für die Überprüfung benutzerdefinierter Metabox-Felder gefunden.

Wenn jemand Beispiele nennen möchte, sind hier einige Fälle, die nützlich wären

1) Das als 05/02/2011 eingegebene Datum ist ein gültiges Datumsformat
2) Die in das Textfeld eingegebene Nummer ist numerisch und liegt zwischen 100 und 500
3) Der Text im Textfeld ist länger als 25 Zeichen

Meine Frage ist nicht so sehr der Code zur Validierung der Felder, sondern wo soll der Validierungscode abgelegt werden? Benutze Javascript oder PHP? Wenn Save-Post aktiviert ist, werden Techniken für den Umgang mit fehlgeschlagener Validierung angezeigt. - Aktualisieren Sie den Post? Post nicht aktualisieren? - Wie verhindern Sie die Aktualisierung? Der beste Weg, um den Benutzer über die Probleme zu informieren.

Alle Vorschläge werden geschätzt. Beispielcode ist hilfreicher als nur eine Beschreibung einer Technik. (Dies wäre ein sehr gutes Thema, über das jemand einen Artikel schreiben könnte.) Vielen Dank

8
stvwlf

Direkt aus dem WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box rufen Sie den Hook save_post auf und geben die Funktion an, die ausgeführt wird, um Ihre Daten zu validieren/speichern:

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

Dann definieren Sie die Funktion, die automatisch die Post-ID übergeben wird. Außerdem können Sie auf das Array $ _POST zugreifen, um die Werte in Ihren Metaboxen abzurufen:

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

Alle Ihre Routinen zu gültigen Daten werden in dieser Funktion durchgeführt. Am Ende werden Sie die Daten wahrscheinlich mit etwas speichern, wie: update_post_meta('meta_key', 'meta_value');

EDIT: Mir ist klar, dass ich nicht die Breite Ihrer Frage angesprochen habe, aber da ich die Zeit in diese gesteckt habe, lasse ich sie hier, um Ihnen ein Viertel des Weges dorthin zu ermöglichen.

2
tollmanz

Es gibt wirklich keine geeignete Möglichkeit, ein Datumsfeld zu validieren. Sie können es nur aufteilen und in Teilen überprüfen.

Es gibt checkdate() , aber wie in den Kommentaren auf der Dokumentseite erwähnt, kann es nicht als wirksames Mittel zur Bereinigung der Datumseingabe verwendet werden.

Das erste, was ich normalerweise überprüfe, ist der Datentyp. Wenn ich eine Zeichenfolge erwarte, wird diese in eine Zeichenfolge umgewandelt und ebenso für Ganzzahl- und Arraywerte.

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

Bei Datumsfeldern haben Sie normalerweise ein Trennzeichen zwischen den einzelnen Teilen des Datums, das basierend darauf aufgeteilt wird, und setzen die Teile (wie viele Sie auch erwarten) als Ganzzahlen um.

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

Natürlich hängt dies wirklich davon ab, wie Sie das Datum speichern und was Sie in diesem Bereich erwarten. Sie müssen es nur entsprechend Ihren spezifischen Anforderungen entsprechend desinfizieren.

Numerische Werte sind recht einfach, zuerst umgewandelt in int ..

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

Überprüfen Sie dann, ob es innerhalb Ihres vorgegebenen Bereichs liegt (gemäß Ihrer Frage).

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

oder..

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

Es ist einfach zu überprüfen, ob eine Zeichenfolge eine bestimmte Länge hat. Ich werde Sie also einfach mit der PHP -Dokumentation für strlen verknüpfen.

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

Die Datumswerte sind meiner Meinung nach die schwierigsten, aber es geht wirklich darum, Ihren Code so zu schreiben, wie Sie es von diesem Feld erwarten. Wenn Sie ein Feld mit dem Datumsformat D/M/Y haben, wissen Sie beispielsweise, dass der / (Schrägstrich) vorhanden sein wird (sollte) und dass die Aufteilung auf diesen Begrenzer ein Array mit 3 numerischen Werten ergibt ... (falls die Aufteilung erfolgt) gibt Ihnen keine 3 Werte oder keine ungültigen numerischen Werte, dann waren die Daten ungültig).

Hoffe das hilft .. (und ich bin offen für Kritik, wenn jemand eine bessere Methode für eine der oben genannten hat).

1
t31os

Um die Eingabe richtig zu validieren, müssen Sie eine Kombination aus Javascript und PHP verwenden.

Ich kann die Verwendung des Plugins für die jQuery-Validierung nur empfehlen: http://docs.jquery.com/Plugins/Validation . Sie können die Eingaben sofort validieren und dem Benutzer eine Rückmeldung geben, dass etwas nicht stimmt.

Der zweite Schritt ist die Validierung der Daten mit PHP. WordPress hat eine Reihe von eingebauten Validierungsfunktionen , also würde ich dort anfangen und wenn Sie nicht finden können, was Sie brauchen, bauen Sie einfach die Logik ein, die Sie brauchen.

1
Matthew Muro