Bei einem Projekt musste ich kürzlich auf einer Settings-Seite im Backend neben eigenen Optionen auch die Core-Option für den Inhalt der Startseite und für die Blogseite einbauen. Das war allerdings nicht so einfach, wie ich erst gedacht hatte, weil die Settings-API genau prüft, welche Optionen von einer Einstellungs-Seite abgeschickt werden dürfen und nur diese abspeichert.
Das »Problem« mit der Settings-API
Eigentlich ist es kein wirkliches Problem, sondern wünschenswert: bei Nutzung der Settings-API wird register_setting()
genutzt, um Optionen zu registrieren, die von der API verarbeitet werden. Als ersten Parameter erwartet die Funktion den Namen der Options-Gruppe und als zweiten den Namen der Option, der als option_name
in der Datenbank genutzt wird.
Beim Speichern der Einstellungen werden in der options.php
nur die Formularwerte für die Optionen verarbeitet, die über register_setting()
registriert wurden. In meinem Fall konnte ich für die Core-Optionen allerdings nicht register_setting()
nutzen, weshalb die API die Optionen beim Speichern einfach ignoriert hat.
Die Lösung: allowed_options
-Filter
Die Lösung zu dem Problem ist der allowed_options
-Filter, mit dem das Array der erlaubten Optionen für die Optionengruppen gefiltert werden kann. So konnte ich die Optionen show_on_front
, page_on_front
und page_for_posts
meiner Gruppe hinzufügen und sie von der API speichern lassen:
add_filter( 'allowed_options', function( $allowed_options ) {
if ( ! is_array( $allowed_options ) || ! isset( $allowed_options['flobn_settings'] ) ) {
return $allowed_options;
}
array_push( $allowed_options['flobn_settings'], 'show_on_front', 'page_on_front', 'page_for_posts' );
return $allowed_options;
}, 20 );
Code-Sprache: PHP (php)
Mich würde ja noch der Use-Case interessieren, warum du das in den eigenen Settings benötigt hast. Kannst/Darfst du den auch teilen?
Einfach nur, damit die ganzen Einstellungen, die beim Einrichten einer Site in einer Multisite genutzt werden, auf einer Seite sind 🙂
Schöne Idee!