Einstellungs-API löscht sich selbst?

Ich habe zwei Formulare, die mit der Einstellungs-API erstellt wurden, und wenn ich eine davon speicher, wird die andere gelöscht und umgekehrt.

Hier ist der ganze Code, damit Sie ihn in Ihre functions.php-Datei einfügen können und sehen Sie selbst:

// Register settings function registerSettings() { register_setting('XX_theme_settings', 'XX_theme_settings' ); add_settings_section('theme_options', 'Theme Options', 'theme_options_generate', 'page1' ); add_settings_field( 'XX_Option1', 'Option 1', 'text_input', 'page1', 'theme_options', 'XX_Option1' ); add_settings_field( 'XX_Option2', 'Option 2', 'text_input', 'page1', 'theme_options', 'XX_Option2' ); add_settings_field( 'XX_Option3', 'Option 3', 'textarea', 'page1', 'theme_options', 'XX_Option3'); add_settings_field( 'XX_Option4', 'Option 4', 'textarea', 'page1', 'theme_options', 'XX_Option4'); add_settings_section('theme_options2', 'Theme Options2', 'theme_options_generate2', 'page2' ); add_settings_field( 'XX_Option5', 'Option 5', 'text_input', 'page2', 'theme_options2', 'XX_Option5' ); add_settings_field( 'XX_Option6', 'Option 6', 'text_input', 'page2', 'theme_options2', 'XX_Option6' ); add_settings_field( 'XX_Option7', 'Option 7', 'textarea', 'page2', 'theme_options2', 'XX_Option7'); add_settings_field( 'XX_Option8', 'Option 8', 'textarea', 'page2', 'theme_options2', 'XX_Option8'); }; add_action('admin_init', 'registerSettings'); //Generate section 1 function theme_options_generate() { echo 'This is a Settings Section 1'; } //Generate section 2 function theme_options_generate2() { echo 'This is a Settings Section 2'; } //Generate text input callback function text_input($args) { $options = get_option('XX_theme_settings'); echo ""; } //Generate textarea callback function textarea($args) { $options = get_option('XX_theme_settings'); echo ""; } //Add admin pages function registerMenus() { add_menu_page('Theme Options', 'Theme Options', 'edit_theme_options', 'theme_menu_slug', 'theme_options_page'); add_menu_page('Theme Options2', 'Theme Options2', 'edit_theme_options', 'theme_menu_slug2', 'theme_options_page2'); }; add_action('admin_menu', 'RegisterMenus'); //Generate Page1 form function theme_options_page() { ?> 

<input name="Submit" type="submit" class="button-primary" value="" />


<input name="Submit" type="submit" class="button-primary" value="" />


Ich weiß, dass ich Daten (noch) nicht validiere, aber ich denke, es sollte einfach funktionieren (und nicht jedes Mal das ganze Array auffrischen), out of the box, richtig? Was schief gelaufen ist?

Solutions Collecting From Web of "Einstellungs-API löscht sich selbst?"

Wenn Sie sich auf Seite 1 befinden, handelt es sich bei den zu sichernden Daten um ein Array des folgenden Formats:

 XX_theme_settings=array('XX_Option1' =>'input1','XX_Option2'=>'input2',...) 

und enthält keine Daten von Seite 2.

Dies liegt daran, dass die Eingabe von Seite 2 nicht mit ihr gepostet wird (da sie nicht in der gleichen

– sie ist nicht auf der Seite). Wenn also das Array XX_theme_settings in der database gespeichert wird, enthält es keine Daten von Seite 2.

Ebenso bedeutet das Speichern auf Seite 2, dass keine Daten von Seite 1 im Array vorhanden sind und da dieses Array das Array in der database ersetzt (dh sie werden nicht zusammengeführt), verlieren Sie alle Daten von Seite 1.

Hinweis: Es wird immer nur ein ‘Formular’ gesendet (und also empfangen) – Sie sollten also sicherstellen, dass Sie alle Ihre Abschnitte in einem Formular haben. (Sie können verschiedene Formen haben und haben nach jedem Abschnitt einen Absenden-Button – aber jeder Submit-Button speichert alle Einstellungen) .

Durch das Einfügen der Felder in ein

wird das Problem getriggers. Wenn Sie darauf bestehen, sie auf separaten Seiten zu haben, wäre eine einfache Lösung, für jede Seite einen anderen Datensatz in der database zu haben.

Alternativ könnten Sie in Ihrem validationsrückruf des Arrays XX_theme_settings dieses Array mit dem vorhandenen Array in der database zusammenführen, sodass alle fehlenden Daten mit dem aktuellen Wert in der database hinzugefügt werden. (Siehe array_merge )

Hinweis : Wenn ein Kontrollkästchen deaktiviert ist, wird nichts gesendet und wird daher als “fehlend” betrachtet. Dies macht die zweite Option etwas knifflig (dh die Daten fehlen, weil sie nicht gepostet wurden (falsche Seite) oder weil sie ein Kontrollkästchen ist und nicht geprüft wurde). Um dies zu umgehen, müssen Sie ermitteln, welche Daten gesendet wurden. Wenn Daten aus einem Kontrollkästchen auf dieser Seite fehlen, setzen Sie den Wert vor dem Zusammenführen auf 0. Sie können dies tun, indem Sie für jede Seite separate Bestätigungsrückrufe durchführen (es könnte einen anderen / besseren Weg geben).

Wie @ChipBennett in den Kommentaren feststellt, kann das Bestimmen der Seite erreicht werden, indem der Übergabeschaltfläche ein Name gegeben wird, der die Seite angibt.