Files
thalim-theme/inc/seance-helpers.php

53 lines
1.8 KiB
PHP

<?php
/**
* Séances de séminaire (cat « seance-de-seminaire ») :
* résolution mémoïsée séance → séminaire parent, et redirection des
* permaliens de séance vers le parent avec ancre #seance-{ID}.
*/
/**
* Renvoie l'ID du séminaire parent (publié) qui liste cette séance dans son
* champ Pods `seances`, ou 0. Mémoïsé par requête : la même résolution est
* utilisée par les cards, l'agenda, l'AJAX et la redirection.
*/
function thalim_get_seance_parent_id( int $seance_id ): int {
static $cache = [];
if ( ! isset( $cache[ $seance_id ] ) ) {
global $wpdb;
$cache[ $seance_id ] = (int) $wpdb->get_var( $wpdb->prepare(
"SELECT pm.post_id FROM {$wpdb->postmeta} pm
JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = 'seances' AND pm.meta_value = %s
AND p.post_status = 'publish'
LIMIT 1",
(string) $seance_id
) );
}
return $cache[ $seance_id ];
}
/**
* Lien public d'une séance : permalien du séminaire parent + #seance-{ID},
* ou permalien de la séance elle-même si aucun parent n'est trouvé.
*/
function thalim_get_seance_link( int $seance_id ): string {
$parent_id = thalim_get_seance_parent_id( $seance_id );
return $parent_id
? get_permalink( $parent_id ) . '#seance-' . $seance_id
: (string) get_permalink( $seance_id );
}
// Séance de séminaire: redirect to parent séminaire with #seance-{ID} anchor
add_action( 'template_redirect', function() {
if ( ! is_single() ) return;
if ( ! has_category( thalim_cat_id( 'seance' ) ) ) return;
$seance_id = get_the_ID();
$parent_id = thalim_get_seance_parent_id( $seance_id );
if ( $parent_id ) {
wp_redirect( get_permalink( $parent_id ) . '#seance-' . $seance_id, 301 );
exit;
}
} );