# Prology – Banner sản phẩm liên quan
Banner quảng cáo tự lấy sản phẩm liên quan từ Magento (có ảnh + còn hàng), nhúng vào bài blog WordPress.
> **Kiến trúc an toàn:** script nhúng (public) **KHÔNG** chứa tài khoản/token/REST Magento.
> Mọi thao tác Magento (login, search, lọc tồn kho) nằm ở **server riêng**. Client chỉ gọi endpoint server.
## Cấu trúc
```
prology-product-banner/
├── prology-product-banner.js # Script nhúng vào blog (SERVER-ONLY, không lộ Magento)
├── demo.html # Trang blog mô phỏng để xem thử (cần server chạy)
├── console-test.js # ⚠️ DEV-ONLY: dán tay vào Console để test, chứa creds — KHÔNG nhúng
└── server/ # API Node.js — login Magento + lọc stock + cache + CORS
├── server.js
├── package.json
└── .env.example
```
## 1) Chạy server (bắt buộc)
```bash
cd server
npm install
cp .env.example .env # chỉnh MAGENTO_PASS, ALLOWED_ORIGIN...
npm start # http://localhost:8787
```
Test:
```
http://localhost:8787/api/related-products?q=Catalyst%209300,Catalyst%209200,Cisco&count=16&store=au
```
## 2) Nhúng vào blog
```html
```
Script chỉ gọi `endpoint?q=&count=&store=` và render kết quả. Không có thông tin Magento nào trong file này.
## 3) Test nhanh khi chưa deploy server (DEV-ONLY)
`console-test.js` cho phép xem thử ngay trên prology.net **mà không cần server** — nhưng nó **chứa tài khoản admin** và gọi Magento trực tiếp.
- Chỉ dùng để **dán tay vào DevTools Console của chính bạn**. F12 → Console → dán → Enter.
- **TUYỆT ĐỐI KHÔNG** nhúng vào trang, không commit lên site, không để lộ cho khách.
## Tuỳ chỉnh (window.PROLOGY_BANNER)
| Option | Mặc định | Ý nghĩa |
|---|---|---|
| `endpoint` | **(bắt buộc)** | URL server của bạn |
| `count` | 16 | Số sản phẩm trong carousel (10-20) |
| `store` | `null` (auto) | `'au'` \| `'us'` \| `null` = tự phát hiện theo vị trí (geo) |
| `keywords` | tự tách từ `` | Mảng keyword tìm sản phẩm liên quan |
| `placement` | `after-first-table` | `start` \| `end` \| `after-first-table` |
| `mountSelector` | `.entry-content,...` | Vùng nội dung bài viết |
## Store theo vị trí client (AU → `au`, còn lại → `us`)
- **Client**: gọi `/cdn-cgi/trace` (Cloudflare, cùng origin — chỉ là **geo**, không phải thông tin Magento). `loc=AU` → `au`, khác → `us`. Fallback timezone/locale. Gửi kèm `?store=` cho server.
- **Server**: nhận `?store=`; nếu thiếu → đọc header `CF-IPCountry`; nếu vẫn không có → `DEFAULT_STORE`. Cấu hình `.env`: `STORES=au,us`, `DEFAULT_STORE=us`.
## Ghi chú bảo mật
- **Script public không lộ Magento**: không user/password, không admin token, không URL REST. Tất cả ở server.
- Server: đặt `ALLOWED_ORIGIN=https://prology.net`, để `.env` ngoài repo, nên đặt sau Cloudflare/HTTPS.
- Banner dùng Shadow DOM → CSS không đụng theme WordPress; tự khóa width đúng `.entry-content`.
- Link sản phẩm gắn `rel="nofollow noopener sponsored"`, mở tab mới.