Przechowywanie nazwy domeny w ustawieniach motywu

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:

  1. Gdybyśmy chcieli dodać więcej opcji, wystarczy dodać kolejne filtry z przedrostkiem customize_sanitize_ oraz kolejne wpisy w funkcji theme_revert_domain,
  2. 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.
  3. 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.