Wiele motywów przechowuje w ustawieniach adresy grafik wykorzystywanych w różnych miejscach motywu. Problem pojawia się wtedy, gdy użytkownik przenosi instalację pod inny adres np. ze środowiska testowego.
Przyczyna problemu
Problem powstaje z powodu sposobu przechowywania ustawień przez motyw z użyciem Theme Modification API – opcje motywu są serializowane a co za tym idzie każda zmiana długości wartości opcji spowoduje, że deserializacja będzie niemożliwa. Zatem po podmianie w bazie danych wszystkich wystąpień nazwy domeny stracimy wszystkie ustawienia motywu.
Rozwiązanie
Rozwiązanie jest na szczęście proste i wymaga tylko nieznacznej modyfikacji kodu używanego w ekranie personalizacji motywu. Z pomocą przychodzi nam parametr ustawienia: sanitize_callback oraz filtr do modyfikacji pobieranych wartości opcji option_X.
Idea jest prosta – z użyciem sanitize_callback zastępujemy wszystkie wystąpienia nazwy domeny określonym tekstem – w moim wypadku to [domain_name]. Następnie z użyciem filra option_X przywracamy nazwę domeny podczas odczytywania opcji.
Kod
Przykładowy kod dla opcji o nazwie theme_logo przechowującej grafikę logo motywu:
$theme_slug = get_option( 'stylesheet' ); function theme_remove_domain($val, $this) { return str_replace(home_url(), '[domain_name]', $val); } function theme_revert_domain($values_array) { $values_array['theme_logo'] = str_replace('[domain_name]', home_url(), $values_array['theme_logo']); return $values_array; } add_filter( "customize_sanitize_theme_logo", 'theme_remove_domain', 9); add_filter( "option_theme_mods_{$theme_slug}", 'theme_revert_domain');
Trzy uwagi do powyższego kodu:
- Gdybyśmy chcieli dodać więcej opcji, wystarczy dodać kolejne filtry z przedrostkiem customize_sanitize_ oraz kolejne wpisy w funkcji theme_revert_domain,
- Filtr customize_sanitize_theme_logo ma priorytet ustawiony na 9 aby wykonał się przed filtrami zdefiniowanymi w parametrze sanitize_callback – jeżeli używacie do czyszczenia danych w tym parametrze funkcji, która może wpłynąć na bazowy tekst [domain_name], warto rozważyć zmianę kolejności filtrów.
- Kod funkcji theme_revert_domain celowo został uproszczony i np. nie zawiera pętli iterującej po wszystkich ustawieniach, ponieważ funkcja ta będzie wywoływana przy każdym wywołaniu funkcji get_theme_mod – dlatego warto zadbać o optymalizację kodu w tym miejscu
Podsumowanie
Dzięki tej prostej modyfikacji jesteśmy w stanie zabezpieczyć użytkownika naszego motywu przed utratą konfiguracji motywu po migracji WordPressa i siebie przed dodatkowymi pytaniami o wsparcie techniczne.