wake-up-neo.net

Einstellungs-API - einfachste Möglichkeit zum Überprüfen von Kontrollkästchen?

Ich verwende die Einstellungs-API und kann keine Kontrollkästchen aktivieren. Wenn sie auf "false" gesetzt sind, sind sie nicht einmal "$ _POST", und genau darum geht es.

Stephen Harris & Chip Bennett erklärte es , aber ich glaube, ihr Weg ist nicht einfach genug (vor allem für mich, überhaupt nicht PHP-Typ). Benötige ich WIRKLICH ein paar benutzerdefinierte PHP - Funktionen und benutzerdefinierte Sende-Schaltflächen für jedes Formular, um diese einfache Sache zum Laufen zu bringen?

Meine Einstellungen sehen ungefähr so ​​aus:

register_setting('XX_theme_settings', 'XX_theme_settings', 'setting_validate' );

add_settings_section('theme_options', 'Theme Options', 'theme_options_generate', 'page1' ); 
add_settings_field( 'XX_Option1', 'Option 1', 'checkbox', 'page1', 'theme_options', 'XX_Option1', $args = array('id' => 'checkbox1', 'type' => 'checkbox') );
add_settings_field( 'XX_Option2', 'Option 2', 'checkbox', 'page1', 'theme_options', 'XX_Option2', $args = array('id' => 'checkbox2', 'type' => 'checkbox') ); 

Dann generiere ich Checkboxen mit dieser Callback-Funktion:

function checkbox($args) {
    $options = get_option('XX_theme_settings');
    echo '<input type="checkbox" name="'. $args['id'] .'" value="true"'; if($options[$args['id']]==true) { echo 'checked="checked'; }; echo '/>';
    echo $args['type'];  
}

Jetzt ist alles, was ich brauche, ein guter Rückruf zur Bestätigung:

function setting_validate($input) {
   // Firstly it should find all fields of type == "checkbox" 
   // (I'm not sure why should I check which field was just being sent, 
   // is updating all the checkboxes from different sections a big no-no?
   // it is much easier indeed.
   // Now set the ones missing to false/0 and the rest to true/1.
   // Then merge everything like below:

   $options = get_option('XX_theme_settings');
   $merged = array_merge($options, $input);  
   return $merged;  
}

Die Frage ist also: Wie liste ich alle Kontrollkästchen von Settings Api auf und setze dann die richtigen auf true?

Ich denke, es würde ungefähr so ​​aussehen:

$options = array(
        array(
            'id' => 'checkbox1',
            'type' => 'checkbox',
            'page' => 'page1',
         ),
        array(
            'id' => 'checkbox2',
            'type' => 'checkbox',
            'page' => 'page1',
         ),
);

function setting_validate($input) {
   foreach($options as $option) {
     if($option['type'] == "checkbox") { 
        //set it to 1 if sent
     }
   }

   $options = get_option('XX_theme_settings');
   $merged = array_merge($options, $input);  
   return $merged;  
}

Vielen Dank :)

So macht es Chip Bennett genau , aber trotz all dieser tollen Kommentare kann ich nicht verstehen, wie es genau funktioniert.

7
Wordpressor

Wenn die fragliche Einstellung $setting ist und ein Kontrollkästchentyp ist, validieren Sie sie folgendermaßen:

<?php
$valid_input[$setting] = ( isset( $input[$setting] ) && true == $input[$setting] ? true : false );
?>

In diesem Fall ist $input das Formulardaten, die an den Validierungs-Callback übergeben werden , wobei $input ein Array von Arrays ist. Die Validierungsmethode wird als Whitelisting bezeichnet, wobei das aktuelle Einstellungsarray aufgerufen wird (in diesem Fall als $valid_input) und jede Einstellung im Einstellungsarray nur aktualisiert wird, wenn der Wert in $input[$setting] besteht die Validierung.

Wenn das Kontrollkästchen bei Kontrollkästchen nicht set ist, wird die Einstellung selbst nicht im $input-Array eingetragen. Der erste Schritt, um es zu validieren, ist festzustellen, ob es in $inputgesetzt wurde. Der zweite Schritt besteht darin, sicherzustellen, dass der festgelegte Wert true ist (oder 'true' oder 'on' oder auf was auch immer Sie den Kontrollkästchenwert im Einstellungsformular festlegen). Wenn beide Bedingungen erfüllt sind, geben Sie true zurück. Andernfalls geben Sie false zurück.

Sehen Sie: Es ist wirklich ganz einfach. :)

Bearbeiten

Was das betrifft:

function setting_validate($input) {
   foreach($options as $option) {
     if($option['type'] == "checkbox") { 
        //set it to 1 if sent
     }
   }

   $options = get_option('XX_theme_settings');
   $merged = array_merge($options, $input);  
   return $merged;  
}

... das ist nicht genau die Art und Weise, wie Sie es tun möchten. Sie möchten den Rückgabewert auf valid options beschränken. Das heißt, Sie möchten explizit die Einstellungen zurückgeben, von denen Sie wissen, dass Sie sie definiert haben. Wenn jemand $input irgendwie mit zusätzlichen Daten - d. H. Bösartigem Code - füllen kann, übergibt Ihre Methode diese zusätzlichen Daten einfach direkt in die Datenbank .

Mach keine array_merge(). Aktualisieren Sie jeden $valid_options[$setting] separat/einzeln und geben Sie immer nur $valid_options zurück.

Hier ist der Prozess:

  1. Definiere die aktuell gültigen Daten:

    $valid_input = get_option( 'XX_theme_settings' );
    
  2. Aktualisieren Sie die aktuell gültigen Daten mit $input nur, wenn $input Ihre Validierung/Bereinigung besteht.
  3. Dann geben Sie die aktualisierten, aktuell gültigen Daten zurück.

Wenn die Felder generiert dynamisch werden, sollten Sie in Ihrem Validierungs-Callback auch sie dynamisch durchgehen. Sie haben dies richtig, mit foreach( $options as $option ).

Alles zusammen könnte so aussehen:

<?php
function setting_validate( $input ) {
    // Get current setting values
    $valid_options = get_option( 'XX_theme_options' );
    // Get option parameters array
    // Note: XX_theme_get_option_parameters() function
    // should be defined to return the array you've 
    // defined for $options
    $options = XX_theme_get_option_parameters();
    // Now step through the option parameters,
    // and validate each $input[$option]
    foreach( $options as $option ) {
         // If $option['type] is a checkbox
         if( 'checkbox' == $option['type'] ) { 
             // verify that $input[$option] is set
             // and is set with a valid value;
             // if so, set $valid_input[$option] to 1
             $valid_input[$option] = ( isset( $input[$option] && true == $input[$option] ? 1 : 0 );
         }
     }
     // Return the updated $valid_input array
     return $valid_input;
}
?>
4
Chip Bennett