'!Ymd', '/^\d{4}-\d{2}-\d{2}$/' => '!Y-m-d', '/^\d{2}\/\d{2}\/\d{4}$/' => '!d/m/Y', ); foreach ( $formats as $pattern => $format ) { if ( preg_match( $pattern, $value ) ) { $date = DateTimeImmutable::createFromFormat( $format, $value, $tz ); return $date instanceof DateTimeImmutable ? $date : null; } } return null; } function lnz_current_event_id() { $event_id = (int) get_queried_object_id(); return $event_id && LNZ_EVENT_CPT === get_post_type( $event_id ) ? $event_id : 0; } function lnz_related_program_ids( $event_id ) { $value = lnz_raw_field( LNZ_EVENT_PROGRAMS, $event_id ); if ( empty( $value ) ) { return array(); } $value = is_array( $value ) ? $value : array( $value ); $ids = array(); foreach ( $value as $item ) { if ( $item instanceof WP_Post ) { $ids[] = (int) $item->ID; } elseif ( is_numeric( $item ) ) { $ids[] = (int) $item; } } return array_values( array_unique( array_filter( $ids ) ) ); } /* Filtra el Loop Grid para mostrar solo los programas relacionados con el evento. */ function lnz_elementor_program_query( $query ) { $event_id = lnz_current_event_id(); $ids = $event_id ? lnz_related_program_ids( $event_id ) : array(); $query->set( 'post_type', LNZ_PROGRAM_CPT ); $query->set( 'post_status', 'publish' ); $query->set( 'post__in', $ids ? $ids : array( 0 ) ); $query->set( 'posts_per_page', -1 ); $query->set( 'ignore_sticky_posts', true ); $query->set( 'no_found_rows', true ); $start = $event_id ? lnz_parse_date( lnz_raw_field( LNZ_EVENT_START, $event_id ) ) : null; $end = $event_id ? lnz_parse_date( lnz_raw_field( LNZ_EVENT_END, $event_id ) ) : null; if ( $start && $end && $end >= $start ) { $meta_query = $query->get( 'meta_query' ); $meta_query = is_array( $meta_query ) ? $meta_query : array(); $meta_query[] = array( 'key' => LNZ_PROGRAM_DATE, 'value' => array( $start->format( 'Ymd' ), $end->format( 'Ymd' ) ), 'compare' => 'BETWEEN', 'type' => 'NUMERIC', ); $query->set( 'meta_query', $meta_query ); } $query->set( 'meta_key', LNZ_PROGRAM_DATE ); $query->set( 'orderby', array( 'meta_value_num' => 'ASC', 'menu_order' => 'ASC', 'title' => 'ASC', ) ); } add_action( 'elementor/query/' . LNZ_QUERY_ID, 'lnz_elementor_program_query' ); /* Añádelo una vez dentro de la plantilla Loop Item. */ function lnz_program_date_marker() { $program_id = (int) get_the_ID(); $date = lnz_parse_date( lnz_raw_field( LNZ_PROGRAM_DATE, $program_id ) ); if ( ! $date || LNZ_PROGRAM_CPT !== get_post_type( $program_id ) ) { return ''; } return sprintf( '', esc_attr( $date->format( 'Y-m-d' ) ) ); } add_shortcode( 'programa_fecha_data', 'lnz_program_date_marker' ); /* Shortcode que genera todos los días del evento y marca los que tienen programas. */ function lnz_program_filter_shortcode( $atts ) { $event_id = lnz_current_event_id(); if ( ! $event_id ) { return ''; } $atts = shortcode_atts( array( 'grid' => '#programacion-loop' ), $atts, 'filtro_programacion' ); $start = lnz_parse_date( lnz_raw_field( LNZ_EVENT_START, $event_id ) ); $end = lnz_parse_date( lnz_raw_field( LNZ_EVENT_END, $event_id ) ); if ( ! $start || ! $end || $end < $start ) { return current_user_can( 'edit_post', $event_id ) ? '

Revisa los nombres y valores de los campos ACF de inicio y finalización.

' : ''; } $counts = array(); foreach ( lnz_related_program_ids( $event_id ) as $program_id ) { $date = lnz_parse_date( lnz_raw_field( LNZ_PROGRAM_DATE, $program_id ) ); if ( $date && $date >= $start && $date <= $end ) { $key = $date->format( 'Y-m-d' ); $counts[ $key ] = isset( $counts[ $key ] ) ? $counts[ $key ] + 1 : 1; } } $months = array( 1 => 'ENE', 'FEB', 'MAR', 'ABR', 'MAY', 'JUN', 'JUL', 'AGO', 'SEP', 'OCT', 'NOV', 'DIC' ); $period = new DatePeriod( $start, new DateInterval( 'P1D' ), $end->modify( '+1 day' ) ); $month = ''; ob_start(); ?>
format( 'Y-m-d' ); $month_key = $date->format( 'Y-m' ); $available = isset( $counts[ $key ] ); ?> format( 'n' ) ] ); ?> format( 'j' ) ); ?>
button.dataset.date === date) || null; } function getItems(grid) { const loopItems = Array.from(grid.querySelectorAll('.e-loop-item')); return loopItems.length ? loopItems : Array.from(grid.querySelectorAll('.elementor-loop-container > *')); } function applyFilter(filter, date) { let grid; try { grid = document.querySelector(filter.dataset.grid || '#programacion-loop'); } catch (error) { return; } if (!grid) return; filter.querySelectorAll('.lnz-program-day.is-available').forEach((button) => { const selected = Boolean(date && button.dataset.date === date); button.classList.toggle('is-selected', selected); button.setAttribute('aria-pressed', selected ? 'true' : 'false'); }); let visible = 0; getItems(grid).forEach((item) => { const marker = item.querySelector('.lnz-program-date'); const itemDate = marker ? marker.dataset.programDate : ''; const show = !date || itemDate === date; item.classList.toggle('lnz-program-hidden', !show); if (show) visible++; }); filter.dataset.selectedDate = date || ''; const message = filter.querySelector('.lnz-program-empty-message'); if (message) message.hidden = visible > 0; } function init() { document.querySelectorAll('.lnz-program-filter').forEach((filter) => { if (filter.dataset.initialized === '1') return; filter.dataset.initialized = '1'; const requested = new URL(window.location.href).searchParams.get('programacion_fecha') || ''; applyFilter(filter, findButton(filter, requested) ? requested : ''); }); } document.addEventListener('click', (event) => { const button = event.target.closest('.lnz-program-day.is-available'); if (!button) return; const filter = button.closest('.lnz-program-filter'); const date = button.classList.contains('is-selected') ? '' : button.dataset.date; applyFilter(filter, date); const url = new URL(window.location.href); date ? url.searchParams.set('programacion_fecha', date) : url.searchParams.delete('programacion_fecha'); window.history.replaceState({}, '', url.toString()); }); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } if (window.jQuery) { window.jQuery(window).on('elementor/frontend/init', init); } }()); JS; wp_add_inline_script( 'jquery', $js, 'after' ); } add_action( 'wp_enqueue_scripts', 'lnz_program_filter_assets', 20 );

Próximos Preestrenos InProgress 2025

El flamenco se vive, se transforma y se celebra en Torrox Dos preestrenos que no te puedes perder: 1 de noviembre, 20h – La juerga que no fue Estévez/Paños y Compañía (Premio Nacional de Danza 2019 en la modalidad de creación) Entradas Una invitación a la alegría, a la memoria y al encuentro colectivo a […]

Flamenco Festival London wraps up its 20th edition with resounding success

Flamenco Festival London wraps up its 20th edition with resounding success With over 16,500 attendees and an average occupancy rate of 80%, Flamenco Festival London reaffirms its place on the UK cultural map. This year, the festival took another step forward in its international expansion: a new edition is planned in Manchester for June 2026. […]

Abierta la convocatoria de la IV Edición del programa de residencias y laboratorios creativos “In Progress” para 2026

En 2021 tuvo lugar en Torrox la primera edición de ‘In Progress’, programa cerrado como un espacio dedicado al flamenco, para flamencos. Pensado para la conversación entre artistas consagrados y vanguardistas de la escena actual. Grandes artistas han pasado por este programa, entre ellos Olga Pericet, Sergio de Lope, Paula Comitre, Irene Morales, Compañía Musa, […]

This Week at Flamenco Festival London: Must-See Performances

This Week at Flamenco Festival London: Must-See Performances We’re entering the final week of Flamenco Festival London — and what a week it’s going to be. From acclaimed artists to exciting new talents, this is your last opportunity to experience a wide range of flamenco styles live in London. “Muerta de Amor” – Manuel Liñán […]

Developed by Lienzzo