Câu trả lời trên là tốt nếu bạn cần các trường được đánh số. Trong trường hợp của tôi, tôi đã không. Tôi có một tiện ích với các tùy chọn cho phép người dùng chọn bất kỳ số lượng danh mục sẽ được sử dụng trong tiện ích.
Đây là widget của tôi form
. - Ba điều quan trọng ở đây
- Đảm bảo mặc định giá trị thành trống
array()
nếu giá trị của widget không được đặt
- Trong
<label>
name
thuộc tính biểu mẫu , lưu ý rằng tôi đính kèm []
ở cuối. Điều này nói với PHP rằng tôi đang gửi một loạt các giá trị cho khóa này
- Bọc hộp kiểm trong nhãn như
<label><input type="checkbox" ...></label>
. - Mỗi hộp kiểm của chúng tôi sẽ không có id
thuộc tính duy nhất , vì vậy <label>
for
thuộc tính sẽ không hoạt động. Chúng tôi có thể tạo ID duy nhất, nhưng đó là một rắc rối. Nếu bạn chỉ bọc nhãn xung quanh đầu vào, nhãn sẽ được liên kết chính xác mà không gặp rắc rối khi kết nối for
+id
Bây giờ mã
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
}
Và đây là chức năng cập nhật của tôi
Tôi đang quan tâm đến việc tiết kiệm các ID loại trong một mảng, mà là những con số, vì vậy tôi sử dụng array_map
với intval
để đảm bảo rằng tất cả các dữ kiện nộp là các số nguyên có giá trị. Ngoài ra, tôi sử dụng array_filter
để loại bỏ bất kỳ đệ trình không hợp lệ.
// @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']
);
}
Thật khó để mô tả công cụ WordPress này. Nếu bạn có bất kỳ câu hỏi nào, tôi sẽ vui lòng giải thích.
$instance
là một mảng và chứa tất cả các giá trị. Và ý bạn là gì khi 'lưu trữ dữ liệu của tất cả các trường chỉ trong một hàng'? Ý của bạn là một hàng cơ sở dữ liệu?