Jawaban di atas baik jika Anda membutuhkan bidang yang diberi nomor. Dalam kasus saya, saya tidak melakukannya. Saya memiliki widget dengan opsi yang memungkinkan pengguna memilih sejumlah kategori untuk digunakan dalam widget.
Ini widget saya form
. - Tiga hal penting di sini
- Pastikan nilai default menjadi kosong
array()
jika nilai widget tidak disetel
- Dalam
<label>
name
atribut formulir , perhatikan bahwa saya lampirkan []
di bagian akhir. Ini memberi tahu PHP bahwa saya mengirimkan array nilai untuk kunci ini
- Bungkus kotak centang di label sebagai
<label><input type="checkbox" ...></label>
. - Setiap kotak centang kami tidak akan memiliki id
atribut unik , sehingga <label>
for
atribut tidak akan berfungsi. Kami dapat membuat ID unik, tapi itu merepotkan. Jika Anda hanya membungkus label di sekitar input, label akan dikaitkan dengan benar tanpa perlu menghubungkan for
+id
Sekarang kodenya
public function form($instance) {
$title = isset($instance['title']) ? $instance['title'] : '';
$categories = isset($instance['categories']) ? $instance['categories'] : array();
?>
<p>
<label for="<?php echo $this->get_field_id('title') ?>">
<?php _e( 'Title:' ) ?>
</label>
<input class="widefat"
id="<?php echo $this->get_field_id('title') ?>"
name="<?php echo $this->get_field_name('title') ?>"
value="<?php echo $title ?>" />
</p>
<p>Categories</p>
<ul>
<?php foreach (\get_categories() as $category): ?>
<li>
<label>
<input type="checkbox"
class="checkbox"
name="<?php echo $this->get_field_name('categories') ?>[]"
value="<?php echo $category->cat_ID ?>"
<?php checked(in_array($category->cat_ID, $categories)) ?> />
<?php echo $category->name ?>
</label>
</li>
<?php endforeach ?>
</ul>
<?php
}
Dan inilah fungsi pembaruan saya
Saya tertarik untuk menyimpan ID Kategori dalam array, yang merupakan angka, jadi saya gunakan array_map
dengan intval
untuk memastikan bahwa semua datum yang dikirimkan adalah bilangan bulat yang valid. Selain itu, saya gunakan array_filter
untuk menghapus kiriman yang tidak valid.
// @param array $a - the new instance options
// @param arram $b - the old instance options
public function update($a, $b) {
return array(
'title' => isset($a['title']) ? strip_tags($a['title']) : $b['title'],
'categories' => isset($a['categories']) ? array_filter(array_map(function($id) { return intval($id); }, (array) $a['categories'])) : (array) $b['title']
);
}
Sangat sulit untuk menggambarkan hal-hal WordPress ini. Jika Anda memiliki pertanyaan, saya akan dengan senang hati menjelaskan.
$instance
adalah array dan berisi semua nilai. Dan apa yang Anda maksud dengan 'untuk menyimpan data semua bidang hanya dalam satu baris'? Apakah maksud Anda satu baris basis data?