Files
cnt-sindikatua/src/StarterSite.php
2025-08-13 08:59:42 +00:00

600 lines
16 KiB
PHP

<?php
/**
* StarterSite class
* This class is used to add custom functionality to the theme.
*/
namespace App;
use Timber\Site;
use Timber\Timber;
use Twig\Environment;
use Twig\TwigFilter;
/**
* Class StarterSite.
*/
class StarterSite extends Site {
public function __construct() {
add_action( 'after_setup_theme', [ $this, 'theme_supports' ] );
add_action( 'init', [ $this, 'register_post_types' ] );
add_action( 'init', [ $this, 'register_taxonomies' ] );
add_action('wp_enqueue_scripts', [$this,'load_assets']);
add_filter( 'timber/context', [ $this, 'add_to_context' ] );
add_filter( 'timber/twig/filters', [ $this, 'add_filters_to_twig' ] );
add_filter( 'timber/twig/functions', [ $this, 'add_functions_to_twig' ] );
add_filter( 'timber/twig/environment/options', [ $this, 'update_twig_environment_options' ] );
add_filter('upload_mimes', [$this, 'add_svg_support']); //add svg files
add_filter('timber/context', [$this, 'add_global_context']); // variables globales
add_filter('timber/twig', [$this, 'add_videos_embed_to_twig']); //videos embed
add_action('pre_get_posts', array($this, 'exclude_pages_from_search')); //exclude pages with ACF
parent::__construct();
}
function load_assets() {
$version = 4;
// $version_for_app = $version;
$version_for_app = time();
wp_enqueue_style( 'yaro', get_template_directory_uri() . '/assets/fonts/yaro-font-family/stylesheet.css', [], $version, 'all');
wp_enqueue_style( 'twbs', get_template_directory_uri() . '/vendor/twbs/bootstrap/dist/css/bootstrap.min.css', [], $version, 'all');
wp_enqueue_style( 'twbsi', get_template_directory_uri() . '/vendor/twbs/bootstrap-icons/font/bootstrap-icons.min.css', [], $version, 'all');
wp_enqueue_style( 'lust', get_template_directory_uri() . '/style.css', [], $version, 'all');
// wp_enqueue_script( 'pop', get_template_directory_uri() . '/static/popper.min.js', [], $version, false);
wp_enqueue_script( 'twbs', get_template_directory_uri() . '/vendor/twbs/bootstrap/dist/js/bootstrap.min.js', [], $version, false);
wp_enqueue_script( 'lust', get_template_directory_uri() . '/assets/scripts/site.js', [], $version, false);
}
public function register_post_types() {}
public function register_taxonomies() {}
public function add_to_context( $context ) {
$context['foo'] = 'bar';
$context['stuff'] = 'I am a value set in your functions.php file';
$context['notes'] = 'These values are available everytime you call Timber::context();';
$context['menu'] = Timber::get_menu( 'primary_navigation' );
$context['site'] = $this;
return $context;
}
/**
* This is where you can add your theme supports.
*/
public function theme_supports() {
// Register navigation menus
register_nav_menus(
[
'primary_navigation' => _x( 'Main menu', 'Backend - menu name', 'timber-starter' ),
]
);
// Add default posts and comments RSS feed links to head.
add_theme_support( 'automatic-feed-links' );
/*
* Let WordPress manage the document title.
* By adding theme support, we declare that this theme does not use a
* hard-coded <title> tag in the document head, and expect WordPress to
* provide it for us.
*/
add_theme_support( 'title-tag' );
/*
* Enable support for Post Thumbnails on posts and pages.
*
* @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/
*/
add_theme_support( 'post-thumbnails' );
/*
* Switch default core markup for search form, comment form, and comments
* to output valid HTML5.
*/
add_theme_support(
'html5',
[
'comment-form',
'comment-list',
'gallery',
'caption',
]
);
/*
* Enable support for Post Formats.
*
* See: https://codex.wordpress.org/Post_Formats
*/
add_theme_support(
'post-formats',
[
'aside',
'image',
'video',
'quote',
'link',
'gallery',
'audio',
]
);
add_theme_support( 'menus' );
}
/**
* This would return 'foo bar!'.
*
* @param string $text being 'foo', then returned 'foo bar!'
*/
public function myfoo( $text ) {
$text .= ' bar!';
return $text;
}
/**
* This is where you can add your own functions to twig.
*
* @link https://timber.github.io/docs/v2/hooks/filters/#timber/twig/filters
* @param array $filters an array of Twig filters.
*/
public function add_filters_to_twig( $filters ) {
$additional_filters = [
'myfoo' => [
'callable' => [ $this, 'myfoo' ],
],
];
return array_merge( $filters, $additional_filters );
}
/**
* This is where you can add your own functions to twig.
*
* @link https://timber.github.io/docs/v2/hooks/filters/#timber/twig/functions
* @param array $functions an array of existing Twig functions.
*/
public function add_functions_to_twig( $functions ) {
$additional_functions = [
'get_theme_mod' => [
'callable' => 'get_theme_mod',
],
];
return array_merge( $functions, $additional_functions );
}
/**
* Updates Twig environment options.
*
* @see https://twig.symfony.com/doc/2.x/api.html#environment-options
*
* @param array $options an array of environment options
*
* @return array
*/
public function update_twig_environment_options( $options ) {
// $options['autoescape'] = true;
return $options;
}
/**
* New functions to add Sindikatua theme
* @author Gustavo
*/
//add svg files
public function add_svg_support($file_types) {
$new_filetypes = array();
$new_filetypes['svg'] = 'image/svg+xml';
$file_types = array_merge($file_types, $new_filetypes);
return $file_types;
}
//section "portada"
private function getBotonesImagen() {
$botones = [];
for ($i = 1; $i <= 4; $i++) {
$imagen = get_field('imagen_boton_' . $i);
$enlace = get_field('enlace_boton_' . $i);
$botones[] = [
'imagen' => $imagen,
'enlace' => $enlace,
];
}
return $botones;
}
//Get last 3 articles with category "noticias"
private function recentPostsNews() {
return Timber::get_posts([
'post_type' => 'post',
'posts_per_page' => -1,
'category_name' => 'noticias',
'post_status' => 'publish'
]);
}
private function getIconsRRSS() {
$icons_rrss = [];
for ($i = 1; $i <= 4; $i++) {
$img = get_field('rrss_img_' . $i, 'option');
$url = get_field('rrss_url_' . $i, 'option');
if ($img || $url) {
$icons_rrss[] = [
'imagen' => $img,
'url' => $url
];
}
}
return $icons_rrss;
}
private function getLogosHeader ($max_logos = 2) {
$logos = [];
for ($i = 1; $i <= $max_logos; $i++) {
$logoHeader = get_field('logo_header_' . $i, 'option');
$textoHeader = get_field('texto_header_' . $i, 'option');
if ($logoHeader || $textoHeader) {
$logos[] = [
'logo' => $logoHeader,
'texto' => $textoHeader
];
}
}
return $logos;
}
private function getVideos() {
return Timber::get_posts([
'post_type' => 'videos',
'posts_per_page' => -1, // -1 = sin límite
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC'
]);
}
private function getUltimoArticuloOpinion() {
return Timber::get_posts([
'post_type' => 'opinion',
'posts_per_page' => 1,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC'
]);
}
private function getCampanaArticles() {
return Timber::get_posts([
'post_type' => 'campana',
'posts_per_page' => 1,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC'
]);
}
public function generar_embed_universal($url) {
if (empty($url)) {
return false;
}
// YouTube
if (strpos($url, 'youtube.com') !== false || strpos($url, 'youtu.be') !== false) {
//error_log('es un vídeo de youtube'); // Debug
preg_match('/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/', $url, $matches);
if (!empty($matches[1])) {
$embed_data = [
'platform' => 'youtube',
'embed_url' => 'https://www.youtube.com/embed/' . $matches[1] . '?rel=0&modestbranding=1',
'thumbnail_url' => 'https://img.youtube.com/vi/' . $matches[1]. '/hqdefault.jpg',
'allow' => 'autoplay; encrypted-media; picture-in-picture'
];
//error_log('Embed URL generada: ' . $embed_data['embed_url']);
return $embed_data;
} else {
error_log('No se pudo extraer ID de YouTube');
}
}
// Vimeo
if (strpos($url, 'vimeo.com') !== false) {
preg_match('/vimeo\.com\/(\d+)/', $url, $matches);
if (!empty($matches[1])) {
return [
'platform' => 'vimeo',
'embed_url' => 'https://player.vimeo.com/video/' . $matches[1] . '?title=0&byline=0&portrait=0',
'allow' => 'autoplay; fullscreen; picture-in-picture'
];
}
}
// Si no se reconoce la plataforma
return [
'platform' => 'generic',
'embed_url' => $url,
'allow' => 'fullscreen'
];
}
// Hacer función disponible en Twig
public function add_videos_embed_to_twig ($twig) {
//error_log('Añadiendo función generar_embed a Twig'); // Debug
$twig->addFunction(new \Twig\TwigFunction('generar_embed', [$this, 'generar_embed_universal']));
return $twig;
}
private function getPaginasAcerca() {
return Timber::get_posts([
'post_type' => 'acerca',
'post_status' => 'publish',
'orderby' => 'menu_order',
'order' => 'ASC',
'posts_per_page' => -1,
]);
}
private function getDocumentos() {
$posts = Timber::get_posts([
'post_type' => 'documento',
'post_status' => 'publish',
'orderby' => 'menu_order',
'order' => 'ASC',
'posts_per_page' => -1,
]);
//error_log('✅ Número de posts "Documentos" encontrados: ' . count($posts));
$documentos = [];
foreach ($posts as $post) {
$doc = [
'id' => $post->ID,
'title' => $post->title,
'link' => $post->link,
'content' => $post->content,
'excerpt' => $post->excerpt,
];
$archivo = get_field('documento', $post->ID);
if ($archivo && is_array($archivo)) {
$doc['documento_url'] = $archivo['url'] ?? '';
$doc['documento_filename'] = $archivo['filename'] ?? '';
$doc['documento_filesize'] = size_format($archivo['filesize'] ?? 0);
$doc['documento_extension'] = pathinfo($archivo['filename'] ?? '', PATHINFO_EXTENSION);
$doc['thumbnail'] = get_the_post_thumbnail_url($post->ID, 'medium');
}
$documentos[] = $doc;
}
return $documentos;
}
/**
* Obtiene los grupos de enlaces de la página "Enlaces"
*/
private function getEnlaces() {
$grupos = [];
// Buscar página por su slug
$page = get_page_by_path('enlaces');
if (!$page) {
error_log('🔴 Página "enlaces" no encontrada con get_page_by_path().');
return [];
}
if (!have_rows('grupos_enlaces', $page->ID)) {
error_log('🔴 Array vacío');
return [];
} else {
//error_log('✅ "grupos_enlaces" tiene filas.');
}
// Si se encuentra la página y el campo tiene filas
if ($page && have_rows('grupos_enlaces', $page->ID)) {
$field = get_field('grupos_enlaces', $page->ID);
//error_log('📦 Contenido de get_field: ' . print_r($field, true));
//error_log('✅ Página "enlaces" encontrada con ID: ' . $page->ID);
while (have_rows('grupos_enlaces', $page->ID)) {
the_row();
$grupo = [
'titulo' => get_sub_field('titulo_grupo'),
'enlaces' => []
];
// Recorrer enlaces dentro del grupo
if (have_rows('enlaces')) {
while (have_rows('enlaces')) {
the_row();
$titulo_enlace = get_sub_field('titulo_enlace');
$url_enlace = get_sub_field('url_enlace');
if (!empty($titulo_enlace) && !empty($url_enlace)) {
$enlace = [
'titulo' => $titulo_enlace,
'url' => $url_enlace,
'target' => get_sub_field('target_enlace') ?: '_self'
];
$grupo['enlaces'][] = $enlace;
}
}
}
// Añadir grupo solo si tiene título y enlaces válidos
if (!empty($grupo['titulo']) && !empty($grupo['enlaces'])) {
$grupos[] = $grupo;
}
}
}
return $grupos;
}
// Get subpages of "servicios publicos"
private function getPaginasServiciosPublicos() {
$pag_servicios_publicos = get_page_by_path('accion-sindical/servicios-publicos');
if (!$pag_servicios_publicos) {
error_log('🔴 Página "Servicios públicos" no encontrada.');
return [];
}
$subpaginas = Timber::get_posts([
'post_type' => 'page',
'post_status' => 'publish',
'post_parent' => $pag_servicios_publicos->ID,
'orderby' => 'menu_order',
'order' => 'ASC',
'posts_per_page' => -1,
]);
foreach ($subpaginas as $pagina) {
//$pagina->imagen = $pagina->thumbnail ? $pagina->thumbnail->src('medium') : null;
$pagina->thumbnail= get_the_post_thumbnail_url($pagina->ID);
}
return $subpaginas;
}
// Get subpages of "servicios privados"
private function getPaginasServiciosPrivados() {
$pag_servicios_privados = get_page_by_path('accion-sindical/servicios-privados');
if (!$pag_servicios_privados) {
error_log('🔴 Página "Servicios privados" no encontrada.');
return [];
}
$subpaginas = Timber::get_posts([
'post_type' => 'page',
'post_status' => 'publish',
'post_parent' => $pag_servicios_privados->ID,
'orderby' => 'menu_order',
'order' => 'ASC',
'posts_per_page' => -1,
]);
foreach ($subpaginas as $pagina) {
//$pagina->imagen = $pagina->thumbnail ? $pagina->thumbnail->src('medium') : null;
$pagina->thumbnail= get_the_post_thumbnail_url($pagina->ID);
}
return $subpaginas;
}
public function getContactoFields() {
$post = Timber::get_post();
$form_shortcode = get_field('etiqueta_formulario', $post->ID); // o el campo ACF donde esté el shortcode
$contactsFields = [
'nombre' => get_field('nombre_contacto', $post->ID),
'direccion' => get_field('direccion', $post->ID),
'url_mapa' => get_field('url_mapa', $post->ID),
'forma_contacto' => get_field('forma_contacto', $post->ID),
'url_web' => get_field('url_web', $post->ID),
'url_facebook' => get_field('url_facebook', $post->ID),
'url_twitter' => get_field('url_twitter', $post->ID),
'form' => !empty($form_shortcode) ? do_shortcode($form_shortcode) : '',
];
return $contactsFields;
}
public function getAfiliateFields() {
$post = Timber::get_post();
$afiliateFields = [
'imagen_afiliate' => get_field('imagen_afiliate', $post->ID),
'enlace_boton_afiliate' => get_field('enlace_boton_afiliate', $post->ID),
'texto_boton' => get_field('texto_boton', $post->ID),
];
if (empty($afiliateFields['imagen_afiliate']) && empty($afiliateFields['enlace_boton_afiliate'])) {
return null;
}
return $afiliateFields;
}
public function exclude_pages_from_search($query) {
if (!is_admin() && $query->is_main_query() && $query->is_search()) {
$query->set('meta_query', array(
'relation' => 'OR',
array(
'key' => 'exclude_from_search',
'compare' => 'NOT EXISTS'
),
array(
'key' => 'exclude_from_search',
'value' => '1',
'compare' => '!='
)
));
}
}
//Global variables
public function add_global_context($context) {
$context['footer_1'] = get_field('footer_text_1', 'option');
$context['footer_2'] = get_field('footer_text_2', 'option');
$context['recent_posts_noticias'] = $this->recentPostsNews();
$context['botones_imagen'] = $this->getBotonesImagen();
$context['redes_sociales'] = $this->getIconsRRSS();
$context['logos_header'] = $this->getLogosHeader();
$context['videos'] = $this->getVideos();
$context['ultimo_articulo_opinion'] = $this->getUltimoArticuloOpinion();
$context['posts_campana'] = $this->getCampanaArticles();
$context['paginas_acerca'] = $this->getPaginasAcerca();
$context['documentos'] = $this->getDocumentos();
$context['enlaces'] = $this->getEnlaces();
$context['subpaginas_servicios_publicos'] = $this->getPaginasServiciosPublicos();
$context['subpaginas_servicios_privados'] = $this->getPaginasServiciosPrivados();
$context['contacto_info'] = $this->getContactoFields();
$context['afiliate_fields'] = $this->getAfiliateFields();
return $context;
}
}