Ekran personalizacji motywu to świetne narzędzie, które umożliwia łatwy podgląd zmian, które chcemy nanieść w naszym motywie z użyciem jego opcji. Jedną z ciekawszych opcji jakie możemy zaoferować użytkownikom naszego motywu jest możliwość zmiany kolorów w motywie z podglądem „na żywo” w ekranie personalizacji.
Dodanie obsługi zmiany koloru jest relatywnie proste – zaczynamy od stworzenia dodatkowego ustawienia dla naszego motywu:
$wp_customize->add_setting(
'my_theme_primary_color',
array(
'default' => '#e83a34',
'capability' => 'edit_theme_options',
'transport' => 'postMessage'
)
);
Kluczowym elementem w powyższym kodzie jest parametr transport, który jest ustawiony tak żeby umożliwić przesyłanie wartości zmienionej opcji bezpośrednio do ramki z podglądem motywu poprzez JavaScript. Dzięki temu będziemy mogli stworzyć podgląd „na żywo” wprowadzanych zmian.
Kolejny krok to dodanie kontrolki obsługującej nasz dodatkowy kolor:
$wp_customize->add_control(
new WP_Customize_Color_Control(
$wp_customize,
'my_theme_primary_color',
array(
'label' => __('Primary Color', 'my-theme'),
'section' => 'colors',
'settings' => 'my_theme_primary_color'
)
)
);
Nasza kontrolka zostanie dodana do domyślnej sekcji z kolorami pod nazwą Primary Color. Oczywiście aby tak się stało musimy oba powyższe kawałki kodu opakować w funkcję np. o nazwie my_theme_init_customizer, którą dodamy do akcji customize_register:
add_action( 'customize_register', 'my_theme_init_customizer' );
Po tej operacji powinniśmy uzyskać w ekranie personalizacji mniej więcej taki wygląd:
Oczywiście nasza kontrolka jeszcze nic nie robi, ponieważ zmiany wartości nowej opcji nie są nigdzie odwzorowywane w motywie – zaimplementujmy więc to.
function my_theme_customizer_css() {
$primary_color = get_theme_mod('my_theme_primary_color', '#e83a34');
?>
<style type="text/css">
a,
button,
input[type="submit"],
input[type="button"],
input[type="reset"] {
color: <?php echo $primary_color; ?>;
}
</style>
<?php
}
add_action( 'wp_head', 'my_theme_customizer_css' );
Powyższy kod pobiera z ustawień motywu wartość naszej nowej opcji oraz wstawia ją do kodu CSS, który jest umieszczany w sekcji head naszego motywu. Od tej pory nasze zmiany nowej opcji będą widoczne w motywie… ale tylko po odświeżeniu strony – musimy jeszcze powiązać zmiany naszej opcji z odpowiednim kodem JavaScript, aby uzyskać podgląd „na żywo” tych zmian.
Zaczynamy od dodania akcji, która wywoła dodanie akcji wp_footer w trybie podglądu motywu:
function my_theme_customize_register($wp_customize) {
if ($wp_customize->is_preview() && !is_admin()) {
add_action('wp_footer', 'my_theme_customize_preview', 21);
}
}
add_action( 'customize_register', 'my_theme_customize_register' );
Powyższy kod odpowiada za wywołanie funkcji my_theme_customize_preview w stopce strony tylko wtedy gdy motyw wyświetlany jest w trybie podglądu. Tym samym przechodzimy do finalnego kroku – czyli zdefiniowania funkcji my_theme_customize_preview:
function my_theme_customize_preview() {
?>
<script>
(function( $ ){
wp.customize('my_theme_primary_color', function(value) {
value.bind(function(final_value) {
final_value = final_value ? final_value : '#e83a34';
$('a, button, input[type="submit"], input[type="button"], input[type="reset"]').css('color', final_value);
});
});
})(jQuery);
</script>
<?php
}
Powyższy kod zadziała dzięki temu, że uprzednio dla naszej nowej opcji określiliśmy parametr transport na postMessage. W większości wypadków takie rozwiązanie będzie wystarczające.
Optymalizacja kodu JavaScript
Czasami jednak zdarzy się, że będziemy mieli do zmiany kolor w bardzo dużej liczbie elementów, których nie będzie można zunifikować w postaci kilku selektorów CSS. W takim wypadku sugeruję zastosowanie innego kodu:
function my_theme_customize_preview() {
?>
<script>
(function( $ ){
wp.customize('my_theme_primary_color', function(value) {
value.bind( function( to ) {
final_value = final_value ? final_value : '#e83a34';
var new_css = 'a, button, input[type="submit"], input[type="button"], input[type="reset"] { color: ' + final_value + '; }';
if($(document).find('#my-theme-new-css').length) {
$(document).find('#my-theme-new-css').remove();
}
$(document).find('head').append($('<style id="my-theme-new-css">' + new_css + '</style>'));
});
});
})(jQuery);
</script>
<?php
}
Powyższy kod działa sprytniej niż poprzedni – tworzymy w locie kod CSS, który umieszczamy w znaczniku style dokładanym na końcu sekcji head – dzięki temu nadpiszemy wszystkie pozostałe pliki CSS. Oczywiście jak widać uprzednio usuwamy poprzednio wstawiony znacznik style aby uniknąć kilkuset elementów style w sekcji head, jeżeli trafimy na wyjątkowo niezdecydowanego przy wyborze koloru użytkownika. Dzięki temu wykonamy dwie proste operacje na drzewie dokumentu – usunięcie i dodanie elementu, zamiast (potencjalnie) kilku tysięcy selekcji i modyfikacji elementów.

