web-dev-qa-db-fra.com

Comment passer de variable à call add_settings_section ()?

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
            }
        }
    }
}
15
Chip Bennett

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.

Mettre à jour

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.

17
Bainternet

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.

4
Cikica

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 );
}
0
Olga Farber