WordPress Кастомайзер не устанавливает значение по умолчанию при первоначальной установке?

Вопрос или проблема

У меня есть некоторые проблемы с сохранением значений по умолчанию в настройках 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.

Оцените материал
Добавить комментарий

Капча загружается...