web-dev-qa-db-fra.com

Comment obtenir les choix de contrôle de l'objet $ setting passé à sanitize_callback

Exemple de code

Travailler avec l'API Customizer.

Paramètre ajouté (exemple) comme suit:

    $wp_customize->add_setting( 'theme_oenology_options[' . $option_parameter['name'] . ']', array(
        'default'           => $option_parameter['default'],
        'type'              => 'option',
        'sanitize_callback' => 'oenology_sanitize_' . $option_parameter['sanitize']
    ) );

Contrôle ajouté (exemple) comme suit:

        $wp_customize->add_control( 
            'oenology_' . $option_parameter['name'], 
            $customizer_control_parameters 
        );

Remarque: $customizer_control_parameters est un tableau défini ailleurs. Pour les contrôles de type sélection (sélection, radio, image radio, etc.), il comprend une touche 'choices'.

Sanitize callback défini (exemple) comme suit:

function oenology_sanitize_select( $input ) {
    return sanitize_key( $input );
}

Tout fonctionne parfaitement dans le Customizer. Le contrôle est affiché, le réglage est configurable et la désinfection fonctionne.

Problème

Jusqu'ici, tout va bien, mais il serait préférable de mettre en liste blanche les paramètres par rapport aux choix prédéfinis dans $wp_customize->add_control(). Utilisons le deuxième paramètre passé à 'sanitize_callback', $setting, pour obtenir le 'choices' défini dans le contrôle!

Référence principale :

return apply_filters( "customize_sanitize_{$this->id}", $value, $this );

Tentatives de solution

function oenology_sanitize_select( $input, $setting ) {
    $input = sanitize_key( $input );
    $choices = array(); // See below
    return ( array_key_exists( $input, $choices ) ? $input : $setting->default );
}

Problème: l’utilisation de l’une des méthodes ci-dessous ne renvoie pas le tableau de choix transmis à $wp_customize->add_control():

  1. Utilisation de l'objet global $wp_customize:

    global $wp_customize;
    $control = $wp_customize->get_control( $setting->id );
    $choices = $control->choices;
    
  2. Utilisation de l'objet $setting->manager:

    $choices = $setting->manager->get_control( $setting->id )->choices;
    

Dans les deux cas, get_control( $setting->id ) renvoie une null au lieu d'un objet.

Question

Comment puis-je obtenir 'choices' de $wp_customize->get_control(), en utilisant l'objet $this transmis à "customize_sanitize_{$this->id}"?

2
Chip Bennett

C'est correct:

$control = $setting->manager->get_control($setting->id);
$choices = $control->choices;

Cependant, dans votre exemple, $setting->id sera theme_oenology_options[name].

Donc, get_control('theme_oenology_options[name]') retournera null car il n'y a pas de contrôle portant ce nom. Vous avez donné au contrôle l'id de oenology_name à la place.

Je donne toujours le même identifiant aux réglages et à leurs commandes correspondantes pour cette raison.

2
Otto