Skip to content
/* ==========================================================================
THE EVENTS CALENDAR + WPML : liens des vues sur les pages catégorie
TEC laisse son motif de réécriture dans l'adresse des vues
(ex. /evenements/category/%5B/%5D+*(%5B/%5D+)/mois/).
On le remplace par le slug de la catégorie dans le HTML final,
au chargement de la page comme dans les réponses AJAX des vues.
========================================================================== */
// Retrouve le slug de catégorie (ex. cine-debats) à partir d'une adresse
function maat_tec_cat_slug_from_url( $url ) {
$path = rawurldecode( (string) wp_parse_url( (string) $url, PHP_URL_PATH ) );
if ( ! preg_match( '#/(?:category|categorie|catégorie)/(.+)$#u', $path, $m ) ) {
return '';
}
$views = [ 'liste', 'list', 'mois', 'month', 'jour', 'day', 'aujourd’hui', "aujourd'hui", 'today',
'semaine', 'week', 'photo', 'carte', 'map', 'resume', 'résumé', 'summary', 'page' ];
$out = [];
foreach ( array_filter( explode( '/', $m[1] ) ) as $seg ) {
if ( in_array( $seg, $views, true ) || preg_match( '/^\d{4}(-\d{2}){0,2}$/', $seg ) || preg_match( '/[\[\]\(\)\*\+\^]/', $seg ) ) {
break;
}
$out[] = $seg;
}
return implode( '/', $out );
}
function maat_tec_fix_category_links( $html, $slug ) {
if ( '' === $slug || false === stripos( $html, '%5B' ) && false === strpos( $html, '[' ) ) {
return $html;
}
// Motif (?:[^/]+/)*([^/]+), brut, abîmé, encodé (%5B…) ou échappé en JSON (\/)
$o = '(?:\[|%5B)'; $c = '(?:\]|%5D)'; $h = '(?:\^|%5E)?'; $s = '\\\\?/';
$po = '(?:\(|%28)'; $pc = '(?:\)|%29)';
$re = "#{$po}?(?:\?:|%3F%3A)?{$o}{$h}{$s}{$c}\+(?:{$s})?{$pc}?\*{$po}{$o}{$h}{$s}{$c}\+{$pc}#i";
$fixed = preg_replace( $re, rawurlencode( $slug ) === $slug ? $slug : implode( '/', array_map( 'rawurlencode', explode( '/', $slug ) ) ), $html );
return null === $fixed ? $html : $fixed;
}
// 1. Pages de l'agenda chargées normalement
add_action( 'template_redirect', function () {
if ( is_admin() || is_feed() || ! function_exists( 'tribe_is_event_query' ) || ! tribe_is_event_query() ) {
return;
}
$slug = get_query_var( 'tribe_events_cat' );
if ( ! is_string( $slug ) || '' === $slug ) {
$slug = maat_tec_cat_slug_from_url( $_SERVER['REQUEST_URI'] ?? '' );
}
if ( '' === $slug ) {
return;
}
ob_start( function ( $html ) use ( $slug ) {
return maat_tec_fix_category_links( $html, $slug );
} );
}, 1 );
// 2. Réponses AJAX des vues (clic sur Liste / Mois / Jour, flèches, Aujourd'hui)
add_action( 'init', function () {
$uri = $_SERVER['REQUEST_URI'] ?? '';
$is_rest = false !== strpos( $uri, 'tribe/views/v2' ) || false !== strpos( (string) ( $_GET['rest_route'] ?? '' ), 'tribe/views/v2' );
$is_ajax = wp_doing_ajax() && isset( $_REQUEST['action'] ) && 0 === strpos( (string) $_REQUEST['action'], 'tribe_events_views_v2' );
if ( ! $is_rest && ! $is_ajax ) {
return;
}
$slug = '';
foreach ( [ 'url', 'prev_url' ] as $key ) {
if ( '' === $slug && ! empty( $_REQUEST[ $key ] ) ) {
$slug = maat_tec_cat_slug_from_url( wp_unslash( $_REQUEST[ $key ] ) );
}
}
if ( '' === $slug ) {
return;
}
ob_start( function ( $html ) use ( $slug ) {
return maat_tec_fix_category_links( $html, $slug );
} );
}, 1 );