La respuesta anterior es buena si necesita que los campos estén numerados. En mi caso, no lo hice. Tengo un widget con opciones que permiten al usuario seleccionar cualquier número de categorías para usar dentro del widget.

Aquíestámiwidgetform
.-Trescosasimportantesaquí
- Asegúresedequeelvalorpredeterminadoseaun
array()
vacíosielvalordelwidgetnoestáestablecido - Enlaforma
<label>
name
atributo,observequeadjuntoun[]
alfinal.EstolediceaPHPqueestoyenviandounamatrizdevaloresparaestaclave - Envuelvelacasilladeverificaciónenlaetiquetacomo
<label><inputtype="checkbox" ...></label>
. - Cada una de nuestras casillas de verificación no tendrá un atributo único id
, por lo que el atributo <label>
for
no funcionará. Podríamos generar identificaciones únicas, pero eso es una molestia. Si simplemente envuelve la etiqueta alrededor de la entrada, la etiqueta se asociará correctamente sin la molestia de conectar el for
+ id
Ahora el 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
}
Y aquí está mi función de actualización
Estoy interesado en guardar los ID de categoría en una matriz, que son números, así que uso array_map
con intval
para garantizar que todos los datos enviados sean enteros válidos. Además, uso array_filter
para eliminar cualquier envío no válido.
// @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']
);
}
Es particularmente desafiante describir estas cosas de WordPress. Si tiene alguna pregunta, estaré encantado de explicarlo.