Código de amostra para validar metabox personalizado?


8

Encontrei muito pouco neste site ou nas pesquisas do Google por exemplos de validação de campos personalizados da metabox.

Se alguém quiser dar exemplos, aqui estão alguns casos que seriam úteis

1) A data digitada como 05/02/2011 é o formato de data válido
2) O número digitado na caixa de texto é numérico e entre 100 e 500
3) O texto na caixa de texto tem> 25 caracteres

Minha pergunta não é tanto o código para validar os campos, mas onde colocar o código de validação? Use Javascript ou PHP? Se ele se prender ao save-post, técnicas para lidar com falhas na validação - Atualizar o post? Não atualiza a postagem? - como você impede a atualização? Melhor maneira de notificar o usuário sobre os problemas.

Todas as sugestões são apreciadas. O código de exemplo é mais útil do que apenas uma descrição de uma técnica. (Esse seria um tópico muito bom para alguém escrever um artigo.) Obrigado




O objetivo da minha pergunta era mais como exibir as mensagens de erro para o usuário do que validar os campos individuais usando PHP ou Javascript. Depois de pesquisar várias abordagens, finalmente encontrei uma que consegui trabalhar com wordpress.stackexchange.com/questions/15354/… Graças a quem respondeu.
25411 stvwlf

Respostas:


2

Diretamente do WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box , você chama o save_postgancho e especifica a função que será executada para validar / salvar seus dados:

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

Então você define essa função, que receberá automaticamente o ID da postagem. Além disso, você pode acessar a matriz $ _POST para obter os valores em seus metaboxes:

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

Todas as suas rotinas para dados válidos serão realizadas nessa função. No final, você provavelmente salvará os dados usando algo como: update_post_meta('meta_key', 'meta_value');

EDIT: Eu sei que não abordei a amplitude da sua pergunta, mas desde que dediquei esse tempo, deixo aqui para que você obtenha um quarto do caminho até lá.


1

Não há realmente nenhuma maneira adequada de validar um campo de data, tudo o que você pode fazer é dividi-lo e verificá-lo em partes.

Existe checkdate(), mas como mencionado nos comentários na página de documentos, ele não pode ser usado como um meio eficaz de higienizar a entrada de datas.

A primeira coisa que costumo verificar é o tipo de dados, se você espera uma string e depois lança para uma string e da mesma forma para valores inteiros e de array.

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

Para os campos de data, normalmente você tem um separador entre cada parte da data, divida com base nisso e projete as partes (quantas desejar) como números inteiros.

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

É claro que isso realmente depende de como você armazena a data e o que você espera nesse campo; é algo que você precisará sanear adequadamente de acordo com suas necessidades específicas.

Os valores numéricos são bastante fáceis, primeiro convertidos para int ..

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

Em seguida, verifique se está dentro do intervalo especificado (de acordo com sua pergunta).

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

Verificar se uma string tem um comprimento específico é fácil, tão fácil que, na verdade, eu vou apenas vincular você à documentação do PHP para strlen.

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

Os valores de data são os mais complicados na minha opinião, mas na verdade é um caso de escrever seu código para se adequar ao que você espera desse campo. Se você tem um campo com um formato de data de, D/M/Ypor exemplo, sabe que a /(barra) estará (deveria) estar presente e que a divisão nesse delimitador deverá fornecer uma matriz de 3 valores numéricos ... (se a divisão não ' não fornecer três valores ou se não houver valores numéricos válidos, os dados serão inválidos).

Espero que ajude .. (e estou aberto à crítica se alguém tiver um método melhor para qualquer uma das opções acima).


1

Para validar corretamente a entrada, você precisará usar uma combinação de Javascript e PHP.

Eu recomendo usar o plugin jQuery Validation: http://docs.jquery.com/Plugins/Validation . Isso permitirá que você valide as entradas imediatamente e forneça feedback ao usuário de que algo está errado.

O segundo passo é validar os dados usando PHP. O WordPress tem várias funções de validação integradas , então eu começaria por aí e, se você não encontrar o que precisa, basta criar a lógica de que precisa.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.