'!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
Rosario La Tremendita Matancera Rosario La Tremendita, una de las artistas más audaces e innovadoras del flamenco, presenta Matancera. Este espectáculo innovador reimagina los antiguos rituales de la matanza —un evento comunitario profundamente arraigado en la tradición española— a través del flamenco contemporáneo. Con su característica combinación de emoción pura, paisajes sonoros vanguardistas y […]
Rosario ‘La Tremendita’ Tránsito Con Tránsito (Huyendo del ruido), la innovadora cantaora Rosario “La Tremendita” despoja al flamenco hasta su esencia en una poderosa colaboración con el maestro guitarrista Dani de Morón. Esta obra íntima es un viaje de regreso a los cantes tradicionales que conforman el alma del flamenco, reinterpretados con una creatividad valiente […]