
Objawy
Sprawa wygląda tak, pomimo ustawień w panelu i ich zapisaniu strona po pewnym czasie po zapisie źle interpretowała ustawienia. Natomiast przy ponownym edytowaniu strony, ustawienia były wczytywane poprawnie w samym panelu. Przynajmniej takie objawy były na pierwszy rzut oka.
Debugowanie
Najważnieszjsze przy naprawianiu błędów w oprogramowaniu jest znalezienie jego przyczyny. W tym przypadku nie używam xDebug ani innego oprogramowania do debugowania kodu w czasie odpalenia. Posłużę się sprawdzaniem „ręcznym”, wstawiając w odpowiednie miejsca funkcje var_dump sprawdzając wartości zwracane prze funkcje CMS’a. Pozwoli nam to dojść po sznurku to kłębka problemu :)
Funkcja wyświetlania tytułu strony polega na pobieraniu metadanych przypisanych do strony i ich interpretowaniu. Więc sprawdzamy czy funkcja
get_metadata($post->ID, _abee_viewtitle, true)
zwraca poprawne wartości.
Po kilku testach okazuje się że po zapisaniu strony przez panel WP wszystko dziła poprawnie. Funkcja zwraca ustawioną wartość przy edycji strony. Jednak po pewnym czasie zwraca pustą zmienną typu string.
Określenie przyczyny błędu
Idąc tym tropem mamy zmienną która nie zapisuje się na stałe. Natomiast potencjalny prawidłowy zapis w panelu admina wynikał ze specyfikii elementu SELECT.
Rozwiązanie
W internecie znalazłem tylko kilka wzmianek o dziwnym działaniu zapisu metadanych w WordPressie. Jak się okazuje, przy tworzeniu lub aktualizacji metadanych za pomocą funkcji WordPress wartość jest zapisywana tylko do cache. W ten sposób wartość była zapisywana dosłownie na kilka minut a później była kasowana. To też było głównym powodem dlaczego błąd był trudny do znalezienia.
Aby to zmienić należy przekazać informacje do mechanizmu. O dziwo pomaga tutaj wykorzystanie fragment kodu który sprawdza czy zapis posta nie jest wywołana za pomocą metody AUTOSAVE. Wykonuje się to umieszczając poniższą definicję zaraz przed miejscem w którym aktualizujemy stronę przez panel. Prawdopodobnie będzie to funkcja zdefiniowana w pliku pluginu lub w functions.php w motywie, natomiast akcja do której będzie przypisana to save_post.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
Szczerze mówiąc dopiero później doczytałem do czego to służy, ale po wielokrotnych testach okazuje się że właśnie tego brakowało.
