Наведена вище відповідь хороша, якщо вам потрібно пронумерувати поля. У моєму випадку я цього не зробив. У мене є віджет з опціями, які дозволяють користувачеві вибирати будь-яку кількість категорій, які будуть використовуватися у віджеті.
Ось мій віджет form
. - Тут три важливі речі
- Переконайтеся, що значення за замовчуванням є порожнім,
array()
якщо значення віджета не встановлено
- У
<label>
name
атрибуті форми зауважте, що я додаю в []
кінці. Це говорить PHP, що я надсилаю масив значень для цього ключа
- Загорніть прапорець у мітку як
<label><input type="checkbox" ...></label>
. - Кожен наш прапорець не матиме унікального id
атрибуту, тому <label>
for
атрибут не працюватиме. Ми можемо генерувати унікальні ідентифікатори, але це клопот. Якщо ви просто обмотаєте мітку навколо введення, мітка стане належним чином пов’язаною без зайвих проблем з підключенням for
+id
Тепер код
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
}
І ось моя функція оновлення
Я зацікавлений в збереженні Категорії ідентифікаторів в масиві, які є числами, тому я використовую array_map
з , intval
щоб гарантувати , що всі відправлені ИГД є дійсними числами. Крім того, я використовую array_filter
для видалення недійсних даних.
// @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']
);
}
Особливо складно описати цей матеріал WordPress. Якщо у вас виникнуть запитання, я буду радий детальніше.
$instance
є масивом і містить усі значення. А що ви маєте на увазі під "зберіганням даних усіх полів лише в одному рядку"? Ви мали на увазі один рядок бази даних?