[đ ] Aligner les rĂ©sultats de recherche sur les cartes de liste
âš RĂ©sumĂ© de GPT-5.5 ă
Journal du remplacement des cartes de recherche assemblĂ©es par chaĂźnes JavaScript par une carte Liquid partagĂ©e, afin que date, catĂ©gories, vues et layout de lâoverlay suivent les mĂȘmes rĂšgles que les listes normales.
Les rĂ©sultats de recherche avaient lâair anciens.
Sur lâaccueil et les pages de catĂ©gories, les cartes dâarticles Ă©taient dĂ©jĂ plus cohĂ©rentes. Sous le titre, on voyait la date, les badges de catĂ©gorie et le nombre de vues dans la mĂȘme ligne de mĂ©tadonnĂ©es.
Mais en ouvrant la recherche, une ancienne UI apparaissait.
Elle affichait seulement le titre et lâextrait. On ne voyait pas immĂ©diatement quand lâarticle avait Ă©tĂ© Ă©crit. Il nây avait ni catĂ©gorie ni vues. Le mĂȘme article avait du contexte dans les listes normales, mais le perdait dans les rĂ©sultats de recherche.
La cause était que les résultats de recherche étaient encore rendus par une chaßne HTML séparée en JavaScript.
Le rendu par chaĂźnes JavaScript vieillissait la recherche
Lunr continue de gérer la recherche.
Pour un blog Jekyll statique, construire un store de recherche au moment du build puis lâinterroger en JavaScript cĂŽtĂ© navigateur est logique.
Le problÚme était que JavaScript construisait aussi la carte du résultat.
Les listes normales étaient rendues par _includes/archive-single.html, tandis que les résultats de recherche étaient assemblés en chaßnes dans assets/js/lunr/lunr-en.js.
La structure ressemblait Ă ceci :
Regular listing
-> Liquid include
-> archive__item
-> date, category, views
Search results
-> Lunr JS
-> hand-built HTML string
-> title and excerpt only
CâĂ©tait la source du problĂšme.
Si jâajoutais des badges de catĂ©gorie aux listes normales, la recherche ne changeait pas. Si je modifiais la rĂšgle dâaffichage de date, la recherche ne changeait pas. Si je retouchais les vues, la recherche restait identique.
La mĂȘme carte dâarticle Ă©tait maintenue Ă deux endroits.
Jâai sĂ©parĂ© la carte dâarticle dans un include partagĂ©
Au lieu de grossir le JavaScript de recherche, je lui ai fait produire moins de HTML.
Jâai ajoutĂ© des includes partagĂ©s.
_includes/archive-item-card.html
_includes/archive-item-meta-row.html
_includes/archive-item-categories.html
archive-item-card.html reçoit un document et rend la mĂȘme structure que les listes dâarchive existantes.
list__item
archive__item
archive__item-title
archive__item-meta-row
archive__item-excerpt
archive-item-meta-row.html regroupe date, vues et catĂ©gories sur une ligne. La date et les vues continuent dâutiliser page__meta.html, tandis que les catĂ©gories passent par archive-item-categories.html.
Ensuite, _includes/archive-single.html est devenu un wrapper mince.
{% include archive-item-card.html document=post type=include.type context="archive" %}
Les listes normales et les rĂ©sultats de recherche utilisent maintenant le HTML gĂ©nĂ©rĂ© par le mĂȘme include.
Jâai mis le HTML complet de la carte dans le store Lunr
Lunr fait toujours la recherche.
Mais JavaScript ne construit plus le HTML de la carte.
Au build Jekyll, assets/js/lunr/lunr-store.js rend lâinclude de carte pour chaque document et place le rĂ©sultat dans le champ html.
title
excerpt
categories
tags
lang
locale
html
url
teaser
Le JavaScript de recherche prend maintenant entry.html et lâinsĂšre.
Avant, il mĂ©langeait liens de titre, image teaser, dĂ©coupe dâextrait et assemblage de chaĂźnes HTML.
var renderSearchResult = function (entry) {
return entry.html || '';
};
Le JS de recherche garde seulement la recherche, le filtrage par locale, lâaffichage du nombre de rĂ©sultats et lâinsertion.
Les vues en recherche sont affichées, pas enregistrées
Il fallait décider si les résultats de recherche devaient aussi afficher les vues.
Au dĂ©but, jâai envisagĂ© de les retirer. Les rĂ©sultats pouvaient devenir chargĂ©s, et le DOM insĂ©rĂ© dynamiquement demandait un traitement sĂ©parĂ©.
Mais si la carte doit correspondre aux listes normales, retirer uniquement les vues est aussi étrange.
Les rĂ©sultats de recherche affichent donc les vues. Lâaffichage et lâenregistrement restent sĂ©parĂ©s.
Search result exposure is not a visit.
The view count in search results is display-only.
Actual visit tracking belongs only to the currently opened page.
Les Ă©lĂ©ments de vues du blog ont data-page-view-path. La vraie cible de tracking est lâĂ©lĂ©ment de la page courante avec data-page-view-track="true".
Les cartes de recherche ont seulement data-page-view-path; elles nâont pas data-page-view-track="true".
Donc lâapparition dâun article dans la recherche nâincrĂ©mente pas ses vues.
Elle affiche seulement le nombre.
Je réapplique les vues aux résultats dynamiques
Les résultats de recherche ne sont pas dans le DOM au chargement initial.
Ils sont insĂ©rĂ©s aprĂšs la saisie de lâutilisateur. Si le script de vues ne collecte les Ă©lĂ©ments quâune fois au chargement, les vues dans les rĂ©sultats ne seront jamais remplies.
Jâai donc aussi modifiĂ© assets/js/custom/visitor-stats.js.
Au lieu de fixer document.querySelectorAll("[data-page-view-path]") au début du fichier, il recherche ces éléments à chaque rendu des vues.
Jâai aussi mis en cache le payload analytics.
latestAnalyticsPayload
AprÚs le rendu des résultats, le script de recherche déclenche hyuk:search-results-rendered.
Le script visitor stats Ă©coute cet Ă©vĂ©nement et, sâil a dĂ©jĂ un payload, rĂ©applique les vues au nouveau DOM.
Il ne rappelle pas lâAPI.
Si chaque changement de saisie appelait lâAPI de vues, la recherche interfĂ©rerait avec le compteur. Les rĂ©sultats changent souvent, donc les requĂȘtes rĂ©seau ne doivent pas suivre chaque touche.
Le flux devient :
Page load
-> receive analytics payload once
-> render views for existing listing/current page
Search results render
-> dispatch event
-> reuse cached payload for newly inserted DOM
Ainsi les résultats de recherche ne polluent pas le compteur.
Les métadonnées multilingues suivent chaque locale
AprÚs le travail multilingue du blog, le site a des pages et collections par locale comme /en/, /ja/ et /zh-Hans/. La recherche ne doit pas mélanger les locales.
Le store de recherche contient lang et locale, et le HTML de la carte utilise la locale du document pour les labels. En anglais on voit Views, en japonais éČ芧æ°, et en français Vues.
Les catĂ©gories suivent la mĂȘme rĂšgle.
Le préfixe de locale ne doit pas devenir un badge de catégorie. archive-item-categories.html ignore donc ce segment et affiche seulement les vraies catégories.
Jâai restaurĂ© la sidebar et une largeur plus grande dans lâoverlay
Aligner la carte ne suffisait pas.
Ă lâouverture de la recherche, la largeur des rĂ©sultats restait trop Ă©troite. MĂȘme avec le mĂȘme HTML que les listes normales, lâespace Ă droite nâĂ©tait pas utilisĂ©.
Il y avait aussi un problÚme plus large : ouvrir la recherche faisait disparaßtre les catégories latérales.
Lâoverlay de recherche nâest pas posĂ© au-dessus du corps existant. Ă lâouverture, .initial-content est masquĂ© et une zone sĂ©parĂ©e #site-search sâaffiche.
La sidebar de la page normale disparaĂźt donc aussi. MĂȘme avec une carte partagĂ©e, lâĂ©cran de recherche paraĂźt sĂ©parĂ© si le layout autour change.
Jâai donc inclus la sidebar dans _includes/search/search_form.html.
<div class="search-content__inner-wrap">
{% include sidebar.html %}
<div class="archive search-content__archive">
...
</div>
</div>
Jâai aussi enveloppĂ© les rĂ©sultats dans archive search-content__archive, pour quâils suivent le layout dâarchive.
Puis jâai retirĂ© la rĂšgle CSS qui rĂ©trĂ©cissait les cartes.
Minimal Mistakes avait cette rĂšgle pour la recherche :
.search-content .archive__item {
@include breakpoint($large) {
width: 75%;
}
@include breakpoint($x-large) {
width: 50%;
}
}
Lâapparence ancienne ne venait donc pas seulement du HTML. Sur grand Ă©cran, la carte Ă©tait rĂ©duite de moitiĂ©.
Dans le SCSS personnalisé, les cartes de recherche reprennent toute la largeur.
.search-content .archive__item {
width: 100%;
}
Il restait un autre détail.
Lâarchive normale rĂ©serve de lâespace Ă droite avec padding-inline-end pour la sidebar droite. Lâoverlay de recherche nâa pas cette sidebar. Garder ce padding rend les rĂ©sultats trop Ă©troits.
Jâai donc supprimĂ© ce padding seulement pour lâarchive de lâoverlay.
.search-content .search-content__archive {
padding-inline-end: 0;
}
Les rĂšgles de rendu de carte restent partagĂ©es avec les listes normales ; seul le layout de lâoverlay est ajustĂ© pour la recherche.
Jâai vĂ©rifiĂ© desktop et mobile
Jâai lancĂ© le build et les checks de syntaxe.
bundle exec jekyll build
node --check _site/assets/js/lunr/lunr-store.js
node --check _site/assets/js/lunr/lunr-en.js
node --check _site/assets/js/custom/visitor-stats.js
Le store généré contient page__views et data-page-view-path.
Le HTML de carte de recherche ne contient pas data-page-view-track="true", ce qui évite de mélanger exposition dans la recherche et tracking de visite.
Jâai ensuite ouvert la recherche dans plusieurs pages locale et testĂ© des requĂȘtes comme :
References
Keymory
Daily review
Les cartes affichaient date, catĂ©gorie et vues dans la mĂȘme ligne de mĂ©tadonnĂ©es que les listes normales. Les labels suivaient chaque locale : Views, éČ芧æ°, Vues et les autres.
Dans les rĂ©sultats, data-page-view-track="true" Ă©tait absent. Sur les pages dâarticles, lâĂ©lĂ©ment de tracking de la page courante apparaissait toujours une seule fois.
Lâoverlay de recherche avait de nouveau la sidebar. Ă 1280px de large sur desktop, la sidebar avait 22 Ă©lĂ©ments et la carte de rĂ©sultat atteignait environ 974px de largeur.
Ă 390px sur mobile, la sidebar se plaçait au-dessus et la carte utilisait 345px pour le titre, les mĂ©tadonnĂ©es et lâextrait.
La console du navigateur nâaffichait aucune erreur.
Laisser un commentaire