Kode sampel untuk memvalidasi metabox khusus?

8

Saya menemukan sangat sedikit di situs ini atau di pencarian Google untuk contoh memvalidasi bidang kustom metabox.

Jika ada yang ingin memberi contoh, berikut adalah beberapa kasus yang akan berguna

1) Tanggal yang dimasukkan sebagai 05/02/2011 adalah format tanggal yang valid
2) Angka yang dimasukkan dalam kotak teks adalah angka dan antara 100 dan 500
3) Teks dalam kotak teks adalah> panjang 25 karakter

Pertanyaan saya bukan kode untuk memvalidasi bidang tetapi di mana harus meletakkan kode validasi? Gunakan Javascript atau PHP? Jika itu terkait dengan save-post, teknik untuk berurusan dengan validasi yang gagal - Perbarui posting? Jangan perbarui posting? - bagaimana Anda menghentikan pembaruan? Cara terbaik untuk memberi tahu pengguna tentang masalah tersebut.

Semua saran sangat dihargai. Kode sampel lebih bermanfaat daripada sekadar deskripsi teknik. (Ini akan menjadi topik yang sangat baik bagi seseorang untuk menulis artikel.) Terima kasih

stvwlf
sumber
Inti dari pertanyaan saya adalah bagaimana menampilkan pesan kesalahan kepada pengguna daripada bagaimana memvalidasi masing-masing bidang menggunakan PHP atau Javascript. Setelah meneliti beberapa pendekatan saya akhirnya menemukan satu yang saya bisa bekerja wordpress.stackexchange.com/questions/15354/... Terima kasih kepada mereka yang menjawab.
stvwlf

Jawaban:

2

Langsung dari WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box , Anda memanggil save_posthook dan menentukan fungsi yang akan dijalankan untuk memvalidasi / menyimpan data Anda:

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

Kemudian Anda menentukan fungsi itu, yang secara otomatis akan melewati id posting. Selain itu, Anda dapat mengakses array $ _POST untuk mendapatkan nilai di metabox Anda:

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

Semua rutinitas Anda ke data yang valid akan dilakukan dalam fungsi ini. Pada akhirnya, Anda kemungkinan akan menyimpan data menggunakan sesuatu seperti: update_post_meta('meta_key', 'meta_value');

EDIT: Saya sadar saya tidak membahas luasnya pertanyaan Anda, tetapi karena saya meluangkan waktu dalam hal ini, saya meninggalkannya di sini untuk membuat Anda seperempat perjalanan ke sana.

tollmanz
sumber
1

Benar-benar tidak ada cara yang sesuai untuk memvalidasi bidang tanggal, yang dapat Anda lakukan adalah membaginya dan memeriksanya di bagian ..

Ada checkdate(), tetapi seperti yang disebutkan dalam komentar di halaman dokumen itu tidak dapat digunakan sebagai sarana yang efektif untuk membersihkan input tanggal.

Hal pertama yang biasanya saya periksa adalah jenis data, jika mengharapkan string kemudian dilemparkan ke string dan juga untuk nilai integer dan array.

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

Untuk bidang tanggal Anda biasanya memiliki pemisah antara setiap bagian tanggal, dibagi berdasarkan itu dan melemparkan bagian-bagian (berapa banyak yang Anda harapkan) sebagai bilangan bulat.

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

Tentu saja ini benar-benar tergantung pada bagaimana Anda menyimpan tanggal dan apa yang Anda harapkan di bidang itu, itu adalah sesuatu yang Anda hanya perlu membersihkan dengan tepat sesuai dengan kebutuhan spesifik Anda.

Nilai numerik cukup mudah, pertama dilemparkan ke ..

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

Kemudian periksa apakah itu dalam kisaran yang Anda berikan (per pertanyaan Anda).

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

atau..

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

Memeriksa apakah sebuah string memiliki panjang tertentu itu mudah, sebenarnya sangat mudah. ​​Saya hanya akan menghubungkan Anda ke doktrin PHP untuk strlen.

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

Nilai tanggal adalah yang paling sulit menurut saya, tetapi sebenarnya ini adalah kasus penulisan kode Anda sesuai dengan apa yang Anda harapkan dari bidang itu. Jika Anda memiliki bidang dengan format tanggal D/M/Ymisalnya, Anda tahu bahwa /(garis miring) akan (harus) ada dan bahwa pemisahan pada delimeter itu akan memberi Anda array 3 nilai numerik ... (jika pemisahan tidak t memberi Anda 3 nilai, atau nilai numerik yang tidak valid, maka data tidak valid) ..

Semoga itu bisa membantu .. (dan saya terbuka untuk kritik jika ada yang punya metode yang lebih baik untuk hal-hal di atas).

t31os
sumber
1

Untuk memvalidasi input dengan benar, Anda harus menggunakan kombinasi Javascript dan PHP.

Saya sangat merekomendasikan menggunakan plugin Validasi jQuery: http://docs.jquery.com/Plugins/Validation . Ini akan membiarkan Anda memvalidasi input segera dan memberikan umpan balik kepada pengguna bahwa ada sesuatu yang salah.

Langkah kedua adalah memvalidasi data menggunakan PHP. WordPress memiliki banyak fungsi validasi bawaan , jadi saya akan mulai dari sana dan jika Anda tidak dapat menemukan apa yang Anda butuhkan, cukup buat logika yang Anda butuhkan.

Matthew Muro
sumber