xStore.search

Tìm kiếm sản phẩm, và tìm kiếm nội dung (bài viết + trang tĩnh).

Phương thức

Phương thức Cú pháp Mô tả Từ phiên bản
products xStore.search.products({ q, limit, cursor, categoryId, brandId }): Promise<CursorPaginatedResponse<SearchResultItem>> Tìm kiếm sản phẩm theo từ khoá. Mỗi kết quả CHỈ có id, title, slug, current_status — không giá, không ảnh, không url; hydrate bằng products.list({ ids }) nếu cần thẻ đầy đủ. Con trỏ ở đây là con trỏ OFFSET chứ không phải keyset: truyền lại nguyên văn, đừng tự diễn giải. 2.1
content xStore.search.content({ q, entityType, limit, cursor }): Promise<CursorPaginatedResponse<ContentSearchResultItem>> Tìm trong bài viết và trang tĩnh. Bỏ trống entityType để tìm cả hai; mỗi kết quả có entity_type, title, slug, summary. 2.1
query không dùng nữa xStore.search.query({ q, limit, cursor, categoryId, brandId }): Promise<CursorPaginatedResponse<SearchResultItem>> Tên cũ của xStore.search.products(), chỉ còn trên bản dựng cho trình duyệt. Vẫn hoạt động; sẽ bỏ ở phiên bản sau. 1.0

Ví dụ đầy đủ

<script>
  // Chờ khách gõ xong rồi mới gọi, nếu không mỗi phím là một lần gọi máy chủ.
  const input = document.getElementById('search-input');
  const out   = document.getElementById('search-results');

  input.addEventListener('input', xStore.utils.debounce(run, 250));

  async function run() {
    const q = input.value.trim();
    if (q.length < 2) {
      out.innerHTML = '';
      return;
    }

    const page = await xStore.search.products({ q, limit: 10 });

    // Kết quả tìm kiếm CHỈ có id, title, slug, current_status —
    // không có giá, không có ảnh, không có url. Muốn dựng thẻ sản phẩm
    // đầy đủ thì lấy id rồi gọi products.list({ ids }).
    out.innerHTML = page.items.length
      ? page.items.map((item) => `<li data-id="${item.id}">${item.title}</li>`).join('')
      : '<li>Không tìm thấy sản phẩm nào.</li>';

    // Con trỏ ở đây là con trỏ OFFSET, không phải keyset. Truyền lại
    // nguyên văn, đừng tự diễn giải.
    out.dataset.cursor = page.has_more ? page.next_cursor : '';
  }

  // Tìm trong bài viết và trang tĩnh.
  async function searchContent(q) {
    const page = await xStore.search.content({ q, entityType: 'article', limit: 10 });
    return page.items.map((c) => `${c.entity_type}: ${c.title} — ${c.summary ?? ''}`);
  }
</script>

Thư viện gọi tới /api/... trên chính tên miền cửa hàng, nên không cần khai báo địa chỉ máy chủ ở bất kỳ đâu.

Xem thêm Sự kiện để giao diện tự cập nhật sau mỗi thao tác.