webentwicklung-frage-antwort-db.com.de

Einstellungen API löscht sich selbst?

Ich habe zwei Formulare mit der Einstellungs-API erstellt, und wenn ich eines davon speichere, wird das andere gelöscht und umgekehrt.

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

// 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 "<input id=". $args ." name='XX_theme_settings[". $args ."]' size='40' type='text' value='{$options[$args]}' />";   
 }

//Generate textarea callback    
 function textarea($args) {
    $options = get_option('XX_theme_settings');
    echo "<textarea id=". $args ." name='XX_theme_settings[". $args ."]' rows='7' cols='50' type='textarea'>{$options[$args]}</textarea>";
 }

//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() { ?>
   <form action="options.php" method="post">
   <?php settings_fields('XX_theme_settings'); do_settings_sections('page1'); ?>
   <p class="submit">  <input name="Submit" type="submit" class="button-primary" value="<?php _e('Save Changes'); ?>" /></p> 
   </form>

   <pre><?php echo var_dump(get_option('XX_theme_settings')); ?></pre>

<?php }

//Generate Page2 form
function theme_options_page2() { ?> 
   <form action="options.php" method="post">
   <?php settings_fields('XX_theme_settings'); do_settings_sections('page2'); ?>
   <p class="submit">  <input name="Submit" type="submit" class="button-primary" value="<?php _e('Save Changes'); ?>" /></p> 
   </form>

   <pre><?php echo var_dump(get_option('XX_theme_settings')); ?></pre>

<?php } ?>

Ich weiß, dass ich (noch) keine Daten validiere, aber ich denke, es sollte einfach sofort funktionieren (und nicht jedes Mal das gesamte Array analysieren), oder? Was schief gelaufen ist?

1
Wordpressor

Der Grund dafür ist, dass, wenn Sie sich auf Seite 1 befinden, die zu speichernden Daten ein Array der folgenden Form sind:

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

und enthält keine Daten von Seite 2.

Dies liegt daran, dass die Eingaben von Seite 2 nicht mit veröffentlicht werden (da sie nicht im selben <form>- enthalten sind, befinden sie sich nicht auf der Seite). Wenn also das XX_theme_settings-Array in der Datenbank gespeichert wird, enthält es keine Daten von Seite 2.

Ebenso bedeutet das Speichern auf Seite 2, dass sich keine Daten von Seite 1 im Array befinden. Da dieses Array das Array in der Datenbank vollständig ersetzt (d. H. Nicht zusammengeführt), gehen alle Daten von Seite 1 verloren.

Hinweis: Es wird immer nur ein 'Formular' gesendet (und so erhalten) - Sie sollten also sicherstellen, dass alle Ihre Abschnitte in einem Formular enthalten sind.(Es kann den Anschein erwecken, dass es sich um unterschiedliche Formulare handelt, die nach jedem Abschnitt eine Senden-Schaltfläche enthalten. Jede Senden-Schaltfläche speichert jedoch alle Einstellungen.).

Das Einfügen der Felder in einen <form> behebt das Problem. Wenn Sie darauf bestehen, dass sie sich auf verschiedenen Seiten befinden, besteht eine einfache Lösung darin, für jede Seite einen anderen Datensatz in der Datenbank zu haben .

Alternativ können Sie in Ihrem Validierungs-Callback des XX_theme_settings-Arrays dieses Array mit dem vorhandenen Array in der Datenbank zusammenführen, sodass alle 'fehlenden' Daten mit ihrem aktuellen Wert in der Datenbank hinzugefügt werden. (Siehe array_merge )

Hinweis: Wenn ein Kontrollkästchen deaktiviert ist, sendet es nichts und wird daher als "fehlend" betrachtet. Dies macht die zweite Option etwas knifflig (d. H. Fehlen die Daten, weil sie nicht veröffentlicht wurden (falsche Seite) oder weil sie ein Kontrollkästchen sind und nicht aktiviert wurden). Umthiszu umgehen, müssten Sie ermitteln, welche Seitendaten gesendet wurden, und wenn Daten aus einem Kontrollkästchen auf dieser Seite fehlen, den Wert auf 0 setzen. vorvor dem Zusammenführen. Sie können dies tun, indem Sie für jede Seite separate Validierungsrückrufe durchführen (es könnte einen anderen/besseren Weg geben).

Wie in den Kommentaren unter @ ChipBennettangegeben, kann die Seite bestimmt werden, indem der Senden-Schaltfläche ein Name zugewiesen wird, der die Seite angibt.

4
Stephen Harris