perf: cache résultats de recherche par requête, invalidé sur create/update/delete
This commit is contained in:
+26
-18
@@ -1851,27 +1851,35 @@ switch ($action) {
|
||||
|
||||
case 'search':
|
||||
require_once BASE_PATH . '/src/SearchEngine.php';
|
||||
$searchQuery = trim($_GET['q'] ?? '');
|
||||
$searchQuery = trim($_GET['q'] ?? '');
|
||||
$searchResults = [];
|
||||
if ($searchQuery !== '') {
|
||||
$privateCats = $articles->getPrivateCategories();
|
||||
// Utilise l'index pré-construit si disponible (lecture d'un seul fichier JSON)
|
||||
// Sinon fallback sur getAll() qui scanne tous les répertoires
|
||||
$rawPool = $articles->getSearchIndex() ?? $articles->getAll(true);
|
||||
$searchPool = array_values(array_filter($rawPool, static function (array $a) use ($privateCats): bool {
|
||||
if (!($a['published'] ?? false)) {
|
||||
return false;
|
||||
$isAnonSearch = !isLoggedIn();
|
||||
// Lecture du cache pour les visiteurs anonymes
|
||||
if ($isAnonSearch) {
|
||||
$searchResults = $articles->getSearchCache($searchQuery) ?? [];
|
||||
}
|
||||
if (empty($searchResults)) {
|
||||
$privateCats = $articles->getPrivateCategories();
|
||||
$rawPool = $articles->getSearchIndex() ?? $articles->getAll(true);
|
||||
$searchPool = array_values(array_filter($rawPool, static function (array $a) use ($privateCats): bool {
|
||||
if (!($a['published'] ?? false)) {
|
||||
return false;
|
||||
}
|
||||
$cat = trim($a['category'] ?? '');
|
||||
if ($cat !== '' && in_array($cat, $privateCats, true) && !isLoggedIn()) {
|
||||
return false;
|
||||
}
|
||||
if (strtotime((string)($a['published_at'] ?? '')) > time() && !hasCapability('view_previews')) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}));
|
||||
$searchResults = (new SearchEngine())->search($searchQuery, $searchPool);
|
||||
if ($isAnonSearch && !empty($searchResults)) {
|
||||
$articles->setSearchCache($searchQuery, $searchResults);
|
||||
}
|
||||
$cat = trim($a['category'] ?? '');
|
||||
if ($cat !== '' && in_array($cat, $privateCats, true) && !isLoggedIn()) {
|
||||
return false;
|
||||
}
|
||||
if (strtotime((string)($a['published_at'] ?? '')) > time() && !hasCapability('view_previews')) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}));
|
||||
$searchResults = (new SearchEngine())->search($searchQuery, $searchPool);
|
||||
}
|
||||
}
|
||||
include BASE_PATH . '/templates/search.php';
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user