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.
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 $input
gesetzt 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. :)
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:
Definiere die aktuell gültigen Daten:
$valid_input = get_option( 'XX_theme_settings' );
$input
nur, wenn $input
Ihre Validierung/Bereinigung besteht.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;
}
?>