Codice di esempio per la convalida di metabox personalizzato?


8

Ho trovato molto poco su questo sito o nelle ricerche di Google per esempi di convalida di campi personalizzati metabox.

Se qualcuno vuole fare degli esempi, ecco alcuni casi che potrebbero essere utili

1) La data inserita come 05/02/2011 è un formato data valido
2) Il numero inserito nella casella di testo è numerico e compreso tra 100 e 500
3) Il testo nella casella di testo è lungo> 25 caratteri

La mia domanda non è tanto il codice per validare i campi ma dove mettere il codice di validazione? Usa Javascript o PHP? Se si aggancia al post di salvataggio, le tecniche per gestire la convalida non riuscita - Aggiornare il post? Non aggiorni il post? - come si impedisce l'aggiornamento? Il modo migliore per informare l'utente dei problemi.

Tutti i suggerimenti sono apprezzati. Il codice di esempio è più utile di una semplice descrizione di una tecnica. (Questo sarebbe un ottimo argomento per qualcuno su cui scrivere un articolo.) Grazie




Il punto della mia domanda era più come mostrare all'utente i messaggi di errore che come convalidare i singoli campi usando PHP o Javascript. Dopo aver ricercato diversi approcci, ho finalmente trovato quello in cui sono riuscito a lavorare wordpress.stackexchange.com/questions/15354/… Grazie a coloro che hanno risposto.
stvwlf,

Risposte:


2

Direttamente dal WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box , si chiama l' save_posthook e si specifica la funzione che verrà eseguita per convalidare / salvare i dati:

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

Quindi si definisce quella funzione, alla quale verrà automaticamente passato l'ID post. Inoltre, puoi accedere all'array $ _POST per ottenere i valori nei metabox:

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

Tutte le routine per i dati validi verranno eseguite all'interno di questa funzione. Alla fine, probabilmente salverai i dati usando qualcosa come: update_post_meta('meta_key', 'meta_value');

EDIT: Mi rendo conto di non aver affrontato l'ampiezza della tua domanda, ma dato che ho dedicato del tempo a questo, lo lascio qui per farti un quarto di strada lì.


1

Non esiste davvero un modo adatto per convalidare un campo data, tutto quello che puoi fare è dividerlo e controllarlo in parti ..

C'è checkdate(), ma come menzionato nei commenti sulla pagina dei documenti non può essere usato come mezzo efficace per disinfettare l'inserimento della data.

La prima cosa che controllo di solito è il tipo di dati, se mi aspetto una stringa, quindi esegui il cast in una stringa e allo stesso modo per i valori interi e array.

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

Per i campi data in genere è presente un separatore tra ciascuna parte della data, diviso in base a quello e trasmetti le parti (per quanto ti aspetti) come numeri interi.

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

Naturalmente questo dipende davvero da come memorizzi la data e cosa ti aspetti in quel campo, è qualcosa che dovrai solo disinfettare in modo appropriato in base alle tue esigenze specifiche.

I valori numerici sono abbastanza facili, prima il cast in int ..

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

Quindi controlla che rientri nell'intervallo specificato (per la tua domanda).

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

Controllare se una stringa ha una lunghezza particolare è facile, quindi in effetti ho intenzione di collegarti alla documentazione di PHP per strlen.

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

I valori della data sono i più difficili secondo me, ma in realtà è un caso di scrivere il tuo codice per soddisfare ciò che ti aspetti da quel campo. Se hai un campo con un formato data, D/M/Yad esempio, sai che la /(barra) sarà (dovrebbe) essere presente e che la divisione su quel delimitatore dovrebbe darti un array di 3 valori numerici ... (se la divisione non lo fa ' ti danno 3 valori, o nessuno dei valori numerici non è valido, quindi i dati non erano validi).

Spero che sia d'aiuto .. (e sono aperto alla critica se qualcuno ha un metodo migliore per uno di questi).


1

Per validare correttamente l'input, dovrai usare una combinazione di Javascript e PHP.

Consiglio vivamente di utilizzare il plug-in di convalida jQuery: http://docs.jquery.com/Plugins/Validation . Ti consentirà di convalidare immediatamente gli input e fornire feedback all'utente che qualcosa non va.

Il secondo passo è validare i dati usando PHP. WordPress ha un sacco di funzioni di convalida integrate , quindi inizierei da lì e se non riesci a trovare quello che ti serve semplicemente costruisci la logica di cui hai bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.