O projekcie
Dwie niezależne wtyczki WordPressa zbudowane na tym samym wzorcu: „Nasze auta” z ofertą samochodów z aukcji IAAI i Copart oraz „Nasze motory” z motocyklami poleasingowymi. Obie są wdrożone u klienta i działają obok siebie na jednej stronie — osobne bazy, brak kolizji, wygląd dziedziczony z aktywnego motywu.
Kluczowa decyzja to rozdzielenie pobierania od pokazywania. Wtyczka sama nie pobiera niczego: tworzy podstronę, wpina ją w menu, czyta bazę tylko do odczytu i renderuje katalog z filtrami, paginacją, cache i danymi strukturalnymi. Pobieraniem zajmuje się osobny program w Pythonie uruchamiany na serwerze VPS z timera systemd: crawl, normalizacja, deduplikacja, audyt i zapis do własnej bazy MySQL. WP-cron tego nie zrobi, bo nie uruchomi Pythona.
Skutek dla klienta: strona serwuje ostatnie dobre dane także wtedy, gdy pobieranie się wywali, a błąd scrapera nie potrafi położyć witryny. Zdjęcia pojazdów są hotlinkowane ze źródła, więc hosting zajmuje 0 MB niezależnie od tego, czy w katalogu jest pięćdziesiąt czy pięć tysięcy pozycji.
Do produktu należy komplet dokumentacji dla osoby nietechnicznej — instrukcje krok po kroku w PDF — oraz klikalne demo w WordPress Playground: jeden link stawia WordPressa z wgraną wtyczką w przeglądarce klienta, bez instalowania czegokolwiek. Kolorowe kafle zamiast zdjęć są właściwością dema, nie produktu.
Problem
Dealer sprowadzający auta z aukcji chciał mieć na stronie aktualną ofertę bez ręcznego przepisywania ogłoszeń i bez zapychania hostingu tysiącami zdjęć.
Rozwiązanie
Program w Pythonie na VPS utrzymuje własną bazę ofert, a wtyczka WordPressa czyta ją tylko do odczytu i renderuje katalog z filtrami. Zdjęcia hotlinkowane, pobieranie odseparowane od strony.
Funkcje
- podstrona katalogu tworzy się sama po włączeniu wtyczki i wpina w menu
- karty pojazdów: zdjęcie, cena Buy Now, przebieg w kilometrach i milach, rodzaj uszkodzenia
- plakietki Copart, IAAI, Run & Drive i Key Available; filtry źródła, marki, rocznika i uszkodzenia
- sortowanie, paginacja, cache i dane strukturalne Schema.org
- scraper: crawl, normalizacja, deduplikacja i audyt przed zapisem do bazy
- zdjęcia hotlinkowane — 0 MB na dysku klienta
- dokumentacja dla osoby nietechnicznej: 23 pliki PDF
- demo w WordPress Playground do wysłania klientowi jednym linkiem
Moduły
iaai-importer
wtyczka WordPressPodstrona „Nasze auta” — samochody z dwóch źródeł, IAAI i Copart, rozróżnianych kolumną w bazie.
- czyta osobną bazę MySQL wyłącznie do odczytu; dane dostępu w stałych `wp-config.php`
- filtry źródła, marki, rocznika i typu uszkodzenia, sortowanie i paginacja
- dziedziczy motyw witryny — u klienta wygląda jak reszta strony, nie jak doklejony moduł
- procedura odinstalowania sprząta po sobie; wersja 0.30.6
motocykle-poleasingowe
wtyczka WordPressPodstrona „Nasze motory” — motocykle z serwisu poleasingowego, ta sama architektura.
- osobna baza i osobne stałe konfiguracyjne — obie wtyczki działają obok siebie bez kolizji
- własna oś wersji: 0.12.6
scraper
program w Pythonie na VPSJedyny element, który pobiera dane — poza WordPressem, z timera systemd albo crona.
- crawl → normalizacja → deduplikacja → audyt → zapis do bazy
- błąd pobierania nie dotyka strony: wtyczka serwuje ostatnie dobre dane
- instalacja i automatyzacja opisane w `deploy/`, testy w pytest
Architektura
- Podział
- monorepo z dwoma podprojektami; każdy: wtyczka PHP, scraper Python, deploy, schemat bazy, dokumentacja
- Rozmiar
- 7 958 linii Pythona w 47 plikach i 3 634 linie PHP w 21 plikach
- Historia
- 134 commity, 126 anotowanych tagów, 4 wydania; dziennik zmian budowany z tagów
- Dane
- osobna baza MySQL ze schematem w `db/schema.sql`; WordPress nie pisze do niej nigdy
- Zdjęcia
- hotlinkowane z serwerów aukcji — 0 MB na hostingu klienta
- Demo
- WordPress Playground z osobnego repozytorium `iaai-importer-demo`
- Licencja
- GPL-2.0-or-later, zgodna z licencją WordPressa
Technologie
- Python
- PHP
- WordPress
- MySQL
- systemd
Autor
Krzysztof LeszczyńskiAutomation & Plugins
