Adăugarea unei casete de bifare în personalizatorul de teme
Atunci când încerc să adaug o casetă de bifare în personalizatorul de teme, aceasta pare să fie 'întotdeauna' bifată. Dacă încerci să o debifezi, nu poți, aproape ca și cum ar exista un cod JS care o forțează să rămână bifată.
Folosesc opțiuni de temă serializate și totul este conectat corect. Codul este similar cu următorul (declanșat prin hook-ul 'customize_register'):
$wp_customize->add_setting( mytheme_options[chk_hide_description], array(
'default' => false, // Valoare implicită
'type' => 'option', // Tipul setării
'capability' => 'edit_theme_options' ) // Capabilitatea necesară
);
$wp_customize->add_control( 'display_header_text', array(
'settings' => mytheme_options[chk_hide_description], // Setările de control
'label' => __( 'Ascunde descrierea site-ului' ), // Eticheta controlului
'section' => 'title_tagline', // Secțiunea în care apare
'type' => 'checkbox', // Tipul controlului
) );
Aceeași problemă raportată aici: http://ottopress.com/2012/how-to-leverage-the-theme-customizer-in-your-own-themes/#div-comment-11254.

Caseta de bifat este posibilă. Un exemplu, sper că te ajută.
Mai întâi, trebuie să definești setarea, prin add_setting
, important este parametrul type
cu valoarea option
. După aceasta, controlează câmpul prin add_control
și setează parametrul type
la checkbox
. Alternativ, este posibil să folosești select
. Dacă adaug o valoare implicită prin std
, atunci funcționează, de asemenea fără acest parametru. Alternativ funcționează de asemenea bine, dacă adaug parametrul de alegere cu valorile 1 și 0. Dar în teste, funcționează bine dacă setez parametrul doar la checkbox
. Găsești sursa în proiectul meu, vezi linkul de mai jos.
De asemenea, poți depana ieșirea pe șirul de valoare pe linia 246 din wp-includes/class-wp-customize-control.php; poate te ajută.
depanare:
case 'checkbox':
var_dump( $this->value() );
Exemplu:
// Adaugă setări pentru afișarea descrierii
$wp_customize->add_setting( $this->option_key . '[echo_desc]', array(
'default' => $defaults['echo_desc'],
'type' => 'option',
'capability' => 'edit_theme_options'
) );
// Adaugă control și ieșire pentru câmpul de selectare
$wp_customize->add_control( $this->option_key . '_echo_desc', array(
'label' => __( 'Afișează Descrierea', 'documentation' ),
'section' => 'title_tagline',
'settings' => $this->option_key . '[echo_desc]',
'type' => 'checkbox',
'std' => '1'
) );
Vezi rezultatul acestei surse.
Găsești un rezultat funcțional în tema mea Documentation, găzduit pe GitHub.

Am avut o problemă similară și s-a dovedit că setarea 'type' => 'option'
pentru add_setting
era cauza.
Eliminarea acestei setări mi-a rezolvat problema, iar mai jos este ceea ce folosesc în prezent și funcționează perfect.
$wp_customize->add_section('footer_social_media_section' , array(
'title' => __('Rețele Sociale în Footer', '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' => __('Afișează Link Facebook', 'dd_theme'),
'section' => 'footer_social_media_section',
'settings' => 'show_footer_facebook',
'type' => 'checkbox',
)
)
);

Folosirea sanitize_callback
m-a ajutat:
$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' => 'Afișează o notificare?',
'type' => 'checkbox',
] );
function sanitize_checkbox( $checked ) {
return $checked == 1 ? 1 : '';
}
Utilizare:
$display_note_site = get_option('display_note_site');
if( $display_note_site ) {
// output HTML
}
