Zadanie Rekrutacyjne 2Colors
Opis projektu
Projekt został wykonany w oparciu o własny klasyczny motyw WordPress z użyciem Bootstrap 5 do szybkiego stylowania oraz obsługi interfejsu (m.in. taby, akordeony).
Dane pochodzą z API Sejmu, a ich integracja została zrealizowana w formie dedykowanej wtyczki. Na potrzeby projektu stworzyłem dwa Custom Post Types (CPT): poslowie i partie.
🔄 Synchronizacja z API
Pobieranie danych z API zrealizowałem asynchronicznie (AJAX) – dzięki temu możliwe było wyeliminowanie problemów z przekroczeniem czasu wykonania (np. 120s timeout, critical error) przy większych zbiorach danych.
Wtyczka obsługuje dynamiczne ładowanie z loaderem postępu, który pokazuje, ile danych zostało do pobrania. Dane posłów i partii pobierane są poprzez dwa własne endpointy REST API:
/wp-json/sejm/v1/partie/wp-json/sejm/v1/poslowie
Zabezpieczenia realizuję poprzez permission_callback, który dopuszcza tylko administratora.
⚙️ Przetwarzanie danych
Dane pobieram za pomocą file_get_contents() — choć nie jest to najlepsze rozwiązanie do środowiska produkcyjnego, na potrzeby zadania rekrutacyjnego było szybkie i skuteczne.
Przetwarzanie danych odbywa się w dwóch funkcjach:
create_update_posel()create_update_partia()
Jeśli poseł lub partia już istnieje, dane są aktualizowane. W przeciwnym razie tworzony jest nowy wpis.
👤 Strona posła
Strona pojedynczego posła to najważniejszy element systemu. Oprócz danych podstawowych i przynależności do partii, wyświetlam również:
- głosowania i ich wyniki
- interpelacje
- komisje, do których należy
Nie zastosowałem dla tych elementów osobnych CPT – dane są pobierane serwerowo po ID posła, co daje pełen server-side rendering i korzystnie wpływa na SEO.
Dodatkowo, szczegóły głosowań są ładowane dopiero przy potrzebie (on demand) za pomocą fetch(), co znacząco przyspiesza czas ładowania strony.
🏛️ Strona partii
Każda partia posiada dwa pola: identyfikator oraz repeater z członkami – czyli listę posłów przypisanych do tej partii, generowaną dynamicznie na podstawie relacji z CPT poslowie.