WordPress dzięki swoim rozszerzeniom i uniwersalnemu podejściu jest platformą którą można rozbudowywać teoretycznie bez granic. Całe Plugin Api daje ogromne możliwości w edycji oraz ingerencji wyświetlania elementów czy samych danych. Jedną z takich cech którą wykorzystuje jest możliwość przypisywania metadanych do poszczególnych wpisów. Domyślnie są to takie informacje jak typ wpisu, kategorie, tagi – praktycznie większość rzeczy które można ustawić po prawej stronie wpisu przy jego tworzeniu. Podczas pisania pluginu można również tworzyć własne metadane dla poszczególnych postów i tym samym rozszerzać możliwości całej platformy. W moim przypadku podstawową zmianą jest udostępnienie użytkownikowi wyboru wyświetlenia tytułu. W zależności od preferencji może być wyświetlany lub nie (i na przykład ustawiany bezpośrednio w treści strony). Jednak problem, który się pojawił był dość nietypowy. Po długim lokalizowaniu problemu okazało się, że ustawienia te są nadpisywane po jakimś czasie od zapisu strony. Dlaczego? Zaraz postaram się to wyjaśnić :)
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.