Вопрос или проблема
Я достаточно слабо понимаю JavaScript API Настройщика, но стараюсь. Я сделал несколько вещей, но теперь мне нужно отправить данные в предпросмотр Настройщика на основе клика по элементу управления.
Когда элемент управления нажимается в Настройщике, к этому элементу применяется класс “.invisible”. Исходя из этого, я хочу скрыть <section class="about_me"></section>
на сайте. Значение элемента управления — это этот класс. Как мне это сделать? Вот что я пробовал:
api('gm_sortable_sections', function(setting) {
var section = setting.get(); // aka section.about_me
setting.bind(function onChange(){
api.control('gm_sortable_sections', function(control) {
control.sectionToHide = api.previewer.preview.container.find('.' + section);
control.sortableContainer = $(control.container).find('ul.sortable' ).first();
control.sortableContainer.find( 'li' ).each( function() {
if ( $( this ).is( '.invisible' ) ) {
console.log(control.sectionToHide);
control.sectionToHide.addClass('.invisible');
// api.previewer.send( 'sortable-visible');
// $('section.'+ section).addClass('.invisible');
}
});
});
});
});
Мне удалось понять, как получить значение “.invisible” из элемента управления, но как мне затем отправить это и обновить CSS или добавить класс в секцию в предпросмотре (а затем фактически обновить сайт для сохранения этого theme_mod_).
Подумайте еще раз, как вы хотите, чтобы элемент управления работал. Если вы скрываете элемент управления, как бы вы его снова открыли?
Похоже, вы хотите флажок, чтобы указать, отображается ли секция или скрыта. В вашем PHP на действии ‘customize_register’ вы определяете держатель индикатора. Его назвали setting
, с значением по умолчанию, которое является типом ‘theme_mod’. И вы определяете control
для взаимодействия пользователя. Для булевых опций лучше называть их для состояния ‘включено’, чтобы логика имела смысл и они соответствовали основным опциям.
$wp_customize->add_setting( 'show_about_section', array(
'default' => true,
'transport' => 'postMessage',
'sanitize_callback' => 'wp_validate_boolean',
) );
$wp_customize->add_control( 'show_about_section', array(
'label' => __( 'Отобразить раздел "О нас"', 'myprefix' ),
'section' => 'myprefix_theme_section',
'type' => 'checkbox',
) );
Предполагая, что секция всегда выводится, мы можем просто добавить к ней класс, чтобы скрыть ее. Ваш PHP будет использовать этот theme_mod, когда раздел “О нас” выводится:
$class="about_me";
if ( ! get_theme_mod( 'show_about_section', true ) ) {
$class .= ' invisible';
}
// код для вывода секции с использованием $class
В JavaScript, который загружается на действии ‘customize_preview_init’, используйте что-то вроде этого.
( function( $ ) {
wp.customize( 'show_about_section', function( value ) {
value.bind( function( show ) {
$( '.about_me' ).toggleClass( 'invisible', show );
} );
} );
} )( jQuery );
Нет необходимости отправлять имя класса в предпросмотр, хотя вы можете закодировать это по-другому, если вам нужно, чтобы один элемент управления обрабатывал несколько имен классов. Настройщик уже отправляет значение элемента управления в предпросмотр, но в этом примере кода это логическое значение, а не имя класса. Нет дополнительного кода, необходимого для сохранения theme_mod. Это сделано за вас.
Ответ или решение
Для того чтобы добавить класс к превью Customizer на основе класса элемента управления, вам необходимо использовать JavaScript API и несколько функций, которые предоставляются WordPress. Давайте рассмотрим, как вы можете реализовать это шаг за шагом.
1. Регистрация настройки и управления
Сначала вам нужно зарегистрировать настройку и управление в файле functions.php
вашей темы. Это позволит вам создать контроль для взаимодействия с пользователем. Например, это может быть чекбокс, который указывает, отображать ли раздел "О нас":
function myprefix_customize_register($wp_customize) {
$wp_customize->add_setting('show_about_section', array(
'default' => true,
'transport' => 'postMessage',
'sanitize_callback' => 'wp_validate_boolean',
));
$wp_customize->add_control('show_about_section', array(
'label' => __( 'Display the About section', 'myprefix' ),
'section' => 'myprefix_theme_section',
'type' => 'checkbox',
));
}
add_action('customize_register', 'myprefix_customize_register');
2. Изменение HTML-кода раздела
Затем в вашем шаблоне, где выводится раздел "О нас", вы можете добавить классы на основе значения настройки:
$class = "about_me";
if (!get_theme_mod('show_about_section', true)) {
$class .= ' invisible';
}
// Выводите раздел с использованием переменной $class
echo '<section class="' . esc_attr($class) . '">...</section>';
3. JavaScript для обновления превью
Теперь, чтобы обновить превью в реальном времени, вам нужно добавить JavaScript, который будет отслеживать изменения, сделанные пользователем в Customizer. Это делается с помощью хука customize_preview_init
:
function myprefix_customize_preview_js() {
wp_enqueue_script('myprefix-customize-preview', get_template_directory_uri() . '/js/customize-preview.js', array('jquery', 'customize-preview'), null, true);
}
add_action('customize_preview_init', 'myprefix_customize_preview_js');
В файле customize-preview.js
добавьте следующий код:
(function($) {
wp.customize('show_about_section', function(value) {
value.bind(function(show) {
$('.about_me').toggleClass('invisible', !show);
});
});
})(jQuery);
4. Объяснение и результат
Теперь, когда пользователь переключает чекбокс "Отображать раздел ‘О нас’", JavaScript будет автоматически добавлять или удалять класс .invisible
у секции с классом .about_me
. Когда класс .invisible
присутствует, секция будет скрыта, а при его отсутствии — отображена.
Заключение
Этот метод позволяет использовать функционал Customizer в WordPress для управления видимостью элементов на сайте в реальном времени. Он хорошо структурирован, с регистрацией управления, условным выводом HTML и использованием JavaScript для мгновенного обновления. Таким образом, вы можете легко расширить функциональность вашего сайта, позволяя пользователям больше контролировать внешний вид.
Для глубокого понимания JavaScript API Customizer вы можете обратиться к официальной документации WordPress для получения дополнительной информации и примеров.