Admin-Oberfläche: Settings API und Meta-Boxen
Begriffe vorab
- Admin-Menü: Einträge in der linken Backend-Leiste.
- Settings API: WordPress-Schnittstelle, um Einstellungen mit Bereichen und Feldern zu registrieren und sicher zu speichern.
- Meta-Box: ein Kasten im Beitragseditor für Zusatzfelder.
- Capability: eine einzelne Berechtigung wie
manage_options.
Eine Einstellungsseite in drei Schritten
Die Settings API übernimmt den mühsamen Teil: Nonce-Prüfung, Rechtekontrolle, Speichern und Sanitizing laufen über options.php. Du beschreibst nur, was gespeichert werden soll.
Schritt 1: Menü anlegen
add_action( 'admin_menu', function () {
add_options_page(
'Merkzettel', 'Merkzettel',
'manage_options', 'merkzettel',
'mz_render_settings'
);
} );
Schritt 2: Einstellung registrieren
add_action( 'admin_init', function () {
register_setting( 'mz_group', 'mz_settings', array(
'type' => 'array',
'sanitize_callback' => 'mz_sanitize_settings',
'default' => array( 'max_items' => 50 ),
) );
add_settings_section( 'mz_main', 'Allgemein', '__return_false', 'merkzettel' );
add_settings_field( 'max_items', 'Maximale Einträge', 'mz_field_max', 'merkzettel', 'mz_main' );
} );
function mz_sanitize_settings( $in ) {
return array( 'max_items' => max( 1, min( 500, absint( $in['max_items'] ?? 50 ) ) ) );
}
function mz_field_max() {
$o = get_option( 'mz_settings', array( 'max_items' => 50 ) );
printf( '<input type="number" name="mz_settings[max_items]" value="%d" min="1" max="500">', (int) $o['max_items'] );
}
Schritt 3: Seite ausgeben
function mz_render_settings() {
if ( ! current_user_can( 'manage_options' ) ) { return; }
echo '<div class="wrap"><h1>Merkzettel</h1><form method="post" action="options.php">';
settings_fields( 'mz_group' );
do_settings_sections( 'merkzettel' );
submit_button();
echo '</form></div>';
}
settings_fields() gibt das versteckte Nonce-Feld und die Gruppe aus; options.php prüft beides und ruft deinen sanitize_callback auf. Die Prüfung der Bereichsgrenzen dort ist wichtig, weil niemand dem Formular vertrauen darf.
Meta-Box mit sicherem Speichern
add_action( 'add_meta_boxes', function () {
add_meta_box( 'mz_box', 'Merkzettel', 'mz_box_html', 'post', 'side' );
} );
function mz_box_html( $post ) {
wp_nonce_field( 'mz_save', 'mz_nonce' );
$v = get_post_meta( $post->ID, '_mz_note', true );
printf( '<textarea name="mz_note">%s</textarea>', esc_textarea( $v ) );
}
add_action( 'save_post', function ( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; }
if ( ! isset( $_POST['mz_nonce'] ) || ! wp_verify_nonce( $_POST['mz_nonce'], 'mz_save' ) ) { return; }
if ( ! current_user_can( 'edit_post', $post_id ) ) { return; }
update_post_meta( $post_id, '_mz_note', sanitize_textarea_field( wp_unslash( $_POST['mz_note'] ?? '' ) ) );
} );
Die drei Prüfungen im Speichern-Callback – Autosave überspringen, Nonce verifizieren, Recht prüfen – gehören immer zusammen. Fehlt eine, entsteht entweder ein Sicherheitsloch oder ein Fehler beim automatischen Zwischenspeichern.
Zum Selbermachen
- Baue die Einstellungsseite nach und speichere einen Wert außerhalb des erlaubten Bereichs – er wird begrenzt.
- Füge ein zweites Feld (Checkbox) hinzu und erweitere den Sanitizer.
- Prüfe in der Datenbank, wie die Option als Array gespeichert wird.
Prüfstatus: Belegt (Stand 1. Oktober 2026): Jahreszahlen, Zahlen, Namen und Quellenangaben dieser Lektion, soweit die Quellenliste sie nennt, wurden gegen Primärquellen geprüft. Nicht einzeln belegt: erklärende Darstellung nach Lehrbuchstand und Quellen, die in der Liste als „allgemeine Referenz“ markiert sind. Codebeispiele sind nur auf Syntax geprüft, nicht in WordPress ausgeführt.
Quellen
- WordPress Plugin Handbook – „Settings API“ und „Administration Menus“ (developer.wordpress.org/plugins/settings/) (allgemeine Referenz, nicht Zeile für Zeile geprüft)
- WordPress Developer Resources – Funktionsreferenzen zu register_setting(), add_settings_field(), add_meta_box() (allgemeine Referenz, nicht Zeile für Zeile geprüft)
- WordPress Plugin Handbook – „Security: Nonces, Data Validation“ (developer.wordpress.org/plugins/security/) (allgemeine Referenz, nicht Zeile für Zeile geprüft)