feat: sitio CV completo v1.0.0

- 4 temas WordPress: persona-cv (activo), lumina, apex-cv, cvolio
- Plugin pflores-cv-fields con CMB2 (100% gratuito) — admin editable
- Generador PDF dinámico con Chromium headless (?cv_pdf=1)
- Datos del CV de Patricia Flores cargados en CMB2
- URL dinámica con soporte proxy SSL (NPM/X-Forwarded-Proto)
- WP Mail SMTP instalado (pendiente config SMTP)
- Documentación completa: PROMPT_IA.md, DEPLOY_WEB.md, PRODUCCION.md, VERSIONADO.md
This commit is contained in:
2026-06-05 11:21:30 -05:00
parent cc6545604c
commit 5846c515f3
77 changed files with 9567 additions and 220 deletions
+254 -42
View File
@@ -4,64 +4,235 @@ declare(strict_types=1);
get_header();
$hero_name = get_theme_mod('cvolio_hero_name', get_bloginfo('name'));
$hero_role = get_theme_mod('cvolio_hero_role', __('Profesional creativo y estratega digital', 'cvolio'));
$hero_intro = get_theme_mod('cvolio_hero_intro', __('Presenta tu experiencia, logros, proyectos y propuesta de valor con un formato claro, elegante y listo para cualquier dispositivo.', 'cvolio'));
$hero_location = get_theme_mod('cvolio_contact_location', 'Guayaquil, Ecuador');
$hero_email = get_theme_mod('cvolio_contact_email', 'hola@ejemplo.com');
$hero_phone = get_theme_mod('cvolio_contact_phone', '+593 999 999 999');
$hero_cta_label = get_theme_mod('cvolio_hero_cta_label', __('Ver experiencia', 'cvolio'));
$hero_cta_url = get_theme_mod('cvolio_hero_cta_url', '#perfil');
$skills = array_filter(array_map('trim', explode(',', (string) get_theme_mod('cvolio_skills_list', 'UX Strategy, Liderazgo, Frontend, WordPress, SEO, Analitica'))));
$linkedin = get_theme_mod('cvolio_social_linkedin', '');
$github = get_theme_mod('cvolio_social_github', '');
$portfolio = get_theme_mod('cvolio_social_portfolio', '');
$cv = function_exists('pflores_get_cv_data') ? pflores_get_cv_data() : cvolio_cv_data();
$hero = $cv['hero'];
$metrics = $cv['metrics'];
$highlights = $cv['highlights'];
$summary = $cv['summary'];
$impact = $cv['impact'];
$experience = $cv['experience'];
$education = $cv['education'];
$certifications = $cv['certifications'];
$competencies = $cv['competencies'];
$volunteer = $cv['volunteer'];
$additional = $cv['additional'];
$qrImage = get_template_directory_uri() . '/assets/images/patricia-flores-qr.png';
$publicUrl = 'https://pflores.linkedcorp.net';
$heroName = $hero['name'];
$heroRole = $hero['role'];
$heroIntro = $hero['intro'];
$heroLocation = $hero['location'];
$heroEmail = $hero['email'];
$heroPhone = $hero['phone'];
$heroCtaLabel = 'Ver trayectoria';
$heroCtaUrl = '#experiencia';
$linkedin = $hero['linkedin'];
// Compatibilidad CVolio: skills como array plano para pills
$skillsFlat = [];
foreach ($competencies as $groupItems) {
foreach ((array) $groupItems as $item) {
$skillsFlat[] = is_array($item) ? ($item['name'] ?? '') : (string) $item;
}
}
$skills = array_filter($skillsFlat);
$acfPhoto = $cv['photo'] ?? '';
$profileImage = $acfPhoto ?: get_template_directory_uri() . '/assets/images/patricia-flores-profile.jpeg';
$cvFile = get_template_directory_uri() . '/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx';
?>
<section class="hero">
<section class="hero hero--executive">
<div class="hero__copy">
<p class="eyebrow"><?php esc_html_e('Hoja de vida digital', 'cvolio'); ?></p>
<h1><?php echo esc_html($hero_name); ?></h1>
<p class="hero__role"><?php echo esc_html($hero_role); ?></p>
<p class="hero__intro"><?php echo esc_html($hero_intro); ?></p>
<p class="eyebrow"><?php echo esc_html($hero['eyebrow']); ?></p>
<h1><?php echo esc_html($heroName); ?></h1>
<p class="hero__role"><?php echo esc_html($heroRole); ?></p>
<p class="hero__intro"><?php echo esc_html($heroIntro); ?></p>
<div class="hero__metrics hero__metrics--wide">
<?php foreach ($metrics as $metric) : ?>
<article class="metric-card">
<strong><?php echo esc_html($metric['value']); ?></strong>
<span><?php echo esc_html($metric['label']); ?></span>
</article>
<?php endforeach; ?>
</div>
<div class="hero__actions">
<a class="btn btn--primary" href="<?php echo esc_url($hero_cta_url); ?>">
<?php echo esc_html($hero_cta_label); ?>
<a class="btn btn--primary" href="<?php echo esc_url($heroCtaUrl); ?>">
<?php echo esc_html($heroCtaLabel); ?>
</a>
<?php echo wp_kses_post(cvolio_render_contact_link('email', $hero_email)); ?>
<a class="btn btn--secondary" href="<?php echo esc_url(home_url('/?cv_pdf=1')); ?>">
<?php esc_html_e('Descargar CV PDF', 'cvolio'); ?>
</a>
<button class="btn btn--ghost" type="button" data-cvolio-print>
<?php esc_html_e('Versión imprimible', 'cvolio'); ?>
</button>
</div>
</div>
<aside class="hero__panel">
<div class="profile-card">
<p class="profile-card__label"><?php esc_html_e('Disponible para', 'cvolio'); ?></p>
<h2><?php esc_html_e('Proyectos, consultoria y liderazgo de equipos', 'cvolio'); ?></h2>
<div class="chip-grid">
<?php echo wp_kses_post(cvolio_render_contact_link('phone', $hero_phone)); ?>
<span class="cv-chip"><?php echo esc_html($hero_location); ?></span>
<?php if ($linkedin) : ?><a class="cv-chip" href="<?php echo esc_url($linkedin); ?>" target="_blank" rel="noreferrer">LinkedIn</a><?php endif; ?>
<?php if ($github) : ?><a class="cv-chip" href="<?php echo esc_url($github); ?>" target="_blank" rel="noreferrer">GitHub</a><?php endif; ?>
<?php if ($portfolio) : ?><a class="cv-chip" href="<?php echo esc_url($portfolio); ?>" target="_blank" rel="noreferrer">Portfolio</a><?php endif; ?>
<div class="profile-card profile-card--executive">
<div class="profile-card__media profile-card__media--portrait">
<img src="<?php echo esc_url($profileImage); ?>" alt="<?php echo esc_attr($heroName); ?>">
</div>
<div class="profile-card__contact">
<?php echo wp_kses_post(cvolio_render_contact_link('email', $heroEmail)); ?>
<?php echo wp_kses_post(cvolio_render_contact_link('phone', $heroPhone)); ?>
<span class="cv-chip"><?php echo esc_html($heroLocation); ?></span>
<?php if ($linkedin) : ?>
<a class="cv-chip" href="<?php echo esc_url($linkedin); ?>" target="_blank" rel="noreferrer">LinkedIn</a>
<?php endif; ?>
</div>
<div class="profile-card__highlights">
<div>
<span><?php esc_html_e('Enfoque', 'cvolio'); ?></span>
<strong><?php echo esc_html($hero['focus']); ?></strong>
</div>
<div>
<span><?php esc_html_e('Disponibilidad', 'cvolio'); ?></span>
<strong><?php echo esc_html($hero['availability']); ?></strong>
</div>
</div>
</div>
</aside>
</section>
<section id="perfil" class="content-wrap content-wrap--front">
<div class="content-card">
<section class="content-wrap content-wrap--front">
<div class="content-card content-card--resume">
<section id="resumen" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Perfil profesional', 'cvolio'); ?></p>
<h2><?php echo esc_html($summary['title']); ?></h2>
</div>
<p class="lead-copy"><?php echo esc_html($summary['body']); ?></p>
</section>
<section id="impacto" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Impacto ejecutivo', 'cvolio'); ?></p>
<h2><?php esc_html_e('Resultados concretos con alcance nacional', 'cvolio'); ?></h2>
</div>
<div class="achievement-grid achievement-grid--executive">
<?php foreach ($highlights as $highlight) : ?>
<article class="achievement-card achievement-card--stat">
<strong><?php echo esc_html($highlight['value']); ?></strong>
<span><?php echo esc_html($highlight['label']); ?></span>
</article>
<?php endforeach; ?>
</div>
<div class="impact-grid">
<?php foreach ($impact as $item) : ?>
<article class="impact-card">
<h3><?php echo esc_html($item['title']); ?></h3>
<p><?php echo esc_html($item['body']); ?></p>
</article>
<?php endforeach; ?>
</div>
</section>
<section id="experiencia" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Experiencia profesional', 'cvolio'); ?></p>
<h2><?php esc_html_e('Trayectoria sólida en banca, operaciones y microfinanzas', 'cvolio'); ?></h2>
</div>
<div class="timeline timeline--executive">
<?php foreach ($experience as $item) : ?>
<article class="timeline__item timeline__item--rich">
<span class="timeline__year"><?php echo esc_html($item['period']); ?></span>
<div class="timeline__content">
<h3><?php echo esc_html($item['title']); ?></h3>
<p class="timeline__meta"><?php echo esc_html($item['company'] . ' | ' . $item['location']); ?></p>
<p><?php echo esc_html($item['lead']); ?></p>
<ul class="timeline__bullets">
<?php foreach ($item['bullets'] as $bullet) : ?>
<li><?php echo esc_html($bullet); ?></li>
<?php endforeach; ?>
</ul>
</div>
</article>
<?php endforeach; ?>
</div>
</section>
<section id="formacion" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Formación académica', 'cvolio'); ?></p>
<h2><?php esc_html_e('Base técnica y formación ejecutiva de alto nivel', 'cvolio'); ?></h2>
</div>
<div class="credentials-grid">
<?php foreach ($education as $item) : ?>
<article class="credential-card">
<span class="credential-card__year"><?php echo esc_html($item['year']); ?></span>
<h3><?php echo esc_html($item['title']); ?></h3>
<p><?php echo esc_html($item['institution']); ?></p>
<?php if ($item['detail'] !== '') : ?>
<p class="credential-card__detail"><?php echo esc_html($item['detail']); ?></p>
<?php endif; ?>
</article>
<?php endforeach; ?>
</div>
</section>
<section id="certificaciones" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Certificaciones relevantes', 'cvolio'); ?></p>
<h2><?php esc_html_e('Actualización continua en gerencia, procesos y analítica', 'cvolio'); ?></h2>
</div>
<div class="cert-list">
<?php foreach ($certifications as $item) : ?>
<article class="cert-item">
<span class="cert-item__year"><?php echo esc_html($item['year']); ?></span>
<div>
<h3><?php echo esc_html($item['title']); ?></h3>
<p><?php echo esc_html($item['issuer']); ?></p>
</div>
</article>
<?php endforeach; ?>
</div>
</section>
<?php while (have_posts()) : the_post(); ?>
<article <?php post_class('front-article'); ?>>
<div class="entry-content">
<?php the_content(); ?>
</div>
</article>
<?php if (trim((string) get_the_content()) !== '') : ?>
<section class="resume-section resume-section--custom">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Contenido adicional', 'cvolio'); ?></p>
<h2><?php esc_html_e('Bloques editables desde WordPress', 'cvolio'); ?></h2>
</div>
<div class="entry-content">
<?php the_content(); ?>
</div>
</section>
<?php endif; ?>
<?php endwhile; ?>
</div>
<aside class="side-stack">
<aside class="side-stack side-stack--resume">
<section class="side-card side-card--competencies">
<p class="eyebrow"><?php esc_html_e('Competencias clave', 'cvolio'); ?></p>
<h2><?php esc_html_e('Capacidades ejecutivas y técnicas', 'cvolio'); ?></h2>
<?php foreach ($competencies as $group => $items) : ?>
<div class="competency-block">
<h3><?php echo esc_html($group); ?></h3>
<div class="skill-cloud">
<?php foreach ($items as $item) : ?>
<span class="skill-pill"><?php echo esc_html(is_array($item) ? ($item['name'] ?? '') : $item); ?></span>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</section>
<section class="side-card">
<p class="eyebrow"><?php esc_html_e('Fortalezas', 'cvolio'); ?></p>
<h2><?php esc_html_e('Habilidades clave', 'cvolio'); ?></h2>
<p class="eyebrow"><?php esc_html_e('Liderazgo', 'cvolio'); ?></p>
<h2><?php esc_html_e('Atributos diferenciales', 'cvolio'); ?></h2>
<div class="skill-cloud">
<?php foreach ($skills as $skill) : ?>
<span class="skill-pill"><?php echo esc_html($skill); ?></span>
@@ -70,9 +241,50 @@ $portfolio = get_theme_mod('cvolio_social_portfolio', '');
</section>
<section class="side-card">
<p class="eyebrow"><?php esc_html_e('Consejo de uso', 'cvolio'); ?></p>
<h2><?php esc_html_e('Edita esta portada con bloques', 'cvolio'); ?></h2>
<p><?php esc_html_e('Puedes crear secciones de experiencia, estudios, casos de exito, certificados o servicios usando Gutenberg y los patrones del tema.', 'cvolio'); ?></p>
<p class="eyebrow"><?php esc_html_e('Voluntariado', 'cvolio'); ?></p>
<h2><?php echo esc_html($volunteer['title']); ?></h2>
<p class="side-card__meta"><?php echo esc_html($volunteer['year']); ?></p>
<p><?php echo esc_html($volunteer['body']); ?></p>
</section>
<section id="contacto" class="side-card side-card--contact">
<p class="eyebrow"><?php esc_html_e('Información adicional', 'cvolio'); ?></p>
<h2><?php esc_html_e('Datos clave del perfil', 'cvolio'); ?></h2>
<dl class="info-list">
<?php foreach ($additional as $label => $value) : ?>
<div>
<dt><?php echo esc_html($label); ?></dt>
<dd><?php echo esc_html($value); ?></dd>
</div>
<?php endforeach; ?>
</dl>
<div class="contact-stack">
<?php echo wp_kses_post(cvolio_render_contact_link('email', $heroEmail)); ?>
<?php echo wp_kses_post(cvolio_render_contact_link('phone', $heroPhone)); ?>
</div>
</section>
<section class="side-card side-card--business-card">
<p class="eyebrow"><?php esc_html_e('Tarjeta de presentación', 'cvolio'); ?></p>
<h2><?php esc_html_e('Acceso rápido al perfil web', 'cvolio'); ?></h2>
<article class="business-card">
<div class="business-card__top">
<p class="business-card__name"><?php echo esc_html($heroName); ?></p>
<p class="business-card__role"><?php echo esc_html($heroRole); ?></p>
</div>
<div class="business-card__body">
<div class="business-card__qr">
<img src="<?php echo esc_url($qrImage); ?>" alt="<?php esc_attr_e('Código QR hacia el perfil web', 'cvolio'); ?>">
</div>
<div class="business-card__info">
<p><?php echo esc_html($heroLocation); ?></p>
<p><?php echo esc_html($heroPhone); ?></p>
<p><?php echo esc_html($heroEmail); ?></p>
<a href="<?php echo esc_url($publicUrl); ?>" target="_blank" rel="noreferrer"><?php echo esc_html($publicUrl); ?></a>
</div>
</div>
</article>
</section>
</aside>
</section>