--- 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*