Aggiungere una checkbox al personalizzatore del tema
Quando provo ad aggiungere una checkbox al personalizzatore del tema, sembra essere sempre selezionata. Se provi a deselezionarla non riesci, come se ci fosse del codice JS che la forza a rimanere selezionata.
Sto utilizzando opzioni del tema serializzate e tutto è collegato correttamente. Il codice è simile al seguente (attivato tramite l'hook 'customize_register'):
$wp_customize->add_setting( mytheme_options[chk_hide_description], array(
'default' => false,
'type' => 'option',
'capability' => 'edit_theme_options' )
);
$wp_customize->add_control( 'display_header_text', array(
'settings' => mytheme_options[chk_hide_description],
'label' => __( 'Nascondi la descrizione del sito' ),
'section' => 'title_tagline',
'type' => 'checkbox',
) );
Stesso problema segnalato qui: http://ottopress.com/2012/how-to-leverage-the-theme-customizer-in-your-own-themes/#div-comment-11254.
La checkbox è possibile. Un esempio, spero che questo ti aiuti.
Per prima cosa, devi definire l'impostazione tramite add_setting, importante è il parametro type con il valore option. Successivamente, controlla il campo tramite add_control e imposta il parametro type a checkbox. In alternativa, è possibile utilizzare select. Se aggiungo un valore predefinito tramite std, funziona comunque, anche senza questo parametro. Funziona bene anche se aggiungo il parametro delle scelte con i valori 1 e 0. Ma nei test, funziona bene se imposto il parametro solo su checkbox. Puoi trovare il sorgente nel mio progetto, vedi il link in basso.
Inoltre, puoi eseguire il debug dell'output sul valore stringa alla riga 246 nel file wp-includes/class-wp-customize-control.php; forse ti aiuterà.
debug:
case 'checkbox':
var_dump( $this->value() );
Esempio:
// Aggiungi impostazioni per l'output della descrizione
$wp_customize->add_setting( $this->option_key . '[echo_desc]', array(
'default' => $defaults['echo_desc'],
'type' => 'option',
'capability' => 'edit_theme_options'
) );
// Aggiungi controllo e output per il campo select
$wp_customize->add_control( $this->option_key . '_echo_desc', array(
'label' => __( 'Mostra Descrizione', 'documentation' ),
'section' => 'title_tagline',
'settings' => $this->option_key . '[echo_desc]',
'type' => 'checkbox',
'std' => '1'
) );
Vedi il risultato di questo sorgente.

Puoi trovare un risultato funzionante nel mio tema Documentation, ospitato su GitHub.
Anch'io avevo un problema simile, e si è scoperto che impostare 'type' => 'option' per add_setting era la causa.
Rimuovendo questa opzione ho risolto il problema, e di seguito riporto il codice che attualmente utilizzo e che funziona perfettamente.
$wp_customize->add_section('footer_social_media_section' , array(
'title' => __('Footer Social Media', 'dd_theme'),
'priority' => 1020
));
$wp_customize->add_setting('show_footer_facebook', array(
'default' => '1'
));
$wp_customize->add_control(
new WP_Customize_Control(
$wp_customize,
'show_footer_facebook',
array(
'label' => __('Mostra link Facebook', 'dd_theme'),
'section' => 'footer_social_media_section',
'settings' => 'show_footer_facebook',
'type' => 'checkbox',
)
)
);
L'uso di sanitize_callback mi ha aiutato:
$setting = 'display_note_site';
$wp_customize->add_setting( $setting, [
'type' => 'option',
'transport' => $transport,
'sanitize_callback' => 'sanitize_checkbox',
] );
$wp_customize->add_control( $setting, [
'section' => $section,
'label' => 'Mostrare una notifica?',
'type' => 'checkbox',
] );
function sanitize_checkbox( $checked ) {
return $checked == 1 ? 1 : '';
}
Utilizzo:
$display_note_site = get_option('display_note_site');
if( $display_note_site ) {
// output html
}