{"id":8099,"date":"2025-09-11T14:03:05","date_gmt":"2025-09-11T20:03:05","guid":{"rendered":"https:\/\/buzkme.com\/bazar\/?page_id=8099"},"modified":"2026-04-17T10:10:29","modified_gmt":"2026-04-17T16:10:29","slug":"catalogo-general","status":"publish","type":"page","link":"https:\/\/buzkme.com\/bazar\/catalogo-general\/","title":{"rendered":"CAT\u00c1LOGO"},"content":{"rendered":"        <div id=\"catweb-app\" class=\"catweb-wrap\" data-per-page=\"60\" data-categoria=\"\">\n            <div class=\"catweb-toolbar\">\n                                <div class=\"catweb-cats\">\n                    <button class=\"catweb-cat is-active\" data-slug=\"\">Todas<\/button>\n                                            <button class=\"catweb-cat \" data-slug=\"art-personales\">Art\u00edculos Personales<\/button>\n                                            <button class=\"catweb-cat \" data-slug=\"hogar\">HOGAR<\/button>\n                                            <button class=\"catweb-cat \" data-slug=\"sin-categorizar\">NUEVO o RESURTIDO<\/button>\n                                            <button class=\"catweb-cat \" data-slug=\"lo-nuevo-y-resurtido\">OFERTAS<\/button>\n                                    <\/div>\n                                <div class=\"catweb-actions\">\n                    <div class=\"catweb-modes\" role=\"tablist\" aria-label=\"Modo de b\u00fasqueda\">\n                        <button type=\"button\" class=\"catweb-mode is-active\" data-mode=\"catalogo\" role=\"tab\" aria-selected=\"true\">Cat\u00e1logo<\/button>\n                        <button type=\"button\" class=\"catweb-mode\" data-mode=\"manage_stock\" role=\"tab\" aria-selected=\"false\">Manage_stock<\/button>\n                    <\/div>\n                    <div class=\"catweb-searchwrap\">\n                        <input type=\"search\" class=\"catweb-search\" placeholder=\"Buscar por nombre o subcategor\u00eda\u2026\">\n                        <button type=\"button\" class=\"catweb-searchbtn\" title=\"Buscar\">\ud83d\udd0e<\/button>\n                    <\/div>\n                    <select class=\"catweb-orderby\">\n    <option value=\"subcat|ASC\">Subcategor\u00eda A\u2013Z<\/option>\n    <option value=\"subcat|DESC\">Subcategor\u00eda Z\u2013A<\/option>\n    <option value=\"sku|ASC\">SKU \u2191<\/option>\n    <option value=\"sku|DESC\">SKU \u2193<\/option>\n    <option value=\"manage_stock|ASC\">Manage_stock A\u2013Z<\/option>\n    <option value=\"manage_stock|DESC\">Manage_stock Z\u2013A<\/option>\n    <option value=\"name|ASC\">Nombre A\u2013Z<\/option>\n    <option value=\"name|DESC\">Nombre Z\u2013A<\/option>\n<\/select>\n\n                    <select class=\"catweb-subcatfilter\" title=\"Filtrar por subcategor\u00eda\">\n                        <option value=\"\">Todas las subcategor\u00edas<\/option>\n                                                    <optgroup label=\"Art\u00edculos Personales\">\n                                                                    <option value=\"bisuteria\">BISUTER\u00cdA<\/option>\n                                                                    <option value=\"bolsos\">BOLSOS<\/option>\n                                                                    <option value=\"caballero-art-personales\">CABALLERO<\/option>\n                                                                    <option value=\"cabello\">CABELLO<\/option>\n                                                                    <option value=\"calzado\">CALZADO<\/option>\n                                                                    <option value=\"carteras\">CARTERAS<\/option>\n                                                                    <option value=\"corporal\">CORPORAL<\/option>\n                                                                    <option value=\"maquillaje\">COSM\u00c9TICOS<\/option>\n                                                                    <option value=\"espejos\">ESPEJOS<\/option>\n                                                                    <option value=\"facial\">FACIAL<\/option>\n                                                                    <option value=\"mochilas\">MOCHILAS<\/option>\n                                                                    <option value=\"outfit\">OUTFIT<\/option>\n                                                                    <option value=\"pelucas\">PELUCAS<\/option>\n                                                                    <option value=\"precio-10\">Precio $10<\/option>\n                                                                    <option value=\"precio-15\">Precio $15<\/option>\n                                                                    <option value=\"precio-20\">Precio $20<\/option>\n                                                                    <option value=\"precio-30\">Precio $30<\/option>\n                                                                    <option value=\"unas\">U\u00d1AS<\/option>\n                                                                    <option value=\"x-precio\">X PRECIO $$$<\/option>\n                                                                    <option value=\"intimo\">\u00cdNTIMO<\/option>\n                                                            <\/optgroup>\n                                                    <optgroup label=\"HOGAR\">\n                                                                    <option value=\"audio\">AUDIO<\/option>\n                                                                    <option value=\"automovil\">AUTOM\u00d3VIL<\/option>\n                                                                    <option value=\"bebes\">BEB\u00c9S<\/option>\n                                                                    <option value=\"cocina\">COCINA<\/option>\n                                                                    <option value=\"consentidos\">CONSENTIDOS<\/option>\n                                                                    <option value=\"computo\">C\u00d3MPUTO<\/option>\n                                                                    <option value=\"decoracion\">DECORACI\u00d3N<\/option>\n                                                                    <option value=\"deportes\">DEPORTES<\/option>\n                                                                    <option value=\"electro\">ELECTR\u00d3NICOS<\/option>\n                                                                    <option value=\"herramienta\">HERRAMIENTA<\/option>\n                                                                    <option value=\"home\">HOME<\/option>\n                                                                    <option value=\"humidificacor\">HUMIDIFICADOR<\/option>\n                                                                    <option value=\"iluminacion\">ILUMINACI\u00d3N<\/option>\n                                                                    <option value=\"juguetes-consentidos\">JUGUETES<\/option>\n                                                                    <option value=\"kitty-sanrio\">KITTY-SANRIO<\/option>\n                                                                    <option value=\"limpieza\">LIMPIEZA<\/option>\n                                                                    <option value=\"mascotas-consentidos\">MASCOTAS<\/option>\n                                                                    <option value=\"movil\">M\u00d3VIL<\/option>\n                                                                    <option value=\"organizadores\">ORGANIZADORES<\/option>\n                                                                    <option value=\"papeleria\">PAPELER\u00cdA<\/option>\n                                                                    <option value=\"regalos\">REGALOS<\/option>\n                                                                    <option value=\"salud-hogar\">SALUD<\/option>\n                                                                    <option value=\"sol-y-lluvia\">SOL Y LLUVIA<\/option>\n                                                                    <option value=\"electronicos\">TECNOLOG\u00cdA<\/option>\n                                                                    <option value=\"termos-y-vasos\">TERMOS Y VASOS<\/option>\n                                                                    <option value=\"ventiladores\">VENTILADORES<\/option>\n                                                            <\/optgroup>\n                                            <\/select>\n\n                    <div class=\"catweb-printbar\">\n                        <button class=\"btn-print-clean\" title=\"Abrir vista limpia para imprimir\">\ud83e\uddfe Vista limpia<\/button>\n                        <button class=\"btn-print-now\"   title=\"Imprimir esta vista\">\ud83d\udda8\ufe0f Imprimir<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <!-- Barra de SUBCATEGOR\u00cdAS del seleccionado -->\n            <div class=\"catweb-subcats\" style=\"display:none\">\n                <div class=\"subcats-title\">Subcategor\u00edas:<\/div>\n                <div class=\"subcats-list\"><\/div>\n            <\/div>\n\n            <div class=\"catweb-results\" aria-live=\"polite\"><\/div>\n            <div class=\"catweb-sentinel\" aria-hidden=\"true\"><\/div>\n            <div class=\"catweb-footer\">\n                <button class=\"catweb-loadmore\" style=\"display:none\">Cargar m\u00e1s<\/button>\n                <span class=\"catweb-pages\"><\/span>\n            <\/div>\n        <\/div>\n\n        <style>\n        .catweb-wrap{font-family:system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif; color:#111;}\n        .catweb-toolbar{display:flex; gap:12px; align-items:center; justify-content:space-between; flex-wrap:wrap; margin-bottom:12px;}\n        .catweb-cats{display:flex; gap:8px; flex-wrap:wrap;}\n        .catweb-cat{border:1px solid #ddd; background:#fff; padding:6px 10px; border-radius:999px; cursor:pointer; font-size:14px;}\n        .catweb-cat.is-active{background:#111; color:#fff; border-color:#111;}\n        .catweb-actions{display:flex; gap:8px; align-items:center; flex-wrap:wrap;}\n        .catweb-modes{display:flex; gap:6px; align-items:center;}\n        .catweb-mode{border:1px solid #ddd; background:#fff; padding:7px 10px; border-radius:999px; cursor:pointer; font-size:12px;}\n        .catweb-mode.is-active{background:#111; color:#fff; border-color:#111;}\n        .catweb-searchwrap{display:flex; align-items:center; gap:6px;}\n        .catweb-searchbtn{padding:7px 10px; border:1px solid #ddd; border-radius:8px; background:#fafafa; cursor:pointer; font-size:12px;}\n\n        .catweb-search,.catweb-orderby,.catweb-subcatfilter{padding:7px 10px; border:1px solid #ddd; border-radius:6px;}\n        .catweb-printbar .btn-print-clean, .catweb-printbar .btn-print-now{padding:7px 10px; border:1px solid #ddd; border-radius:8px; background:#fafafa; cursor:pointer; font-size:12px;}\n\n        \/* 2 columnas fijas (1 en m\u00f3viles) *\/\n        .catweb-results{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:12px; }\n        @media (max-width:640px){ .catweb-results{ grid-template-columns:1fr; } }\n\n        .catweb-card{border:1px solid #eee; border-radius:12px; padding:10px; display:flex; gap:10px; align-items:flex-start; background:#fff;}\n        .catweb-thumb{flex:0 0 60px; width:60px; height:60px; border-radius:8px; overflow:hidden; background:#f7f7f7; display:flex; align-items:center; justify-content:center;}\n        .catweb-thumb img{width:100%; height:100%; object-fit:cover;}\n        .catweb-info{flex:1 1 auto; min-width:0;}\n        .catweb-name{font-weight:700; line-height:1.2; margin:0 0 4px; font-size:14px;}\n        .catweb-meta{font-size:12px; opacity:.8; margin-bottom:4px;} \/* subcategor\u00eda *\/\n        .catweb-price{font-size:14px; margin-bottom:6px;}\n        .catweb-stock{font-size:12px; opacity:.85;}\n        .catweb-stock strong{font-weight:700;}\n        .catweb-card a{color:inherit; text-decoration:none;}\n\n        .catweb-footer{display:flex; gap:12px; align-items:center; justify-content:center; margin-top:14px;}\n        .catweb-empty{padding:20px; text-align:center; color:#666;}\n        .catweb-skeleton{border:1px solid #eee; border-radius:12px; padding:10px; height:100px; background:linear-gradient(90deg,#f6f6f6 25%, #efefef 37%, #f6f6f6 63%); background-size:400% 100%; animation:catweb-shine 1.2s ease-in-out infinite;}\n        @keyframes catweb-shine{0%{background-position:100% 0}100%{background-position:0 0}}\n        .catweb-sentinel{width:100%; height:1px;}\n\n        \/* Impresi\u00f3n (vista normal) *\/\n        @page{ size: Letter portrait; margin: 8mm; }\n        @media print{\n          #wpadminbar, header, footer, nav, aside,\n          .site-header, .site-footer, .widget-area,\n          .elementor-location-header, .elementor-location-footer,\n          .woocommerce-breadcrumb { display:none !important; }\n          .catweb-toolbar, .catweb-footer, .catweb-subcats { display:none !important; }\n          .catweb-wrap{ margin:0; padding:0; }\n          .catweb-results{ gap:6px; }\n          .catweb-card{ break-inside:avoid; page-break-inside:avoid; padding:6px; }\n        }\n        <\/style>\n\n        <script>\n        (() => {\n          const $app = document.querySelector('#catweb-app');\n          if (!$app) return;\n          const perPage = parseInt($app.dataset.perPage || '60', 10);\n          let state = { categoria: $app.dataset.categoria || '', page: 1, pages: 1, search: '', subcat: '', orderby: 'subcat', order: 'ASC', mode: 'catalogo', loading: false };\n\n          const $results=$app.querySelector('.catweb-results'),\n                $pages=$app.querySelector('.catweb-pages'),\n                $loadMore=$app.querySelector('.catweb-loadmore'),\n                $modes=[...$app.querySelectorAll('.catweb-mode')],\n                $search=$app.querySelector('.catweb-search'),\n                $searchBtn=$app.querySelector('.catweb-searchbtn'),\n                $orderby=$app.querySelector('.catweb-orderby'),\n                $subcat=$app.querySelector('.catweb-subcatfilter'),\n                $sentinel=$app.querySelector('.catweb-sentinel'),\n                $btnPrintNow=$app.querySelector('.btn-print-now'),\n                $btnPrintClean=$app.querySelector('.btn-print-clean');\n\n          const qs = (o)=>new URLSearchParams(o).toString();\n          const skeleton=(n=6)=>{const f=document.createDocumentFragment(); for(let i=0;i<n;i++){const d=document.createElement('div'); d.className='catweb-skeleton'; f.appendChild(d);} return f;};\n          const cardHTML=(it)=>`\n            <article class=\"catweb-card\">\n              <a href=\"${it.permalink}\" target=\"_blank\" rel=\"noopener\"><div class=\"catweb-thumb\">${it.image_url?`<img decoding=\"async\" src=\"${it.image_url}\" alt=\"\">`:''}<\/div><\/a>\n              <div class=\"catweb-info\">\n                <h3 class=\"catweb-name\"><a href=\"${it.permalink}\" target=\"_blank\" rel=\"noopener\">${it.name}<\/a><\/h3>\n                <div class=\"catweb-meta\">Cat: ${it.subcat || '-'} | SKU: ${it.sku || '-'}<\/div>\n                <div class=\"catweb-price\">${it.price_html||''}<\/div>\n                <div class=\"catweb-stock\"><strong>stock:<\/strong> San Mateo: ${it.stock?.san_mateo ?? '-'} | Xaltocan: ${it.stock?.xaltocan ?? '-'} | Bodega: ${it.stock?.bodega ?? '-'}<\/div>\n              <\/div>\n            <\/article>`;\n\n          async function fetchPage(append=false){\n            if (state.loading) return; state.loading=true;\n            if (!append){ $results.innerHTML=''; $results.appendChild(skeleton(8)); }\n            const q={ catweb_json:'1', categoria: state.categoria||'all', page: state.page, per_page: perPage, subcat: state.subcat||'', orderby: state.orderby, order: state.order };\n            if (state.mode === 'manage_stock') {\n              q.ms_search = state.search||'';\n              \/\/ En este modo ignoramos el filtro por subcategor\u00eda (solo si est\u00e1 deshabilitado)\n              if ($subcat && $subcat.disabled) q.subcat = '';\n            } else {\n              q.search = state.search||'';\n            }\n            try{\n              const r = await fetch(`?${qs(q)}`, {credentials:'same-origin', cache:'no-store'});\n              const j = await r.json();\n              state.pages = j.pages||1;\n              const html = (j.items||[]).map(cardHTML).join('');\n              if (append) $results.insertAdjacentHTML('beforeend', html);\n              else $results.innerHTML = html || `<div class=\"catweb-empty\">No hay productos para mostrar.<\/div>`;\n              $pages && ($pages.textContent = `P\u00e1gina ${state.page} de ${state.pages}`);\n              $loadMore && ($loadMore.style.display = state.page < state.pages ? 'inline-block' : 'none');\n            } catch(e){\n              console.error(e);\n              if (!append) $results.innerHTML = `<div class=\"catweb-empty\">Ocurri\u00f3 un problema al cargar el cat\u00e1logo.<\/div>`;\n            } finally { state.loading=false; }\n          }\n\n          \/\/ B\u00fasqueda debounce\n          let tSearch;\n          if ($search) $search.addEventListener('input', ()=>{\n            clearTimeout(tSearch);\n            state.search = $search.value.trim();\n            \/\/ En modo Cat\u00e1logo, buscar \"en vivo\". En modo Manage_stock, se busca con el bot\u00f3n\/Enter.\n            if (state.mode === 'catalogo') {\n              tSearch=setTimeout(()=>{ state.page=1; fetchPage(false); },300);\n            }\n          });\n\n          $search.addEventListener('keydown', (e)=>{\n            if (e.key === 'Enter') {\n              e.preventDefault();\n              state.search = $search.value.trim();\n              state.page = 1;\n              fetchPage(false);\n            }\n          });\n\n          if ($searchBtn) $searchBtn.addEventListener('click', ()=>{\n            state.search = $search.value.trim();\n            state.page = 1;\n            fetchPage(false);\n          });\n\n          \/\/ Tabs de modo\n          if ($modes && $modes.length) {\n            $modes.forEach(btn=>btn.addEventListener('click', ()=>{\n              const mode = btn.dataset.mode || 'catalogo';\n              state.mode = mode;\n              $modes.forEach(b=>{ b.classList.toggle('is-active', b===btn); b.setAttribute('aria-selected', b===btn ? 'true':'false'); });\n\n              \/\/ UI: placeholder + controles\n              if (mode === 'manage_stock') {\n                $search.setAttribute('placeholder','Buscar en manage_stock\u2026');\n                if ($subcat) $subcat.disabled = true;\n                \/\/ Orden sugerido\n                state.orderby = 'manage_stock';\n                state.order = 'ASC';\n                if ($orderby) $orderby.value = 'manage_stock|ASC';\n              } else {\n                $search.setAttribute('placeholder','Buscar por nombre o subcategor\u00eda\u2026');\n                if ($subcat) $subcat.disabled = false;\n                if (!['subcat','name','sku','manage_stock'].includes(state.orderby)) { state.orderby='subcat'; state.order='ASC'; }\n              }\n\n              state.page = 1;\n              fetchPage(false);\n            }));\n          }\n\n          \/\/ Orden\n          if ($orderby) $orderby.addEventListener('change', ()=>{\n            const [ob,od]=($orderby.value||'subcat|ASC').split('|'); state.orderby=ob; state.order=od; state.page=1; fetchPage(false);\n          });\n\n          \/\/ Subcategor\u00eda (filtro)\n          if ($subcat) $subcat.addEventListener('change', ()=>{\n            state.subcat = ($subcat.value || '').trim();\n            state.page = 1;\n            fetchPage(false);\n          });\n\n          \/\/ Fallback bot\u00f3n\n          if ($loadMore) $loadMore.addEventListener('click', ()=>{ if (state.page < state.pages){ state.page+=1; fetchPage(true);} });\n\n          \/\/ Infinite Scroll\n          const io = 'IntersectionObserver' in window ? new IntersectionObserver((entries)=>{\n            entries.forEach(entry=>{\n              if (entry.isIntersecting && !state.loading && state.page < state.pages){\n                state.page += 1; fetchPage(true);\n              }\n            });\n          }, {root:null, rootMargin:'1200px 0px', threshold:0}) : null;\n          if (io && $sentinel) io.observe($sentinel);\n\n          \/\/ Imprimir (vista normal)\n          if ($btnPrintNow) $btnPrintNow.addEventListener('click', ()=>window.print());\n\n          \/\/ Vista limpia (con filtros actuales)\n          if ($btnPrintClean) $btnPrintClean.addEventListener('click', ()=>{\n            const u = new URL(window.location.href);\n            u.search = '';\n            u.searchParams.set('catweb_print','1');\n            u.searchParams.set('categoria', state.categoria || 'all');\n            if (state.search)  u.searchParams.set('search', state.search);\n            if (state.subcat)  u.searchParams.set('subcat', state.subcat);\n            u.searchParams.set('orderby', state.orderby);\n            u.searchParams.set('order',   state.order);\n            window.open(u.toString(), '_blank');\n          });\n\n          \/\/ Primera carga\n          fetchPage(false);\n        })();\n        <\/script>\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8099","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/pages\/8099","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/comments?post=8099"}],"version-history":[{"count":6,"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/pages\/8099\/revisions"}],"predecessor-version":[{"id":20445,"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/pages\/8099\/revisions\/20445"}],"wp:attachment":[{"href":"https:\/\/buzkme.com\/bazar\/wp-json\/wp\/v2\/media?parent=8099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}