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


8

このサイトやGoogle検索でメタボックスカスタムフィールドを検証する例を見つけることはほとんどありません。

誰かが例を挙げたい場合は、ここに役立ついくつかのケースがあります

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

私の質問は、フィールドを検証するためのコードではなく、検証コードをどこに置くかです。JavaScriptまたはPHPを使用しますか?保存ポストをフックする場合、検証の失敗に対処するための手法-ポストを更新しますか?投稿を更新しませんか?-どのようにして更新を停止しますか?ユーザーに問題を通知する最良の方法。

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




私の質問の要点は、PHPまたはJavaScriptを使用して個々のフィールドを検証する方法よりも、ユーザーにエラーメッセージを表示する方法でした。いくつかのアプローチを調査した後、私はようやくwordpress.stackexchange.com/questions/15354/…を動作させることができる方法を見つけました… 回答してくれた方々に感謝します。
stvwlf 2011

回答:


2

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');

編集:私はあなたの質問の幅に対処しなかったと思います、しかし私はこれに時間を費やしたので、あなたがそこに道の4分の1を得るためにここにそれを残します。


1

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

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

私が通常チェックする最初のことは、データのタイプです。文字列を期待している場合、文字列にキャストし、整数値と配列値についても同様です。

// 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つの数値の配列が得られることがわかります(分割されない場合) t 3つの値を与えるか、有効な数値ではない場合、データは無効でした)。

それがお役に立てば幸いです(そして、上記のいずれかに対してより良い方法がある人がいれば、私は批評の余地があります)。


1

入力を適切に検証するには、JavascriptとPHPの組み合わせを使用する必要があります。

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

2番目のステップは、PHPを使用してデータを検証することです。WordPressには一連の検証関数組み込まれているので、そこから始めて、必要なものが見つからない場合は、必要なロジックに組み込むだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.