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á mi widget form
. - Tres cosas importantes aquí
- Asegúrese de predeterminar el valor a vacío
array()
si el valor del widget no está establecido
- En el
<label>
name
atributo de formulario , observe que adjunto un []
al final. Esto le dice a PHP que estoy enviando una matriz de valores para esta clave
- Envuelva la casilla de verificación en la etiqueta como
<label><input type="checkbox" ...></label>
. - Cada una de nuestras casillas de verificación no tendrá un id
atributo único , por lo que el <label>
for
atributo no funcionará. Podríamos generar ID únicos, pero eso es una molestia. Si solo ajusta 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 la identificación categoría en una matriz, que son los números, así que uso array_map
con intval
para asegurar que todo dato presentado son números 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 elaborarla.
$instance
es una matriz y contiene todos los valores. ¿Y qué quiere decir con "almacenar los datos de todos los campos en una sola fila"? ¿Quiso decir una fila de la base de datos?