Вопрос или проблема
У меня есть некоторые проблемы с сохранением значений по умолчанию в настройках WordPress Customizer в базу данных при первоначальной установке, не дожидаясь, пока пользователь сначала сохранит настройки Customizer. Я попробовал решение из этой темы, но безуспешно:
Использовать значение по умолчанию wp_customizer в выводе theme_mod?
Раздел/настройка/управление в настройках
//Раздел социальных значков
$wp_customize->add_section( 'socialsection', array(
'title' => __( 'Социальные медиа' ),
'priority' => 4,
'capability' => 'edit_theme_options',
) );
//Настройки и управление для социальных медиа
$wp_customize->add_setting( 'facebooklink_edit', array(
'default' => '#',
'sanitize_callback' => 'esc_attr',
'transport' => 'refresh',
) );
$wp_customize->add_control('facebooklink_edit', array(
'label' => __( 'Ссылка на Facebook', 'spiffing' ),
'section' => 'socialsection',
) );
Вывод на фронтенде:
<a href="https://wordpress.stackexchange.com/questions/248570/<?php echo get_theme_mod("facebooklink_edit', '#'); ?>"><div class="fb-footer" id="fb-footer-bg"><i class="fa fa-facebook-f"></i></div></a>
CSS манипуляция на основе действия пользователя в кастомайзере:
?>
<style type="text/css">
<?php if( get_theme_mod( 'facebooklink_edit' ) == '' ) { ?>
#fb-footer-bg { display: none; }
<?php } // конец if ?>
</style>
<?php
Из вышеизложенного видно, что этот мод просто по умолчанию устанавливает значение на ‘#’, и если он затем обнаруживает, что ‘#’ отсутствует, он добавляет ‘display:none’ к этому ID. Это должно быть достаточно просто. Тем не менее, кажется, что выражение if видит исполнение его условия, которое в данном случае пустое ” и применяет ‘display:none’. Но, как видно в обоих секциях по умолчанию на фронтенде и в кастомайзере, я установил по умолчанию значение на ‘#’. Он даже записывает это в секцию placeholder в кастомайзере, просто не в базу данных.
Это работает, если пользователь ПОСЛЕ первоначальной установки зайдет в кастомайзер и нажмет ‘сохранить’. Возможно, это инициирует значение в базе данных, которое затем считывается и отображается на фронтенде.
Я смог добиться этого с ссылками и т.д., но этот мод отличается тем, что он управляет div, добавляя ‘display: none’.
Любые идеи приветствуются.
Мне удалось решить эту проблему, изменив оператор в выражении ‘if’:
Оригинал:
?>
<style type="text/css">
<?php if( get_theme_mod( 'facebooklink_edit' ) == '' ) { ?>
#fb-footer-bg { display: none; }
<?php } // конец if ?>
</style>
<?php
Обновленный:
?>
<style type="text/css">
<?php if( get_theme_mod( 'facebooklink_edit' ) ===
#fb-footer-bg { display: none; }
<?php } // конец if ?>
</style>
<?php
Изменение ‘равно’ на ‘идентично’ похоже, решает эту проблему.
Я думаю, вам следует использовать что-то вроде set_theme_mod
. Это сохранит значение в базе данных.
set_theme_mod('facebooklink_edit','aaabbbccc');
Чтобы сохранить настройку темы только для вашей темы, используйте 'type' => 'theme_mod'
.
$wp_customize->add_setting( 'facebooklink_edit' , array(
'type' => 'theme_mod', // только для этой темы
'transport' => 'refresh',
'default' => 'aaabbbccc'
//'sanitize_callback' => 'некое значение...',
) );
Метод save()
существует внутри class-wp-customize-manager()
, но, похоже, не предназначен для использования только с JavaScript.
Ваши настройки темы, в общем, могут быть либо 'theme_mod'
, либо 'option'
.
Мое предложение для вас было использовать theme_mod
в этом случае.
if(!get_theme_mod('facebooklink_edit')) {
set_theme_mod('facebooklink_edit','aaabbbccc');
}
Я бы использовал это для установки значения только в том случае, если оно не существует.
вместо просто.
set_theme_mod('facebooklink_edit','aaabbbccc');
.
Ответ или решение
Проблема, которую вы описали, связана с тем, что значения по умолчанию в настройках WordPress Customizer не сохраняются в базе данных при первой установке темы. Давайте разберем это подробно и предложим решения.
Проблематика
При первоначальной установке темы вы ожидаете, что настройки, заданные в WordPress Customizer, будут сохраняться в базе данных автоматически. Однако без явного сохранения изменений пользователем, значение get_theme_mod('facebooklink_edit')
возвращает пустое значение ''
, даже если вы указали default
значение при добавлении настройки.
Причина
WordPress Customizer настроен так, что значения по умолчанию заносятся в базу данных только в том случае, если пользователь вручную сохранит изменения через интерфейс. Это происходит потому, что значения по умолчанию, указанные в add_setting
, не инициируют запись в базу данных, пока не будет выполнено действие сохранения.
Решения
1. Использование set_theme_mod
Одним из самых универсальных решений будет использование функции set_theme_mod
для инициализации значений по умолчанию в базе данных при загрузке темы. Вам нужно будет добавить следующий код в файл functions.php
вашей темы:
function initialize_customizer_settings() {
if (!get_theme_mod('facebooklink_edit')) {
set_theme_mod('facebooklink_edit', '#');
}
}
add_action('after_switch_theme', 'initialize_customizer_settings');
Этот код проверяет, существует ли уже модификация для facebooklink_edit
. Если нет, то он устанавливает значение по умолчанию.
2. Обновление логики вывода CSS
Ваше решение с использованием ===
вместо ==
действительно помогает в определенных случаях, так как оно обеспечивает строгую проверку типов. Настоятельно рекомендую поддерживать строгую типизацию в своем коде. Вот как это выглядит:
<style type="text/css">
<?php if (get_theme_mod('facebooklink_edit') === '#') { ?>
#fb-footer-bg { display: block; }
<?php } else { ?>
#fb-footer-bg { display: none; }
<?php } ?>
</style>
3. Использование sanitize_callback
Кроме того, рекомендуется указать sanitize_callback
для всех ваших настроек, чтобы защитить данные, которые будут введены пользователями. Например:
$wp_customize->add_setting('facebooklink_edit', array(
'default' => '#',
'sanitize_callback' => 'esc_url_raw', // Убедитесь, что это соответствует вашему ожидаемому формату
'transport' => 'refresh',
));
Заключение
Следуя данным рекомендациям и исправлениям, вы сможете гарантировать, что настройки по умолчанию будут сохраняться в базе данных и корректно выводиться на фронтенде вашей темы. Помните, что потраченное время на правильную инициализацию настроек упростит дальнейшую разработку и использование вашего продукта. Если вы столкнетесь с аналогичными проблемами в будущем, не забывайте использовать предложенные методы для оптимизации работы с настройками WordPress Customizer.