Добавление чекбокса в настройщик темы WordPress

12 окт. 2012 г., 17:19:00
Просмотры: 19K
Голосов: 9

При попытке добавить чекбокс в настройщик темы он кажется "всегда" выбранным. Если попытаться снять его - ничего не происходит, как будто какой-то JS код принудительно оставляет его отмеченным.

Я использую сериализованные настройки темы, и всё подключено правильно. Код выглядит примерно так (запускается через хук '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'    => __( 'Скрыть описание сайта' ), // метка чекбокса
    'section'  => 'title_tagline', // секция настройщика
    'type'     => 'checkbox', // тип элемента управления
) );

Та же проблема обсуждается здесь: http://ottopress.com/2012/how-to-leverage-the-theme-customizer-in-your-own-themes/#div-comment-11254.

4
Комментарии

эй, ты решил эту проблему? У меня то же самое. Похоже, проверка идет через JS. Комментарий на ottopress про 'уникальный ID' мне не помог.

xsonic xsonic
12 нояб. 2012 г. 16:08:19

Моя проблема решилась, когда я убедился, что ID, используемый в $wp_customize->add_control(), был уникальным.

dgwyer dgwyer
13 нояб. 2012 г. 16:30:22

@dgwyer, пожалуйста, добавь свое решение в качестве Ответа, чтобы этот Вопрос не оставался в списке "Без ответа".

brasofilo brasofilo
20 февр. 2013 г. 20:58:31

как мне это сделать?

dgwyer dgwyer
21 февр. 2013 г. 22:15:18
Все ответы на вопрос 3
0

Чекбокс возможен. Вот пример, надеюсь, он вам поможет.

Сначала нужно определить настройку с помощью add_setting, важно указать параметр type со значением option. Затем управляйте полем через add_control и установите параметр type в значение checkbox. Альтернативно можно использовать select. Если я добавляю значение по умолчанию через std, то оно работает, даже без этого параметра. Также работает вариант, если добавить параметр выбора со значениями 1 и 0. Но в тестах всё работает корректно, если просто установить параметр checkbox. Исходный код вы найдете в моём проекте, ссылка ниже.

Также можно отладить вывод строки значения в строке 246 файла wp-includes/class-wp-customize-control.php; возможно, это поможет.

Отладка:

case 'checkbox':
    var_dump( $this->value() );

Пример:

// Добавляем настройки для вывода описания
$wp_customize->add_setting( $this->option_key . '[echo_desc]', array(
    'default'    => $defaults['echo_desc'],
    'type'       => 'option',
    'capability' => 'edit_theme_options'
) );
        
// Добавляем элемент управления и вывод для поля выбора
$wp_customize->add_control( $this->option_key . '_echo_desc', array(
    'label'      => __( 'Display Description', 'documentation' ),
    'section'    => 'title_tagline',
    'settings'   => $this->option_key . '[echo_desc]',
    'type'       => 'checkbox',
    'std'        => '1'
) );

Смотрите результат этого кода. скриншот, показывающий чекбокс в кастомайзере WordPress

Рабочий вариант вы найдёте в моей теме Documentation, размещённой на GitHub.

6 мар. 2013 г. 12:52:58
0

У меня была похожая проблема, и оказалось, что указание 'type' => 'option' для add_setting было причиной.

Удаление этого параметра решило мою проблему, и ниже приведен код, который я сейчас использую, и он работает без проблем.

$wp_customize->add_section('footer_social_media_section' , array(
    'title'     => __('Социальные сети в подвале', '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'     => __('Показывать ссылку на Facebook', 'dd_theme'),
            'section'   => 'footer_social_media_section',
            'settings'  => 'show_footer_facebook',
            'type'      => 'checkbox',
        )
    )
);
31 янв. 2014 г. 16:37:20
0

Использование sanitize_callback помогло мне:

$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'   => 'Показывать уведомление?',
    'type'    => 'checkbox',
] );

function sanitize_checkbox( $checked ) {
    return $checked == 1 ? 1 : '';
}

Использование:

$display_note_site = get_option('display_note_site');

if( $display_note_site ) {
    // вывод html
}
28 апр. 2023 г. 11:45:55