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
+67
View File
@@ -0,0 +1,67 @@
<?php
declare(strict_types=1);
require_once get_template_directory() . '/inc/customizer.php';
require_once get_template_directory() . '/inc/cv-data.php';
require_once get_template_directory() . '/inc/visits.php';
function persona_setup(): void {
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
add_theme_support('editor-styles');
add_theme_support('responsive-embeds');
register_nav_menus(['primary' => __('Menú principal', 'persona')]);
}
add_action('after_setup_theme', 'persona_setup');
function persona_enqueue_assets(): void {
wp_enqueue_style('persona-fonts',
'https://fonts.googleapis.com/css2?family=Raleway:wght@300;400;500;600;700;800&family=Open+Sans:wght@300;400;600&display=swap',
[], null);
wp_enqueue_style('persona-theme',
get_template_directory_uri() . '/assets/css/theme.css',
['persona-fonts'], wp_get_theme()->get('Version'));
wp_enqueue_script('persona-theme',
get_template_directory_uri() . '/assets/js/theme.js',
[], wp_get_theme()->get('Version'), true);
}
add_action('wp_enqueue_scripts', 'persona_enqueue_assets');
function persona_body_classes(array $classes): array {
$classes[] = 'persona-shell';
if (is_front_page()) $classes[] = 'persona-front';
return $classes;
}
add_filter('body_class', 'persona_body_classes');
function persona_redirect_sample(): void {
if (!is_page()) return;
$p = get_queried_object();
if ($p instanceof WP_Post && $p->post_name === 'pagina-ejemplo') {
wp_safe_redirect(home_url('/'), 301); exit;
}
}
add_action('template_redirect', 'persona_redirect_sample', 1);
function persona_render_nav(): string {
if (has_nav_menu('primary')) {
return trim((string) wp_nav_menu([
'theme_location' => 'primary', 'container' => false,
'fallback_cb' => false, 'menu_class' => 'pn-nav__list', 'echo' => false,
]));
}
$items = [
'#sobre-mi' => 'Sobre mí',
'#impacto' => 'Impacto',
'#experiencia' => 'Experiencia',
'#formacion' => 'Formación',
'#competencias' => 'Competencias',
'#certificaciones' => 'Certificaciones',
'#contacto' => 'Contacto',
];
$html = '<ul class="pn-nav__list">';
foreach ($items as $href => $label) {
$html .= sprintf('<li><a href="%s">%s</a></li>', esc_url($href), esc_html($label));
}
return $html . '</ul>';
}