{"id":12106,"date":"2026-06-16T08:21:04","date_gmt":"2026-06-16T13:21:04","guid":{"rendered":"https:\/\/discnet.com.pe\/?page_id=12106"},"modified":"2026-06-16T12:27:05","modified_gmt":"2026-06-16T17:27:05","slug":"discnet","status":"publish","type":"page","link":"https:\/\/discnet.com.pe\/en\/","title":{"rendered":"DISCNET"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12106\" class=\"elementor elementor-12106\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9d9c346 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"9d9c346\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-87b4c02\" data-id=\"87b4c02\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-07fece1 elementor-widget elementor-widget-html\" data-id=\"07fece1\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<script>\n(function () {\n  \"use strict\";\n\n  \/*\n    DISCNET - CAT\u00c1LOGO INFINITO ALEATORIO R\u00c1PIDO\n\n    NO descarga todos los productos.\n    Solo detecta cu\u00e1ntas p\u00e1ginas existen y luego carga p\u00e1ginas aleatorias.\n    Cada p\u00e1gina equivale a un rango de productos por fecha.\n  *\/\n\n  const gridId = \"discnet-products-grid\";\n  const buttonId = \"discnet-load-btn\";\n\n  const perPage = 30;\n\n  let totalPages = 1;\n  let usedPages = [];\n  let loading = false;\n  let finished = false;\n  let initialized = false;\n\n  function ready(fn) {\n    if (document.readyState !== \"loading\") {\n      fn();\n    } else {\n      document.addEventListener(\"DOMContentLoaded\", fn);\n    }\n  }\n\n  function getGrid() {\n    return document.getElementById(gridId);\n  }\n\n  function getButton() {\n    return document.getElementById(buttonId);\n  }\n\n  function setButtonText(text) {\n    const btn = getButton();\n    if (btn) btn.textContent = text;\n  }\n\n  function safeText(text) {\n    return String(text || \"\")\n      .replace(\/&\/g, \"&amp;\")\n      .replace(\/<\/g, \"&lt;\")\n      .replace(\/>\/g, \"&gt;\")\n      .replace(\/\"\/g, \"&quot;\");\n  }\n\n  function shuffleArray(array) {\n    const arr = array.slice();\n\n    for (let i = arr.length - 1; i > 0; i--) {\n      const j = Math.floor(Math.random() * (i + 1));\n      [arr[i], arr[j]] = [arr[j], arr[i]];\n    }\n\n    return arr;\n  }\n\n  function getRandomPage() {\n    \/*\n      Escoge una p\u00e1gina aleatoria que todav\u00eda no se haya usado.\n      Cuando ya us\u00f3 todas, reinicia el ciclo.\n    *\/\n\n    if (usedPages.length >= totalPages) {\n      usedPages = [];\n    }\n\n    let page;\n    let tries = 0;\n\n    do {\n      page = Math.floor(Math.random() * totalPages) + 1;\n      tries++;\n    } while (usedPages.includes(page) && tries < 100);\n\n    usedPages.push(page);\n\n    return page;\n  }\n\n  function renderSkeleton() {\n    const grid = getGrid();\n    if (!grid) return;\n\n    let html = \"\";\n\n    for (let i = 0; i < 6; i++) {\n      html += '<div class=\"discnet-loading-card\"><\/div>';\n    }\n\n    grid.insertAdjacentHTML(\"beforeend\", html);\n  }\n\n  function removeSkeleton() {\n    document.querySelectorAll(\".discnet-loading-card\").forEach(function (el) {\n      el.remove();\n    });\n  }\n\n  function productCard(product) {\n    const img =\n      product.images && product.images[0] && product.images[0].src\n        ? product.images[0].src\n        : \"\";\n\n    const link = product.permalink || \"#\";\n    const name = safeText(product.name);\n    const price = product.price_html || \"\";\n    const id = product.id || \"\";\n\n    const stock = product.is_in_stock\n      ? '<span class=\"discnet-stock\">\ud83d\udce6 Disponible<\/span>'\n      : '<span class=\"discnet-stock out\">Sin existencias<\/span>';\n\n    return `\n      <div class=\"discnet-card\">\n\n        <a class=\"discnet-img-box2\" href=\"${link}\">\n          <img decoding=\"async\" src=\"${img}\" alt=\"${name}\" loading=\"lazy\">\n        <\/a>\n\n        <div class=\"discnet-info\">\n\n          <h3 class=\"discnet-title\">\n            <a href=\"${link}\">${name}<\/a>\n          <\/h3>\n\n          <div class=\"discnet-price\">\n            ${price}\n          <\/div>\n\n          ${stock}\n\n          <div class=\"discnet-actions\">\n            <a class=\"discnet-buy\" href=\"${link}\">\n              Ver producto\n            <\/a>\n\n            <a class=\"discnet-cart\" href=\"\/?add-to-cart=${id}\" title=\"Agregar al carrito\">\n              \ud83d\uded2\n            <\/a>\n          <\/div>\n\n        <\/div>\n\n      <\/div>\n    `;\n  }\n\n  async function detectTotalPages() {\n    \/*\n      Consulta liviana.\n      Solo sirve para saber cu\u00e1ntas p\u00e1ginas\/rangos de productos existen.\n      No se renderiza esta respuesta.\n    *\/\n\n    const url =\n      \"\/wp-json\/wc\/store\/v1\/products?per_page=\" +\n      perPage +\n      \"&page=1&orderby=date&order=desc\";\n\n    const res = await fetch(url, {\n      credentials: \"same-origin\"\n    });\n\n    if (!res.ok) {\n      throw new Error(\"No se pudo detectar total de p\u00e1ginas\");\n    }\n\n    totalPages = parseInt(res.headers.get(\"X-WP-TotalPages\") || \"1\", 10);\n\n    if (!totalPages || totalPages < 1) {\n      totalPages = 1;\n    }\n\n    initialized = true;\n  }\n\n  async function fetchRandomProducts() {\n    const randomPage = getRandomPage();\n\n    const url =\n      \"\/wp-json\/wc\/store\/v1\/products?per_page=\" +\n      perPage +\n      \"&page=\" +\n      randomPage +\n      \"&orderby=date&order=desc\";\n\n    const res = await fetch(url, {\n      credentials: \"same-origin\"\n    });\n\n    if (!res.ok) {\n      throw new Error(\"Error cargando p\u00e1gina aleatoria \" + randomPage);\n    }\n\n    const products = await res.json();\n\n    if (!Array.isArray(products)) {\n      return [];\n    }\n\n    \/*\n      Aqu\u00ed mezcla los productos dentro de ese rango aleatorio.\n    *\/\n    return shuffleArray(products);\n  }\n\n  async function loadProducts() {\n    if (loading || finished || !initialized) return;\n\n    const grid = getGrid();\n    if (!grid) return;\n\n    loading = true;\n    setButtonText(\"\u23f3 CARGANDO PRODUCTOS ALEATORIOS...\");\n    renderSkeleton();\n\n    try {\n      const products = await fetchRandomProducts();\n\n      removeSkeleton();\n\n      if (!products.length) {\n        setButtonText(\"\u26a0\ufe0f No se encontraron productos\");\n        loading = false;\n        return;\n      }\n\n      let html = \"\";\n\n      products.forEach(function (product) {\n        html += productCard(product);\n      });\n\n      grid.insertAdjacentHTML(\"beforeend\", html);\n\n      setButtonText(\"\ud83d\ude80 CARGANDO M\u00c1S PRODUCTOS...\");\n    } catch (error) {\n      console.error(\"Error cargando productos Discnet:\", error);\n      removeSkeleton();\n      setButtonText(\"\u26a0\ufe0f ERROR AL CARGAR PRODUCTOS\");\n    }\n\n    loading = false;\n  }\n\n  function handleScroll() {\n    if (loading || finished || !initialized) return;\n\n    const btn = getButton();\n    if (!btn) return;\n\n    const rect = btn.getBoundingClientRect();\n    const distanceToButton = rect.top - window.innerHeight;\n\n    if (distanceToButton < 700) {\n      loadProducts();\n    }\n  }\n\n  ready(async function () {\n    const grid = getGrid();\n    const btn = getButton();\n\n    if (!grid || !btn) return;\n\n    document.body.classList.add(\"discnet-solo-productos\");\n\n    grid.innerHTML = \"\";\n    setButtonText(\"\u23f3 Preparando cat\u00e1logo aleatorio...\");\n\n    try {\n      await detectTotalPages();\n\n      await loadProducts();\n\n      btn.addEventListener(\"click\", loadProducts);\n      window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n    } catch (error) {\n      console.error(\"Error inicializando cat\u00e1logo Discnet:\", error);\n      removeSkeleton();\n      setButtonText(\"\u26a0\ufe0f ERROR AL INICIAR CAT\u00c1LOGO\");\n    }\n  });\n\n})();\n<\/script>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b575fc0 elementor-widget elementor-widget-html\" data-id=\"b575fc0\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<section id=\"discnet-catalogo-infinito\">\r\n\r\n  <div class=\"discnet-catalogo-head\">\r\n    <div>\r\n        <!--\r\n      <h2>Cat\u00e1logo de productos<\/h2>\r\n      <p>Explora nuestros productos disponibles<\/p> -->\r\n    <\/div>\r\n<!--\r\n    <span>Carga infinita activa<\/span> -->\r\n  <\/div>\r\n\r\n  <div id=\"discnet-products-grid\"><\/div>\r\n\r\n  <button id=\"discnet-load-btn\" type=\"button\">\r\n    \ud83d\ude80 CARGANDO M\u00c1S PRODUCTOS...\r\n  <\/button>\r\n\r\n<\/section>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\ud83d\ude80 CARGANDO M\u00c1S PRODUCTOS&#8230;<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-12106","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/pages\/12106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/comments?post=12106"}],"version-history":[{"count":14,"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/pages\/12106\/revisions"}],"predecessor-version":[{"id":12123,"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/pages\/12106\/revisions\/12123"}],"wp:attachment":[{"href":"https:\/\/discnet.com.pe\/en\/wp-json\/wp\/v2\/media?parent=12106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}