Beispielcode zur Validierung einer benutzerdefinierten Metabox?

8

Ich habe auf dieser Website oder in der Google-Suche nach Beispielen für die Überprüfung von benutzerdefinierten Metabox-Feldern nur sehr wenig 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> 25 Zeichen lang

Meine Frage ist nicht so sehr der Code zum Validieren der Felder, sondern wo der Validierungscode abgelegt werden soll. Verwenden Sie Javascript oder PHP? Wenn es sich um Save-Post handelt, Techniken zum Umgang mit fehlgeschlagener Validierung - Update des Posts? Beitrag nicht aktualisieren? - Wie verhindern Sie die Aktualisierung? Der beste Weg, um den Benutzer über die Probleme zu informieren.

Alle Vorschläge sind willkommen. Beispielcode ist hilfreicher als nur eine Beschreibung einer Technik. (Dies wäre ein sehr gutes Thema für jemanden, über den er einen Artikel schreiben könnte.) Vielen Dank

stvwlf
quelle
Der Punkt meiner Frage war mehr, wie die Fehlermeldungen dem Benutzer angezeigt werden, als wie die einzelnen Felder mit PHP oder Javascript überprüft werden. Nachdem ich mehrere Ansätze recherchiert hatte, fand ich endlich einen, mit dem ich arbeiten konnte. WordPress.stackexchange.com/questions/15354/… Vielen Dank an diejenigen, die geantwortet haben.
stvwlf

Antworten:

2

Direkt aus dem WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box rufen Sie den save_postHook auf und geben die Funktion an, die zum Validieren / Speichern Ihrer Daten ausgeführt wird:

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

Dann definieren Sie diese Funktion, der automatisch die Post-ID übergeben wird. Darüber hinaus 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 innerhalb dieser Funktion ausgeführt. Am Ende werden Sie die Daten wahrscheinlich mit folgenden Elementen speichern: update_post_meta('meta_key', 'meta_value');

EDIT: Mir ist klar, dass ich nicht auf die Breite Ihrer Frage eingegangen bin, aber da ich die Zeit dafür aufgewendet habe, lasse ich es hier, um Ihnen ein Viertel des Weges dorthin zu bringen.

tollmanz
quelle
1

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 Dokumentenseite 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 einen String erwarte, dann in einen String umwandeln und ebenfalls für Integer- und Array-Werte.

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

Für Datumsfelder haben Sie normalerweise einen Trenner zwischen jedem Teil des Datums, der darauf basierend aufgeteilt wird und die Teile (wie viele Sie auch erwarten) als Ganzzahlen umwandelt.

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

Dies hängt natürlich wirklich davon ab, wie Sie das Datum speichern und was Sie in diesem Feld erwarten. Sie müssen es nur entsprechend Ihren spezifischen Anforderungen entsprechend bereinigen.

Numerische Werte sind recht einfach, zuerst 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 am schwierigsten, aber es geht wirklich darum, Ihren Code so zu schreiben, wie Sie es von diesem Feld erwarten. Wenn Sie beispielsweise ein Feld mit einem Datumsformat von haben D/M/Y, wissen Sie, dass der /(Schrägstrich) vorhanden sein wird (sollte) und dass die Aufteilung auf diesem Delimeter ein Array von 3 numerischen Werten ergeben sollte ... (wenn die Aufteilung dies nicht tut) Wenn Sie keine 3 Werte angeben oder keine gültigen numerischen Werte vorliegen, waren die Daten ungültig.

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

t31os
quelle
1

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

Ich empfehle dringend, das jQuery Validation-Plugin zu verwenden: http://docs.jquery.com/Plugins/Validation . Sie können die Eingaben sofort validieren und dem Benutzer Feedback geben, dass etwas nicht stimmt.

Der zweite Schritt besteht darin, die Daten mit PHP zu validieren. WordPress verfügt über eine Reihe integrierter Validierungsfunktionen. Wenn Sie also nicht finden, was Sie benötigen, bauen Sie einfach die Logik ein, die Sie benötigen.

Matthew Muro
quelle