Ich versuche, die Einstellungen-API-Funktion für jede Einstellung in einem Plugin so weit wie möglich zu automatisieren. Das Options-Array durchlaufen und ausgeben add_settings_section()
und add_settings_field()
ist einfach genug:
add_settings_section()
:
$oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
foreach ( $oenology_hooks_tabs as $tab ) {
$tabname = $tab['name'];
$tabtitle = $tab['title'];
$tabsections = $tab['sections'];
foreach ( $tabsections as $section ) {
$sectionname = $section['name'];
$sectiontitle = $section['title'];
$sectiondescription = $section['description'];
// Add settings section
add_settings_section(
'oenology_hooks_' . $sectionname . '_section',
$sectiontitle,
'oenology_hooks_' . $sectionname . '_text',
'oenology_hooks_' . $tabname . '_tab'
);
}
}
Und `add_settings_field ():
global $oenology_hooks;
$oenology_hooks = oenology_hooks_get_hooks();
foreach ( $oenology_hooks as $hook ) {
$hookname = $hook['name'];
$hooktitle = $hook['title'];
$hooktab = $hook['tab'];
$hooksection = $hook['section'];
add_settings_field(
'oenology_hooks_' . $hookname,
$hooktitle,
'oenology_hooks_setting_callback',
'oenology_hooks_' . $hooktab . '_tab',
'oenology_hooks_' . $hooksection . '_section',
$hook
);
}
Mit add_settings_field()
kann ich einfach einen generischen Callback schreiben, indem ich die $hook
Variable an den Callback als fünften Parameter im Funktionsaufruf übergebe:
function oenology_hooks_setting_callback( $hook ) {
$oenology_hooks_options = get_option( 'plugin_oenology_hooks_settings' );
$hookname = $hook['name'];
$hooktitle = $hook['title'];
$hookdescription = $hook['description'];
$hooktype = $hook['type'];
$hooktab = $hook['tab'];
$hooksection = $hook['section'];
$inputvalue = $hookname . '_hide';
$inputname = 'plugin_oenology_hooks_settings[' . $inputvalue . ']';
$textareaname = 'plugin_oenology_hooks_settings[' . $hookname . ']';
$textareavalue = $oenology_hooks_options[$hookname];
if ( 'Filter' == $hooktype ) {
?>
<input type="checkbox" name="<?php echo $inputname; ?>" value="<?php echo $inputvalue;?>" <?php checked( true == $oenology_hooks_options[$inputvalue] ); ?> />
<span>Hide <?php echo $hooktitle; ?> content?</span><br />
<?php
}
?>
<span class="description"><?php echo $hooktype; ?> Hook: <?php echo $hookdescription; ?></span><br />
<textarea name="<?php echo $textareaname; ?>" cols="80" rows="3" ><?php
echo esc_textarea( $textareavalue );
?></textarea>
<?php
}
Es scheint jedoch, dass add_settings_section()
es keinen analogen $args
Parameter gibt. Daher kann ich nicht dieselbe Methode verwenden, um die $section
Variable an den Rückruf zu übergeben.
Daher meine Frage: Gibt es eine Möglichkeit, eine Variable an den add_settings_section()
Rückruf zu übergeben, oder eine andere Möglichkeit, einen Rückruf zu erstellen, die der Vorgehensweise entspricht add_settings_field()
?
BEARBEITEN:
@Bainternet hat es geschafft! Hier ist mein Arbeitscode:
/**
* Callback for add_settings_section()
*
* Generic callback to output the section text
* for each Plugin settings section.
*
* @param array $section_passed Array passed from add_settings_section()
*/
function oenology_hooks_sections_callback( $section_passed ) {
global $oenology_hooks_tabs;
$oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
foreach ( $oenology_hooks_tabs as $tab ) {
$tabname = $tab['name'];
$tabsections = $tab['sections'];
foreach ( $tabsections as $section ) {
$sectionname = $section['name'];
$sectiondescription = $section['description'];
$section_callback_id = 'oenology_hooks_' . $sectionname . '_section';
if ( $section_callback_id == $section_passed['id'] ) {
?>
<p><?php echo $sectiondescription; ?></p>
<?php
}
}
}
}
quelle
extract( $args, EXTR_SKIP );
am Anfang vonoenology_hooks_setting_callback()
, damit Sie nicht jeden Teil des Arrays in einem neuen speichern müssen$var
? Diese werden dann zum Beispiel mit verfügbar sein$'name_inside_the_array
. "$ title,
$ tab" usw.Antworten:
Wenn Sie sich die Funktion do_settings_sections genauer ansehen, sehen Sie sich die Zeile 1164 an, in der die Rückruffunktion ausgeführt wird:
Sie können sehen, dass das Array "$ section" an die Rückruffunktion übergeben wird, sodass Sie den Rückruf anhand von identifizieren können
$section['id']
hoffe das macht da.
Aktualisieren
Hier ein Beispiel: Wenn Ihr Rückruf für add_settings_section für alle Abschnitte benannt wurde
oenology_hooks_section_callback
, können Sie ihn folgendermaßen identifizieren:und mit "do stuff" meine ich, mach was du willst mit diesem Abschnitt Rückruf.
quelle
$section['id']
?id
ist das erste Argument, an das Sie sichadd_settings_section()
Ich weiß, dass dies eine alte Frage ist, aber ich werfe meine zwei Cent ein, nur für den Fall, dass jemand anderes mitkommt. Eine einfachere Möglichkeit besteht darin, eine eigene Modifikation der
add_settings_section()
Funktion zu schreiben , bei der nur am Ende ein Callback-Parameter args hinzugefügt wird.Das würde so aussehen (oder so ähnlich)
Jetzt würden Sie einfach diese Funktion anstelle der nativen WordPress-Funktion verwenden und wie folgt über die
'callbackargs'
Array-Taste auf Ihre Callback-Argumente zugreifenWomit wir eine andere Funktion übergeben könnten:
Oder die Callback-Argumente könnten selbst ein Array sein, das wir verwenden:
Dies ist alles möglich, da
add_settings_section()
der$wp_settings_sections
globalen Variablen lediglich ein neues Arraymitglied hinzugefügt wird. Dieses neue Arraymitglied kann ein Array sein, das eine beliebige Anzahl von Schlüsseln mit unterschiedlichen Namen enthält, die von jeder Funktion verwendet werden können, die wusste, dass sie vorhanden sind. Wenndo_settings_sections
die Anrufecall_user_func_array
übergibt es eine$sections
Paramater wie Bainternet erwähnt, bedeutet dies , dass das gesamte Array fügten wir$wp_settings_sections
inmy_add_settings_section()
in unserem Rückruf geführt wird, bedeutet , dass wir Zugang zu jedem neuen Array Mitglied haben wir es wie die hinzufügen ,callbackargs
so dass unsere Funktion eine vollständige haben flügge Rückruf.Obwohl ich mir sicher bin, dass dies offensichtlich sein könnte, dachte ich, dass ich es nur erklären würde, falls jemand, der verwirrt ist, hereinschaut.
quelle
Sie können auch immer einen allgemeineren Ansatz verwenden und nicht nach der bestimmten Funktionsimplementierung suchen (dh ohne zu prüfen, ob add_settings_section implizit etwas übergibt). Dieser allgemeine Ansatz verwendet PHP-Closure.
So verwenden Sie es: Übergeben Sie an jeder Stelle, an der Sie einen Funktionsnamen übergeben, eine anonyme Funktion, die Sie verwenden.
Beispiel:
Anstatt von
Sie können verwenden:
quelle