Historia cen: - Tabela wp_price_history z WP Cronem dziennym (snapshot cen) - AJAX endpoint apartamenty_get_price_history (zabezpieczony nonce) - Popup "Historia cen" w widgecie — vanilla JS, modal zgodny z projektem Jawnosc cen: - Endpointy /ceny-mieszkan.xml + /dane-gov-pl.xml (XSD-compliant) - Pliki MD5 dla obu XML - Strona admina: Narzedzia -> Jawnosc Cen z URL-ami do Ministerstwa - Transient cache 1h z inwalidacja przez cron Dokumentacja: docs/readme.md + docs/jawnosc-cen.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
110 lines
4.3 KiB
Markdown
110 lines
4.3 KiB
Markdown
---
|
|
phase: 01-historia-cen
|
|
plan: 01
|
|
subsystem: database
|
|
tags: [wordpress, acf, cron, ajax, mysql]
|
|
|
|
requires: []
|
|
provides:
|
|
- "Tabela wp_price_history z unikalnym kluczem (post_id, recorded_at)"
|
|
- "WP Cron dzienny zapisujący ceny apartamentów z ACF"
|
|
- "AJAX endpoint apartamenty_get_price_history (zalogowani i goście)"
|
|
- "wp_localize_script przekazujący ajaxUrl + nonce do JS"
|
|
affects: ["01-02-frontend"]
|
|
|
|
tech-stack:
|
|
added: []
|
|
patterns:
|
|
- "INSERT IGNORE dla idempotentnego zapisu dziennego"
|
|
- "dbDelta() + get_option version check dla migracji DB"
|
|
- "wp_localize_script na priorytecie 20 po register"
|
|
|
|
key-files:
|
|
modified:
|
|
- "wp-content/plugins/elementor-addon/elementor-addon.php"
|
|
|
|
key-decisions:
|
|
- "ACF flat meta keys (information_price, information_price_m2, information_floor_space) zamiast serializowanego pola 'information'"
|
|
- "INSERT IGNORE zamiast ON DUPLICATE KEY UPDATE — historia to snapshot, nie aktualizacja"
|
|
- "Hook 'wp' dla crona (nie 'init') — gwarantuje kontekst frontendu"
|
|
|
|
patterns-established:
|
|
- "Nonce: apartamenty_price_history_nonce — używany w JS i PHP"
|
|
- "AJAX action: apartamenty_get_price_history"
|
|
- "Dane JS: window.apartamentsData.ajaxUrl, .nonce"
|
|
|
|
duration: 15min
|
|
started: 2026-03-12T14:00:00Z
|
|
completed: 2026-03-12T14:15:00Z
|
|
---
|
|
|
|
# Faza 1 Plan 01: Backend Historii Cen — Summary
|
|
|
|
**Tabela `wp_price_history` + WP Cron dzienny + AJAX endpoint zabezpieczony nonce — cały backend historii cen gotowy.**
|
|
|
|
## Performance
|
|
|
|
| Metryka | Wartość |
|
|
|---------|---------|
|
|
| Czas wykonania | ~15 min |
|
|
| Zadania | 2 ukończone |
|
|
| Pliki zmienione | 1 |
|
|
|
|
## Acceptance Criteria Results
|
|
|
|
| Kryterium | Status | Uwagi |
|
|
|-----------|--------|-------|
|
|
| AC-1: Tabela istnieje w bazie | Pass | Zweryfikowano przez bezpośrednie połączenie DB — tabela `wp_price_history` założona |
|
|
| AC-2: Cron zapisuje ceny codziennie | Pass | Hook `apartamenty_record_prices` zarejestrowany na `daily`, INSERT IGNORE zweryfikowany |
|
|
| AC-3: AJAX endpoint zwraca historię | Pass | Akcje `wp_ajax_*` zarejestrowane, struktura JSON zgodna z planem |
|
|
| AC-4: Nonce zabezpiecza AJAX | Pass | `check_ajax_referer` przed jakimkolwiek dostępem do danych |
|
|
|
|
## Accomplishments
|
|
|
|
- Tabela `wp_price_history` założona w bazie przez `dbDelta()` — samonaprawiająca się migracja
|
|
- WP Cron `apartamenty_record_prices` dzienny — zapis snapshot cen ze wszystkich apartamentów
|
|
- AJAX endpoint publiczny (nopriv) zwracający tytuł, aktualne ceny i historię jako JSON
|
|
- Nonce `apartamenty_price_history_nonce` przekazany do JS przez `wp_localize_script`
|
|
|
|
## Files Created/Modified
|
|
|
|
| Plik | Zmiana | Co dodano |
|
|
|------|--------|-----------|
|
|
| `wp-content/plugins/elementor-addon/elementor-addon.php` | Zmodyfikowany | +~140 linii: tabela DB, cron, AJAX endpoint, wp_localize_script |
|
|
|
|
## Decisions Made
|
|
|
|
| Decyzja | Uzasadnienie | Wpływ |
|
|
|---------|--------------|-------|
|
|
| Flat meta keys zamiast `get_field('information')` | ACF zapisuje dane jako płaskie klucze — `information_price` etc. istnieją i są puste dla `information` | Cron pobiera dane bezpośrednio przez `get_post_meta` |
|
|
| INSERT IGNORE zamiast UPDATE | Historia to snapshot — nie nadpisujemy dawnych wpisów | Jeden rekord na apartament na dzień, bezpieczny dla wielu wywołań |
|
|
| Hook `wp` dla crona | Gwarantuje pełny kontekst WP przy rejestracji | Cron rejestruje się tylko na stronach frontendowych/adminowych |
|
|
|
|
## Deviations from Plan
|
|
|
|
Brak odchyleń — plan wykonany dokładnie jak zaplanowano.
|
|
|
|
## Issues Encountered
|
|
|
|
| Problem | Rozwiązanie |
|
|
|---------|-------------|
|
|
| Brak klienta mysql CLI na lokalnym środowisku | Weryfikacja przez PHP mysqli (tymczasowy skrypt `.paul/verify_task1.php`, usunięty po weryfikacji) |
|
|
|
|
## Next Phase Readiness
|
|
|
|
**Gotowe dla 01-02 (Frontend):**
|
|
- `window.apartamentsData.ajaxUrl` — URL do admin-ajax.php
|
|
- `window.apartamentsData.nonce` — nonce do requestu
|
|
- AJAX action: `apartamenty_get_price_history` z `post_id` w POST body
|
|
- Odpowiedź JSON: `{ success, data: { title, price, price_m2, floor_space, history: [{recorded_at, price, price_m2}] } }`
|
|
|
|
**Uwagi:**
|
|
- Tabela ma 1 testowy rekord dla apt 203 (2026-03-12) — wstawiony podczas weryfikacji
|
|
- Cron uruchomi się automatycznie przy pierwszym odwiedzeniu strony przez WP
|
|
|
|
**Blokady:** Brak
|
|
|
|
---
|
|
*Phase: 01-historia-cen, Plan: 01*
|
|
*Completed: 2026-03-12*
|