'!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' ) ); ?>
format( 'j' ) ); ?>
No hay programación para este día.
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 );
Ir al contenido
View news
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s. Lorem Ipsum is simply dummy text of the printing […]
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s. Lorem Ipsum is simply dummy text of the printing […]
Flamenco Festival USA 2025 rinde homenaje a Granada y Federico García Lorca con una edición inolvidable Del 5 al 15 de marzo de 2025, Flamenco Festival USA regresa a los escenarios de Estados Unidos con una de sus ediciones más especiales y ambiciosas. Por primera vez, el festival rinde homenaje a la ciudad de Granada […]
FLAMENCO FESTIVAL LONDRES CIERRA SU 21 EDICIÓN CON EL REFRENDO DE LA CRÍTICA ESPECIALIZADA Y UN 80% DE OCUPACIÓN MEDIA EN SUS ESPECTÁCULOS Un total de 15.400 espectadores han asistido a las 21 funciones protagonizadas por 13 compañías y cerca de 80 artistas entre Londres y Mánchester, en una edición que ha generado más de […]
FLAMENCO FESTIVAL LONDON CLOSES ITS 21ST EDITION WITH THE ENDORSEMENT OF SPECIALIST CRITICS AND AN AVERAGE ATTENDANCE RATE OF 80% ACROSS ITS SHOWS A total of 15,400 spectators attended the 21 performances featuring 13 companies and nearly 80 artists in London and Manchester, in an edition that generated more than thirty reviews across 16 specialist […]
FLAMENCO FESTIVAL LONDRES HEADS INTO ITS FINAL STAGE, WITH ROCÍO MOLINA, THE BALLET FLAMENCO DE ANDALUCÍA AND CALIFATO 3/4 TAKING CENTER STAGE The second half of the festival’s 21st edition will bring some of the most outstanding voices in contemporary flamenco to the British capital, ranging from avant-garde stage productions to innovative interpretations of tradition. […]