Wie funktioniert die checked () -function mit mehreren Kontrollkästchen-Gruppen? Wie man diese Checkboxgruppe richtig saniert?

Ich verwende die Themenoptionen-Seite des Unterstrichs (_s) , um eine Seite mit Themenoptionen zu erstellen, und ich habe eine Gruppe von Kontrollkästchen darauf. Im folgenden Beispiel habe ich der Einfachheit halber nur 2 hinzugefügt.

Meine Fragen sind:

  1. Was bedeutet die function checked (), um jedes Kontrollkästchen beim Speichern aktiviert zu lassen? Ich muss jeden Wert gegen den Wert in der DB richtig prüfen?
  2. Wie säubere ich die Checkbox-Gruppe richtig? Sie scheinen der DB Geld zu sparen, aber ich weiß, dass ich etwas falsch mache.

Hier ist jeder relevante Codeblock:

// register setting register_setting( 'options', // Options group 'theme_options', // Database option 'theme_options_validate' // The sanitization callback, see below ); // add settings field add_settings_field( 'post_sharing_networks', 'Post Sharing Networks To Show', 'settings_field_post_sharing_networks', // callback below 'theme_options', 'general' ); // set up the array // more will be added later. 2 shown here for simplicity function post_sharing_networks() { $post_sharing_networks = array( 'twitter' => array( 'value' => 'twitter', 'label' => 'Twitter' ), 'facebook' => array( 'value' => 'facebook', 'label' => 'Facebook' ), ); return $post_sharing_networks; } // callback function settings_field_post_sharing_networks() { $options = get_option( 'theme_options' ); // get array of all the theme options $post_sharing_networks = $options['post_sharing_networks']; // this will get array for just the post sharing networks // eg /* array (size=2) 'twitter' => string '1' (length=1) 'facebook' => string '1' (length=1) */ // builds the checkbox list form the post_sharing_networks() function foreach ( post_sharing_networks() as $network ) { ?>  <?php } } // sanitization callback function theme_options_validate( $input ) { $output = array(); // how do I properly sanitize the checkbox group? // it saves the checkboxes to DB fine currently but I think it can be improved $options = get_option( 'theme_options' ); foreach ( post_sharing_networks() as $network ) { if ( isset( $options['post_sharing_networks'] ) ) $output['post_sharing_networks'] = $input['post_sharing_networks']; } return apply_filters( 'theme_options_validate', $output, $input ); } 

So sieht es aus, wenn es in der Tabelle wp_options gespeichert wird

 s:21:"post_sharing_networks";a:2:{s:7:"twitter";s:1:"1";s:8:"facebook";s:1:"1";} 

Solutions Collecting From Web of "Wie funktioniert die checked () -function mit mehreren Kontrollkästchen-Gruppen? Wie man diese Checkboxgruppe richtig saniert?"

So überprüft ist ziemlich einfach zu verstehen. Es vergleicht die ersten beiden Werte. Wenn sie gleich sind, spuckt sie checked="checked" wenn sie nicht gleich sind, passiert nichts.

 < ?php $saved = 'on'; $compare = 'on' // spits out checked="checked" checked($saved, $compare); $saved = 'off'; // does nothing checked($saved, $compare); 

Wie Sie die Checkboxen speichern, bleibt Ihnen überlassen. Aufgrund der Art und Weise, wie Dinge serialisiert werden, speichere ich gerne "checked" -Werte als ein- und deaktivierte Werte als off .

Um das zu bereinigen, würdest du so etwas tun:

 < ?php function wpse74685_clean_option($dirty) { $clean = array( 'post_sharing_networks' => array(), ); // $dirty['post_sharing_networks'] will contain the array of // of your checkbox values, so check to make sure its there // then loop through. if(!empty($dirty['post_sharing_networks'])) { // if the box was checked, the value will be there // if not nothing will be there. foreach(post_sharing_networks() as $network) $clean['post_sharing_networks'][$network['value']] = !empty($dirty['post_sharing_networks'][$network['value']]) ? 'on' : 'off'; } return $clean; } 

Dann rufst du nach checked an:

  />