J'essaie d'automatiser autant que possible les appels de fonction de l'API de paramètres pour chaque paramètre d'un plug-in. Faire une boucle dans le tableau d'options et sortir add_settings_section()
et add_settings_field()
est assez simple:
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'
);
}
}
Et `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
);
}
Avec add_settings_field()
, je peux facilement écrire un rappel générique en transmettant la variable $hook
au rappel, en tant que cinquième paramètre de l'appel de fonction:
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
}
Cependant, il semble que add_settings_section()
ne possède pas de paramètre $args
analogue; ainsi, je ne peux pas utiliser la même méthode pour transmettre la variable $section
au rappel.
Ainsi, ma question: est-il possible de passer une variable au callback add_settings_section()
, ou un autre moyen de créer un rappel analogue à ce que je fais pour add_settings_field()
?
MODIFIER:
@Bainternet l'a cloué! Voici mon code de travail:
/**
* 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
}
}
}
}
si vous regardez la fonction do_settings_sections plus précisément la ligne 1164 où la fonction de rappel est en cours d'exécution:
call_user_func($section['callback'], $section);
vous pouvez voir que le tableau $ section est en train d'être passé à la fonction de rappel, de sorte que vous puissiez identifier le rappel par le $section['id']
j'espère que cela fait depuis.
voici un exemple, si votre callback add_settings_section pour toutes les sections s'appelait oenology_hooks_section_callback
, vous pouvez l'identifier comme ceci:
function oenology_hooks_section_callback($section_passed){
if ($section_passed['id'] == 'whatever_section_id'){
//do stuff
}
if ($section_passed['id'] == 'whatever_section_id_number2'){
//do other stuff
}
}
et par faire des choses que je veux dire, faites ce que vous voulez faire avec ce rappel de section.
Je sais que c’est une vieille question, mais je vais mettre mes deux sous, au cas où quelqu'un d’autre viendrait; une façon plus simple de le faire serait d’écrire votre propre modification de la fonction add_settings_section()
, ce qui n’ajouterait qu’un paramètre callback args à la fin.
Cela ressemblerait à ceci (ou quelque chose comme ça)
function my_add_settings_section($id, $title, $callback, $page, $callbackargs) {
global $wp_settings_sections;
if ( !isset($wp_settings_sections) )
{
$wp_settings_sections = array();
}
if ( !isset($wp_settings_sections[$page]) )
{
$wp_settings_sections[$page] = array();
}
if ( !isset($wp_settings_sections[$page][$id]) )
{
$wp_settings_sections[$page][$id] = array();
}
$wp_settings_sections[$page][$id] = array( 'id' => $id, 'title' => $title, 'callback' => $callback, 'callbackargs' => $callbackargs, 'page' => 'page' );
}
Maintenant, vous utiliseriez simplement ceci au lieu de la fonction native wordpress et accéderiez à vos arguments de rappel par le biais de la clé de tableau 'callbackargs'
de la manière habituelle, comme ceci
function oenology_hooks_sections_callback( $section_passed ) {
// Our callback arguments
$section_passed['callbackargs']
}
Ce que nous pourrions utiliser pour passer à une autre fonction:
function oenology_hooks_sections_callback( $section_passed ) {
// Our callback arguments
$args = $section_passed['callbackargs'];
some_other_function( $args );
}
Ou les arguments de rappel pourraient être un tableau eux-mêmes que nous utilisons:
function oenology_hooks_sections_callback( $section_passed ) {
// Our callback arguments
if ( $section_passed['callbackargs']['stuff'] !== 'things' )
{
echo 'stuff is not things!";
}
}
Tout cela est possible car tout ce que add_settings_section()
fait consiste à ajouter un nouveau membre du tableau à la variable globale $wp_settings_sections
; ce nouveau membre du tableau pourrait être un tableau contenant lui-même un nombre quelconque de clés avec des noms différents, qui pourraient être utilisées par toute fonction sachant qu'ils étaient. Là. Lorsque do_settings_sections
appelle le call_user_func_array
, il transmet un paramètre $sections
comme l'a noté Bainternet, cela signifie que le tableau entier que nous avons ajouté à $wp_settings_sections
dans my_add_settings_section()
est transmis à notre rappel, ce qui signifie que nous avons accès à chaque nouveau membre du tableau ajouté, tel que le callbackargs
permettant notre fonction d'avoir un rappel à part entière.
Même si je suis sûr que cela pourrait être évident, je pensais que je devrais l'expliquer au cas où quelqu'un confus regarderait dedans.
Vous pouvez également toujours utiliser une approche plus générale, ne recherchant pas l'implémentation de fonction particulière (ce qui signifie, sans vérifier si add_settings_section ne transmet rien implicitement). Cette approche générale utilise PHP fermeture.
Comment l'utiliser: partout où vous passez un nom de fonction, au lieu de passer à une fonction anonyme, avec use .
Exemple:
au lieu de
foreach ( $ar as $name => value ) {
add_settings_section(
$section,
'something',
'something-else',
'callback_name'
);
}
function callback_name() {
do_something();
}
vous pouvez utiliser:
foreach ( $ar as $name => value ) {
add_settings_section(
$section,
'something',
'something-else',
function () use ( $name, $value ) {
callback_name( $name, $value )
}
);
}
function callback_name( $name, $value ) {
do_something( $name, $value );
}