A resposta acima é boa se você precisar que os campos sejam numerados. No meu caso, eu não fiz. Eu tenho um widget com opções que permitem ao usuário selecionar qualquer número de categorias a serem usadas no widget.
Aqui está o meu widget form
. - Três coisas importantes aqui
- Certifique-se de que o valor padrão
array()
esteja vazio se o valor do widget não estiver definido
- No
<label>
name
atributo form , observe que eu anexo um []
no final. Isso diz ao PHP que estou enviando uma matriz de valores para essa chave
- Coloque a caixa de seleção no rótulo como
<label><input type="checkbox" ...></label>
. - Cada uma das nossas caixas de seleção não terá um id
atributo exclusivo ; portanto, o <label>
for
atributo não funcionará. Poderíamos gerar IDs únicos, mas isso é um aborrecimento. Se você apenas envolver o rótulo em torno da entrada, o rótulo será associado corretamente sem o incômodo de conectar o for
botão +id
Agora o código
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
}
E aqui está a minha função de atualização
Estou interessado em salvar os IDs de categoria em uma matriz, que são números, portanto, uso array_map
com intval
para garantir que todos os dados enviados sejam números inteiros válidos. Além disso, uso array_filter
para remover envios inválidos.
// @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']
);
}
É particularmente desafiador descrever esse material do WordPress. Se você tiver alguma dúvida, ficarei feliz em elaborar.
$instance
é uma matriz e contém todos os valores. E o que você quer dizer com 'armazenar os dados de todos os campos em apenas uma linha'? Você quis dizer uma linha do banco de dados?