// ROUTE AJAX DE RECHERCHE AVEC PAGINATION EN HAUT ET EN BAS add_action('wp_ajax_tng_media_search', 'tng_ms_ajax_search_handler'); add_action('wp_ajax_nopriv_tng_media_search', 'tng_ms_ajax_search_handler'); function tng_ms_ajax_search_handler() { $search = isset($_POST['search']) ? sanitize_text_field($_POST['search']) : ''; $page = isset($_POST['page']) ? max(1, intval($_POST['page'])) : 1; $tng_db = new TNG_DB(); $options = get_option('tng_ms_settings'); $max_pool = 500; $per_page = 30; $thumb_width = isset($options['thumb_width']) ? intval($options['thumb_width']) : 200; $results = array(); try { $results = $tng_db->search_media($search, $max_pool); } catch (Exception $e) { $results = array(); } $is_logged = $tng_db->is_user_logged_into_tng(); $tng_url = rtrim($options['tng_url'] ?? '', '/') . '/'; $grid_html = ''; $total_count = !empty($results) && is_array($results) ? count($results) : 0; if ($total_count > 0) { $chunks = array_chunk($results, $per_page); $total_pages = count($chunks); $page = min($page, $total_pages); $current_page_results = $chunks[$page - 1]; // Création de la structure HTML des boutons $pagination_markup = ''; if ($total_pages > 1) { $pagination_markup .= '
'; if ($page > 1) { $pagination_markup .= ''; } else { $pagination_markup .= ''; } $pagination_markup .= 'Page '.$page.' sur '.$total_pages.''; if ($page < $total_pages) { $pagination_markup .= ''; } else { $pagination_markup .= ''; } $pagination_markup .= '
'; } // 1. On injecte la pagination HAUTE $grid_html .= $pagination_markup; // 2. On injecte la grille de portraits $grid_html .= '
'; foreach ($current_page_results as $row) { $is_living = intval($row['living ?? 0']) === 1; if ($is_living && !$is_logged) { $media_url = TNG_MEDIA_SYNC_URL . 'assets/images/living-placeholder.png'; $desc = "Média masqué - Personne vivante"; } else { $media_url = $tng_url . ($row['full_url'] ?? ''); $desc = !empty($row['description']) ? esc_html($row['description']) : 'Média TNG'; } $link_url = $tng_url . "showmedia.php?mediaID=" . ($row['mediaID'] ?? ''); $grid_html .= '
'.esc_attr($desc).'
'.$desc.'
'; } $grid_html .= '
'; // 3. On ré-injecte la pagination BASSE $grid_html .= $pagination_markup; } else { $grid_html .= '

Aucun résultat trouvé pour votre recherche.

'; } wp_send_json_success(array( 'grid_html' => $grid_html, 'count' => $total_count )); }{"id":5206,"date":"2026-03-25T13:39:52","date_gmt":"2026-03-25T12:39:52","guid":{"rendered":"https:\/\/malvache.net\/malvache\/?p=5206"},"modified":"2026-03-25T13:45:15","modified_gmt":"2026-03-25T12:45:15","slug":"%f0%9f%8c%bf-les-cimetieres-des-archives-a-ciel-ouvert-au-service-de-la-genealogie","status":"publish","type":"post","link":"https:\/\/malvache.net\/malvache\/2026\/03\/25\/%f0%9f%8c%bf-les-cimetieres-des-archives-a-ciel-ouvert-au-service-de-la-genealogie\/","title":{"rendered":"\ud83c\udf3f Les cimeti\u00e8res : des archives \u00e0 ciel ouvert au service de la g\u00e9n\u00e9alogie"},"content":{"rendered":"\n

Quand on se lance dans la recherche de ses anc\u00eatres, on pense imm\u00e9diatement aux registres d\u2019\u00e9tat civil, aux recensements, aux archives notariales. Pourtant, un lieu discret, silencieux et souvent n\u00e9glig\u00e9 reste l\u2019un des plus riches en informations : le cimeti\u00e8re<\/strong>.<\/p>\n\n\n\n

Bien plus qu\u2019un espace de recueillement, le cimeti\u00e8re est un v\u00e9ritable livre de pierre<\/strong>, o\u00f9 chaque tombe raconte une histoire, compl\u00e8te une lign\u00e9e, ou r\u00e9sout une \u00e9nigme familiale. \u00c0 l\u2019heure o\u00f9 la g\u00e9n\u00e9alogie se pratique de plus en plus avec des logiciels et des bases num\u00e9riques, les cimeti\u00e8res demeurent un terrain d\u2019enqu\u00eate irrempla\u00e7able.<\/p>\n\n\n\n

\ud83e\udea6 Pourquoi les cimeti\u00e8res sont essentiels pour les g\u00e9n\u00e9alogistes<\/h2>\n\n\n\n

1. Ils confirment ou corrigent les donn\u00e9es des archives<\/strong><\/h3>\n\n\n\n

Les inscriptions fun\u00e9raires permettent souvent de :<\/p>\n\n\n\n