=cheio) return {econ:null,pct:null}; const econ = cheio – promo; const pct = econ/cheio; return {econ, pct}; } function priceRow(data){ const {preco_cheio,preco_promo} = data||{}; const {econ,pct} = calc(preco_cheio,preco_promo); const oldEl = preco_cheio? `
${BRL.format(preco_cheio)}
`:”; const newEl = preco_promo? `
${BRL.format(preco_promo)}
`:”; const ecEl = econ? `
Economia ${BRL.format(econ)} (${(pct*100).toFixed(0)}%)
`:”; return `
${oldEl}${newEl}${ecEl}
`; } async function loadJSON(url){ const res = await fetch(url, {cache:’no-store’}); if(!res.ok) throw new Error(‘Falha ao carregar JSON’); return await res.json(); } function renderCard(item, light){ const cls = light? ‘cnt9-card light’ : ‘cnt9-card’; const cat = item.categoria? `${item.categoria}`:”; const mod = item.modalidade? `${item.modalidade}`:”; const ch = item.carga_horaria? `${item.carga_horaria}`:”; // def base price (course-level) let basePrice = {preco_cheio:item?.preco?.cheio, preco_promo:item?.preco?.promo}; let priceHTML = priceRow(basePrice); // CTA const wa = item.whatsapp || ‘#’; // turmas selector (optional override) let turmasHTML = ”; if (Array.isArray(item.turmas) && item.turmas.length){ turmasHTML = `
`; } const html = `

${item.curso||’Curso’}

${cat}${mod}${ch}
${priceHTML}
${turmasHTML} Falar com a Donna
`; const wrap = document.createElement(‘div’); wrap.innerHTML = html; // bind turma change to override price const select = wrap.querySelector(‘select’); if(select){ const priceWrap = wrap.querySelector(‘.cnt9-price-wrap’); select.addEventListener(‘change’, (e)=>{ try{ const v = JSON.parse(e.target.value); const local = {preco_cheio: v.cheio || item?.preco?.cheio, preco_promo: v.promo || item?.preco?.promo}; priceWrap.innerHTML = priceRow(local); }catch(err){ /* noop */ } }); // trigger once for first turma if it has explicit price try{ const v0 = JSON.parse(select.value); if(v0.cheio || v0.promo){ const priceWrap = wrap.querySelector(‘.cnt9-price-wrap’); priceWrap.innerHTML = priceRow({preco_cheio: v0.cheio || item?.preco?.cheio, preco_promo: v0.promo || item?.preco?.promo}); } }catch(err){} } return wrap.firstElementChild; } async function boot(){ const mounts = document.querySelectorAll(‘[data-cnt9-mount]’); for(const el of mounts){ const jsonUrl = el.getAttribute(‘data-json’); const theme = el.getAttribute(‘data-theme’)||’dark’; const light = theme === ‘light’; try{ const data = await loadJSON(jsonUrl); const grid = document.createElement(‘div’); grid.className = ‘cnt9-grid’; data.forEach(item=> grid.appendChild(renderCard(item, light))); el.replaceChildren(grid); }catch(err){ el.innerHTML = ‘

Não foi possível carregar os cursos.

‘; } } } if(document.readyState===’loading’) document.addEventListener(‘DOMContentLoaded’, boot); else boot(); })(); JS; wp_register_script(‘cnt9_catalogo_js’, false); wp_add_inline_script(‘cnt9_catalogo_js’, $js); } public function register_settings(){ register_setting(‘reading’, self::OPT_KEY, [ ‘type’=>’string’,’sanitize_callback’=>’esc_url_raw’,’default’=>home_url(‘/wp-content/uploads/conectinove_precos_config.json’) ]); add_settings_field( self::OPT_KEY, ‘URL do JSON do Catálogo Conectinove’, function(){ $val = esc_attr(get_option(self::OPT_KEY, home_url(‘/wp-content/uploads/conectinove_precos_config.json’))); echo ‘‘; echo ‘

Envie o arquivo conectinove_precos_config.json para wp-content/uploads e informe a URL completa aqui.

‘; }, ‘reading’,’default’ ); } public function menu(){ add_submenu_page( ‘options-general.php’, ‘Catálogo Conectinove’, ‘Catálogo Conectinove’, ‘manage_options’, ‘cnt9-catalogo-help’, [$this,’help_page’] ); } public function help_page(){ $url = esc_html(get_option(self::OPT_KEY)); echo ‘

Catálogo Conectinove

‘; echo ‘

Use o shortcode

Carregando cursos…
na página desejada.

‘; echo ‘

JSON atual: '.$url.'

‘; echo ‘

Schema JSON

‘; echo ‘
'.esc_html($this->example_json()).'
‘; echo ‘
‘; } private function example_json(){ $ex = [ [ “curso”=>”Administração para o Mercado de Trabalho”, “categoria”=>”Adm e Gestão”, “modalidade”=>”Presencial/Online”, “carga_horaria”=>”40h”, “preco”=>[“cheio”=>1200, “promo”=>990, “cupom”=>”CNT9”, “validade”=>”2025-10-31”], “turmas”=>[ [“nome”=>”SQ8H”, “data”=>”Seg/Qua 08h”, “preco_cheio”=>1200, “preco_promo”=>890], [“nome”=>”TQ14H”, “data”=>”Ter/Qui 14h”, “preco_cheio”=>1200, “preco_promo”=>950] ], “whatsapp”=>”https://wa.me/5569992680811” ] ]; return wp_json_encode($ex, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE); } public function shortcode($atts=[]){ $atts = shortcode_atts([ ‘theme’ => ‘dark’, // dark|light ‘json’ => get_option(self::OPT_KEY, home_url(‘/wp-content/uploads/conectinove_precos_config.json’)) ], $atts, ‘cnt9_cursos’); wp_enqueue_style(‘cnt9_catalogo_css’); wp_enqueue_script(‘cnt9_catalogo_js’); $theme = esc_attr($atts[‘theme’]); $json = esc_url($atts[‘json’]); ob_start(); echo ‘
Carregando cursos…
‘; return ob_get_clean(); } } new CNT9_Catalogo_Cursos();