Вопрос или проблема
Я настроил элементы управления с помощью флажков в своем кастомизаторе тем, чтобы показывать/скрывать логотип и заголовок сайта, когда они отмечены/не отмечены. По умолчанию я хочу, чтобы логотип отображался, а заголовок сайта был скрыт.
Все работает как должно, кроме того, что заголовок сайта не отображается в живом предварительном просмотре, когда флажок отмечен, если предварительно не сохранены настройки в кастомизаторе. Однако логотип отображается по умолчанию и исчезает, когда флажок не отмечен. Это заставляет меня думать, что есть проблема с javascript и/или условием if для заголовка сайта.
Вот код, который у меня есть в файле шаблона:
<?php if( get_theme_mod( 'display_logo' , '1' ) == '1') { ?>
<?php if ( function_exists( 'the_custom_logo' ) && has_custom_logo() ) : ?>
<?php the_custom_logo(); ?>
<?php else : ?>
<h1 class="site-logo"><a href="https://wordpress.stackexchange.com/questions/247411/<?php echo esc_url( home_url("https://wordpress.stackexchange.com/" ) ); ?>" rel="home" title="<?php bloginfo( 'name' ); ?> - <?php bloginfo( 'description' ); ?>"><img src="<?php echo get_stylesheet_directory_uri(); ?>/images/logo.png" alt="<?php bloginfo( 'name' ); ?> - <?php bloginfo( 'description' ); ?>" width="100" height="50" /></a></h1>
<?php endif; ?>
<?php } ?>
<?php if( get_theme_mod( 'display_site_title' , '0' ) == '1') { ?>
<?php if ( is_front_page() && is_home() ) : ?>
<h1 class="site-title"><a href="https://wordpress.stackexchange.com/questions/247411/<?php echo esc_url( home_url("https://wordpress.stackexchange.com/" ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
<?php else : ?>
<p class="site-title"><a href="https://wordpress.stackexchange.com/questions/247411/<?php echo esc_url( home_url("https://wordpress.stackexchange.com/" ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></p>
<?php endif; ?>
<?php } ?>
Вот код, который у меня есть в файле customizer.php:
// Отобразить логотип
$wp_customize->add_setting( 'display_logo', array(
'default' => true,
'transport' => 'postMessage'
) );
$wp_customize->add_control( 'display_logo', array(
'label' => __( 'Отобразить логотип', 'myTheme' ),
'type' => 'checkbox'
) );
// Отобразить заголовок сайта
$wp_customize->add_setting( 'display_site_title', array(
'default' => false,
'transport' => 'postMessage'
) );
$wp_customize->add_control( 'display_site_title', array(
'label' => __( 'Отобразить заголовок сайта', 'myTheme' ),
'type' => 'checkbox'
) );
Вот код, который у меня есть в соответствующем файле customizer.js:
// Отобразить логотип
wp.customize( 'display_logo', function( value ) {
value.bind( function( to ) {
if ( true === to ) {
$( '.site-logo' ).removeClass( 'hidden' );
} else {
$( '.site-logo' ).addClass( 'hidden' );
}
});
});
// Отобразить заголовок сайта
wp.customize( 'display_site_title', function( value ) {
value.bind( function( to ) {
if ( true === to ) {
$( '.site-title' ).removeClass( 'hidden' );
} else {
$( '.site-title' ).addClass( 'hidden' );
}
});
});
Попробуйте эту функцию. Зачем обращаться к js, когда вы можете сделать это с помощью php в вашем же файле customizer.php.
/*
** показать заголовок сайта или скрыть его
*/
function showtitle_slogan() {
$showttlslogan = get_theme_mod('display_site_title');
if ($showttlslogan == true) {
?>
<style type="text/css">
.site-title { display:none;}
</style>
<?php
}
}
add_action('wp_head', 'showtitle_slogan');
И сделайте то же самое для всего остального.
Удалите заголовок сайта и описание сайта, если установлен пользовательский логотип – WordPress
Используйте the_custom_logo(), когда хотите напечатать/вывести результаты. Используйте get_custom_logo(), когда хотите вернуть результаты (например, когда хотите присвоить их переменной или использовать в условии).
<?php
if( get_custom_logo() ) {
the_custom_logo();
} elseif ( is_front_page() && is_home() ) {
?>
<h1 class="site-title">
<a href="https://wordpress.stackexchange.com/questions/247411/<?php echo esc_url( home_url("https://wordpress.stackexchange.com/" ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a>
</h1>
<?php
$description = get_bloginfo( 'description', 'display' );
} else {
?>
<p class="site-title"><a href="https://wordpress.stackexchange.com/questions/247411/<?php echo esc_url( home_url("https://wordpress.stackexchange.com/" ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></p>
<?php
$description = get_bloginfo( 'description', 'display' );
}
if ( ( isset($description) && $description) || is_customize_preview() ) {
?>
<p class="site-description"><?php echo $description; /* WPCS: xss ok. */ ?></p>
<?php
}
?>
Ответ или решение
Для настройки отображения и скрытия логотипа и заголовка сайта с помощью пользовательского интерфейса WordPress Customizer потребуется внесение изменений как в шаблон вашего сайта, так и в JavaScript. Ваша цель — обеспечить корректное взаимодействие между установленными значениями в настройках и их отображением на сайте, включая живой предварительный просмотр.
Шаг 1: Проверка шаблона
Ваш код в шаблоне для отображения логотипа и заголовка сайта в целом выглядит правильно, но стоит обратить внимание на несколько аспектов:
- Корректное определение переменной логотипа:
Убедитесь, что значение, возвращаемое функциейget_theme_mod('display_site_title', '0')
, сравнивается сtrue
, а не с'1'
. Это позволит избежать потенциальных проблем с приведением типов при использовании операций с логическими значениями.
<?php if ( get_theme_mod( 'display_site_title', false ) ) : ?>
<?php if ( is_front_page() && is_home() ) : ?>
<h1 class="site-title"><a href="<?php echo esc_url( home_url() ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
<?php else : ?>
<p class="site-title"><a href="<?php echo esc_url( home_url() ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></p>
<?php endif; ?>
<?php endif; ?>
Шаг 2: Правильные настройки в Customizer
В вашем файле customizer.php
вы правильно добавили настройки для логотипа и заголовка сайта, однако убедитесь, что default
для display_logo
"true" соответствует вашему изначальному предположению о том, что логотип должен отображаться по умолчанию.
$wp_customize->add_setting( 'display_logo', array(
'default' => true, // Логотип по умолчанию должен отображаться
'transport' => 'postMessage'
) );
$wp_customize->add_control( 'display_site_title', array(
'default' => false, // Заголовок сайта по умолчанию скрыт
) );
Шаг 3: JavaScript для динамического обновления содержимого
Ваш JavaScript-код, вероятно, требует проверки для функций, отвечающих за обновление заголовка сайта в живом предварительном просмотре. Убедитесь, что применяемый селектор корректен и класс hidden
правильно применяется и убирается.
// Динамическое изменение заголовка сайта
wp.customize( 'display_site_title', function( value ) {
value.bind( function( to ) {
if ( to ) {
$( '.site-title' ).removeClass( 'hidden' ); // Показываем заголовок
} else {
$( '.site-title' ).addClass( 'hidden' ); // Скрываем заголовок
}
});
});
Шаг 4: Альтернативный подход через CSS
Если вам нужно скрывать элементы через CSS в зависимости от настроек, вы можете использовать функцию, добавляющую стили в <head>
вашего документа. Это может быть полезно, если JavaScript не срабатывает так, как вы ожидали:
function customizer_custom_css() {
$display_site_title = get_theme_mod('display_site_title', false);
?>
<style type="text/css">
<?php if (!$display_site_title) : ?>
.site-title { display: none; }
<?php endif; ?>
</style>
<?php
}
add_action('wp_head', 'customizer_custom_css');
Заключение
Эти шаги должны помочь вам настроить функциональность отображения логотипа и заголовка сайта в вашем WordPress-теме. Такие настройки обеспечивают более гибкий и интуитивно понятный интерфейс для пользователей, а также помогают улучшить пользовательский опыт на сайте. Не забывайте тестировать изменения на разных устройствах для обеспечения полной совместимости и удобства. Если проблема persists, рекомендуется также проверить консоль разработчика на наличие JavaScript-ошибок, которые могут влиять на работу вашего скрипта.