feat(v0.1): historia cen + jawnosc cen — milestone Initial Release
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>
This commit is contained in:
103
docs/readme.md
Normal file
103
docs/readme.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# Historia cen — dokumentacja
|
||||
|
||||
## Cron dzienny: zapisywanie historii cen
|
||||
|
||||
### Co robi
|
||||
|
||||
Raz na dobę WP Cron uruchamia zadanie `apartamenty_record_prices`, które:
|
||||
|
||||
1. Pobiera wszystkie opublikowane posty typu `apartamenty`
|
||||
2. Odczytuje aktualne ceny z pól ACF:
|
||||
- `information_price` — cena brutto (np. `"677 920"`)
|
||||
- `information_price_m2` — cena za m² (np. `"19 000"`)
|
||||
- `information_floor_space` — metraż (np. `"35,68"`)
|
||||
3. Zapisuje jeden rekord dziennie do tabeli `wp_price_history`
|
||||
4. Używa `INSERT IGNORE` — jeśli rekord dla danego apartamentu i daty już istnieje, pomija (bez duplikatów)
|
||||
|
||||
### Tabela bazy danych
|
||||
|
||||
**Nazwa:** `wp_price_history`
|
||||
|
||||
| Kolumna | Typ | Opis |
|
||||
|---------|-----|------|
|
||||
| `id` | BIGINT UNSIGNED AUTO_INCREMENT | Klucz główny |
|
||||
| `post_id` | BIGINT UNSIGNED | ID posta apartamentu |
|
||||
| `price` | VARCHAR(50) | Cena brutto jako string, np. `"677 920"` |
|
||||
| `price_m2` | VARCHAR(50) | Cena za m² jako string, np. `"19 000"` |
|
||||
| `floor_space` | VARCHAR(50) | Metraż jako string, np. `"35,68"` |
|
||||
| `recorded_at` | DATE | Data zapisu, np. `"2026-03-12"` |
|
||||
|
||||
Unikalny klucz: `(post_id, recorded_at)` — jeden wpis na apartament na dzień.
|
||||
|
||||
### Harmonogram
|
||||
|
||||
- **Częstotliwość:** raz dziennie (`daily`)
|
||||
- **Hook WP Cron:** `apartamenty_record_prices`
|
||||
- **Rejestracja:** przy każdym żądaniu strony (`wp` action), jeśli zadanie nie jest jeszcze zaplanowane
|
||||
|
||||
### Kod źródłowy
|
||||
|
||||
Plik: `wp-content/plugins/elementor-addon/elementor-addon.php`
|
||||
|
||||
- `elementor_addon_schedule_cron()` — rejestruje zadanie w WP Cron
|
||||
- `elementor_addon_record_prices()` — wykonuje zapis cen
|
||||
|
||||
### Ważne: WP Cron wymaga ruchu na stronie
|
||||
|
||||
WP Cron nie jest prawdziwym cronem systemowym — uruchamia się przy odwiedzeniu strony przez użytkownika. Jeśli strona ma mały ruch, zadanie może się nie wykonać o dokładnej porze.
|
||||
|
||||
**Rozwiązanie: prawdziwy cron systemowy (zalecane na produkcji)**
|
||||
|
||||
Wyłącz WP Cron w `wp-config.php`:
|
||||
|
||||
```php
|
||||
define( 'DISABLE_WP_CRON', true );
|
||||
```
|
||||
|
||||
Dodaj zadanie w cPanel → Cron Jobs (lub przez SSH):
|
||||
|
||||
```
|
||||
0 6 * * * wget -q -O /dev/null "https://wyszynskiego12.pagedev.pl/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
|
||||
```
|
||||
|
||||
lub z curl:
|
||||
|
||||
```
|
||||
0 6 * * * curl -s "https://wyszynskiego12.pagedev.pl/wp-cron.php?doing_wp_cron" > /dev/null 2>&1
|
||||
```
|
||||
|
||||
Powyższe uruchamia cron codziennie o 6:00.
|
||||
|
||||
### Ręczne uruchomienie (debugowanie)
|
||||
|
||||
Aby wymusić zapis raz ręcznie bez czekania na cron, wklej w przeglądarce (zalogowany jako admin):
|
||||
|
||||
```
|
||||
https://wyszynskiego12.pagedev.pl/wp-cron.php?doing_wp_cron
|
||||
```
|
||||
|
||||
Lub przez WP-CLI (SSH):
|
||||
|
||||
```bash
|
||||
wp cron event run apartamenty_record_prices
|
||||
```
|
||||
|
||||
### Sprawdzenie następnego uruchomienia (WP-CLI)
|
||||
|
||||
```bash
|
||||
wp cron event list
|
||||
```
|
||||
|
||||
### Weryfikacja zapisanych danych (SQL)
|
||||
|
||||
```sql
|
||||
SELECT * FROM wp_price_history ORDER BY recorded_at DESC LIMIT 20;
|
||||
```
|
||||
|
||||
Liczba rekordów per apartament:
|
||||
|
||||
```sql
|
||||
SELECT post_id, COUNT(*) as wpisy, MIN(recorded_at) as od, MAX(recorded_at) as do
|
||||
FROM wp_price_history
|
||||
GROUP BY post_id;
|
||||
```
|
||||
Reference in New Issue
Block a user