Die obige Antwort ist gut, wenn die Felder nummeriert werden müssen. In meinem Fall habe ich nicht. Ich habe ein Widget mit Optionen, mit denen der Benutzer eine beliebige Anzahl von Kategorien auswählen kann, die innerhalb des Widgets verwendet werden sollen.
Hier ist mein Widget form
. - Drei wichtige Dinge hier
- Stellen Sie sicher, dass der Wert standardmäßig leer ist,
array()
wenn der Wert des Widgets nicht festgelegt ist
- Beachten Sie im Formularattribut
<label>
name
, dass ich []
am Ende ein anhänge. Dies teilt PHP mit, dass ich ein Array von Werten für diesen Schlüssel sende
- Wickeln Sie das Kontrollkästchen in das Etikett ein als
<label><input type="checkbox" ...></label>
. - Jedes unserer Kontrollkästchen hat kein eindeutiges id
Attribut, daher <label>
for
funktioniert das Attribut nicht. Wir könnten eindeutige IDs generieren, aber das ist ein Ärger. Wenn Sie das Etikett nur um die Eingabe wickeln , wird das Etikett ordnungsgemäß zugeordnet, ohne dass das for
+ mühsam angeschlossen werden mussid
Nun der Code
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
}
Und hier ist meine Update-Funktion
Ich bin in die Rettung der Kategorie IDs in einem Array interessiert, die Zahlen sind, so dass ich array_map
mit , intval
um sicherzustellen , dass alle eingereichten Datum gültig ganze Zahlen sind. Außerdem array_filter
entferne ich ungültige Einsendungen.
// @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 ist besonders schwierig, dieses WordPress-Zeug zu beschreiben. Wenn Sie Fragen haben, werde ich gerne näher darauf eingehen.
$instance
ist ein Array und enthält alle Werte. Und was meinen Sie mit "Speichern der Daten aller Felder in nur einer Zeile"? Meinten Sie eine Datenbankzeile?