Приведенный выше ответ хорош, если вам нужно, чтобы поля были пронумерованы. В моем случае я не сделал. У меня есть виджет с параметрами, которые позволяют пользователю выбирать любое количество категорий для использования в виджете.

Вот мой виджет 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является массивом и содержит все значения. И что вы подразумеваете под «хранить данные всех полей в одной строке»? Вы имели в виду одну строку базы данных?