Usiłuję zautomatyzować, w miarę możliwości, wywołania funkcji API ustawień dla każdego ustawienia we wtyczce. Pętla w tablicy opcji oraz wyprowadzanie add_settings_section()
i add_settings_field()
jest dość prosta:
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'
);
}
}
I `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
);
}
Za pomocą add_settings_field()
mogę łatwo napisać ogólne wywołanie zwrotne, przekazując $hook
zmienną do wywołania zwrotnego, jako piąty parametr w wywołaniu funkcji:
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
}
Wydaje się jednak, że add_settings_section()
nie ma analogicznego $args
parametru; dlatego nie mogę użyć tej samej metody do przekazania $section
zmiennej do wywołania zwrotnego.
Zatem moje pytanie: czy jest jakiś sposób przekazania zmiennej do add_settings_section()
wywołania zwrotnego, czy jakiś inny sposób utworzenia wywołania zwrotnego analogicznego do tego, co robię add_settings_field()
?
EDYTOWAĆ:
@Bainternet przybił go! Oto mój działający kod:
/**
* 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
}
}
}
}
źródło
extract( $args, EXTR_SKIP );
na początkuoenology_hooks_setting_callback()
, więc nie musisz zapisywać każdej części tablicy w nowej$var
? Będą one wówczas dostępne$'name_inside_the_array
np. „$ title,
$ tab” itp.Odpowiedzi:
jeśli spojrzysz na funkcję do_settings_sections, a dokładniej na linię 1164, w której wykonywana jest funkcja zwrotna:
widać, że tablica sekcji $ jest przekazywana do funkcji zwrotnej, dzięki czemu można zidentyfikować wywołanie zwrotne za pomocą
$section['id']
mam nadzieję, że tak się stanie.
Aktualizacja
oto przykład, jeśli nazwa twojego wywołania zwrotnego add_settings_section dla wszystkich sekcji została nazwana
oenology_hooks_section_callback
, możesz to zidentyfikować w następujący sposób:a przez robienie rzeczy mam na myśli robienie, co chcesz zrobić z wywołaniem zwrotnym tej sekcji.
źródło
$section['id']
?id
będzie pierwszym argumentem, który przekażeszadd_settings_section()
Wiem, że to stare pytanie, ale wrzucę moje dwa centy, na wypadek, gdyby przyszedł ktoś inny; najprościej byłoby napisać własną modyfikację
add_settings_section()
funkcji, która dodawałaby tylko parametr args wywołania zwrotnego na końcu.To by wyglądało tak (lub coś takiego)
Teraz wystarczy użyć tego zamiast natywnej funkcji wordpress i uzyskać dostęp do argumentów wywołania zwrotnego za pomocą
'callbackargs'
klawisza tablicy w zwykły sposób, taki jak tenKtórego możemy użyć, aby przejść do innej funkcji:
Lub argumentami wywołania zwrotnego może być sama tablica, której używamy:
Jest to możliwe, ponieważ wszystko, co
add_settings_section()
robi, to dodanie nowego elementu tablicy do$wp_settings_sections
zmiennej globalnej, tym nowym elementem tablicy może być sama tablica zawierająca dowolną liczbę kluczy o różnych nazwach, z których mogłaby korzystać dowolna funkcja, która wiedziała, że tam są. Kiedydo_settings_sections
nazywacall_user_func_array
to przechodzi$sections
paramater jak zauważył Bainternet, oznacza to, że cała tablica dodaliśmy do$wp_settings_sections
wmy_add_settings_section()
przepuszcza do naszego zwrotnego, co oznacza, że mamy dostęp do każdego nowego członka tablicy dodamy do niego takie jakcallbackargs
pozwalając naszej funkcji, aby mieć pełny rozwinięty callback.Chociaż jestem pewien, że może to być oczywiste, pomyślałem, że wytłumaczę to na wypadek, gdyby ktoś się zagubił.
źródło
Zawsze możesz także zastosować bardziej ogólne podejście, nie szukając konkretnej implementacji funkcji (tzn. Bez sprawdzania, czy add_settings_section przekazuje cokolwiek pośrednio). To ogólne podejście wykorzystuje zamknięcie PHP.
Jak tego używać: w każdym miejscu, w którym przekazujesz nazwę funkcji, zamiast niej przekazujesz funkcję anonimową, z jej użyciem .
Przykład:
zamiast
możesz użyć:
źródło