web-dev-qa-db-ja.com

カスタムメタボックスを検証するためのサンプルコード

メタボックスのカスタムフィールドの検証例については、このサイトやGoogleの検索ではほとんどわかりません。

誰かが例を挙げたいのであれば、これは役に立つだろういくつかのケースです。

1)2011年5月2日として入力された日付は有効な日付形式です
2)テキストボックスに入力された数字は数字で100から500の間です
3)テキストボックス内のテキストは25文字以上の長さです

私の質問は、フィールドを検証するためのコードではなく、検証コードをどこに置くかということです。 JavascriptまたはPHPを使用しますか?それがセーブポストにフックするならば、失敗した検証を扱うための技術 - ポストを更新しますか?投稿を更新しないでください。 - どうやってアップデートをやめますか?問題をユーザーに通知するための最良の方法。

すべての提案は大歓迎です。サンプルコードは、単なるテクニックの説明よりも役立ちます。 (これは誰かが記事を書くのに非常に良い話題になるでしょう。)ありがとう

8
stvwlf

WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box から直接、save_postフックを呼び出し、データを検証/保存するために実行される関数を指定します。

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

それから、その関数を定義します。これには自動的に投稿IDが渡されます。さらに、$ _POST配列にアクセスして、メタボックス内の値を取得できます。

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

有効なデータに対するすべてのルーチンは、この関数内で行われます。結局、あなたはおそらく以下のようなものを使ってデータを保存するでしょう:update_post_meta('meta_key', 'meta_value');

編集:私はあなたの質問の幅に対処しなかったことを私は知っている、しかし私はこれに時間を入れたので私はあなたがそこに行く道の四分の一を得るためにここにそれを残す。

2
tollmanz

日付フィールドを検証するのに適した方法は実際にはありません。できることは、それを分割して部分的に確認することだけです。

checkdate() がありますが、docsページのコメントで述べられているように、日付入力をサニタイズするための効果的な手段として使用することはできません。

最初に確認することは、文字列を期待している場合は文字列にキャストし、同様に整数値と配列値の場合は、データの種類です。

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

日付フィールドでは、通常、日付の各部分の間に区切り記号があり、それに基づいて分割し、整数部分として部分をキャストします(ただし、期待していることが多くあります)。

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

もちろん、これは本当にあなたが日付をどのように保存するか、そしてあなたがその分野で何を期待しているかにかかっています。

数値はとても簡単で、最初はintにキャストされます。

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

それからそれがあなたの与えられた範囲内にあることを確認してください(あなたの質問ごとに)。

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

または..

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

文字列が特定の長さであるかどうかをチェックするのは簡単なので、実際には簡単なので、strlenのPHPドキュメントにリンクします。

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

日付の値は私の考えでは最もトリッキーですが、実際にはあなたがその分野から期待するものに合うようにあなたのコードを書く場合です。たとえば、日付フォーマットがD/M/Yのフィールドがある場合、/(スラッシュ)が表示され、その区切り文字で分割すると3つの数値の配列が表示されることがわかります。あなたに3つの値を与えない、またはどれも有効な数値ではない、そしてデータは無効だった。.

それが助けになることを願っています..(そして誰かが上記のいずれかのためのより良い方法を持っているならば私は批評を受けることができます)。

1
t31os

入力を正しく検証するには、JavascriptとPHPを組み合わせて使用​​する必要があります。

JQuery Validationプラグインを使用することを強くお勧めします: http://docs.jquery.com/Plugins/Validation 。それはあなたがすぐに入力を検証し、何かが間違っているというフィードバックをユーザに提供することを可能にします。

2番目のステップは、PHPを使用してデータを検証することです。 WordPressにはたくさんの バリデーション機能が組み込まれています なので、私はそこから始めます。

1
Matthew Muro