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