=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();