Skip to content

feat: resolve query loop pagination at request time - #126

Open
charl0tee wants to merge 1 commit into
futurefrom
feat/query-pagination-request-time
Open

feat: resolve query loop pagination at request time#126
charl0tee wants to merge 1 commit into
futurefrom
feat/query-pagination-request-time

Conversation

@charl0tee

Copy link
Copy Markdown
Contributor

Contexte

La pagination de core/query était résolue au build-time : les attributs des blocs core/query-pagination-* sont figés dans le snapshot du template FSE (fse-templates-and-parts.json), et l'injection PHP (query-pagination-offset.php via le header X-Query-Page) ne s'exécute jamais au request-time pour ces blocs. Conséquence : publier un nouvel article ne met pas la pagination à jour sans rebuild.

Cette PR déplace tout le calcul de pagination au request-time, côté Next (dans le data layer de core/query, qui tourne à chaque get-node-by-uri).

Changements

Nouveau bloc core/query-pagination-numbers

  • next/src/components/core/QueryPaginationNumbers/ — réimplémente l'algorithme paginate_links() de WordPress (fenêtre midSize autour de la page courante + ), en consommant currentPage, totalPages, baseUri.
  • Enregistré dans Blocks.tsx.

Threading du contexte request-time

  • Nouveau type BlockDataContext (page, baseUri, innerBlocks) dans typings.d.ts.
  • page (route /page/{n}) + baseUri (uri du node) propagés via formatBlocksJSON / enrichTemplateBlocksgetBlockFinalComponentPropsgetData (4ᵉ argument, rétro-compatible).
  • Header X-Query-Page supprimé de get-node-by-uri.ts.

core/query data layer

  • Offset calculé depuis la page de route ((page-1)*perPage) → les articles affichés changent selon /page/{n}.
  • Injecte dans ses innerBlocks de pagination : href/label/isDisabled (next/previous) et currentPage/totalPages/baseUri (numbers). Logique identique à l'ancien PHP.
  • Les core/query imbriqués sont laissés intacts.

getBlockFinalComponentProps

  • Les innerBlocks retournés par getData sont désormais ré-enrichis par le même pipeline, pour que tout bloc dynamique imbriqué (pagination dans une query, navigation dans un submenu) résolve son propre getData.

Suppression du mécanisme redondant

  • wordpress/theme/includes/graphql/query-pagination-offset.php supprimé + son require retiré de _loader.php. Une seule source de vérité.

Notes

  • QueryPaginationNumbers est volontairement non-stylé, par cohérence avec les blocs next/previous (à styler par projet).
  • baseUri provient de l'uri du node résolu. Si la query loop vit dans un template FSE (source sans uri), il retombe sur / — limitation partagée avec next/previous.

Validation

  • tsc --noEmit : ✅
  • eslint (fichiers modifiés) : seules des erreurs no-explicit-any pré-existantes subsistent, aucune introduite.
  • php -l sur _loader.php : ✅

🤖 Generated with Claude Code

Move core/query pagination resolution out of the build-time FSE template
snapshot and the PHP `X-Query-Page` mechanism into the Next data layer, so
pagination stays in sync when posts are published without a rebuild.

- Add the `core/query-pagination-numbers` block: replicates WordPress
  `paginate_links()` (mid-size window + `…` dots), consuming `currentPage`,
  `totalPages` and `baseUri`.
- Thread the current `/page/{n}` route + node base uri through the block
  enrichment pipeline (formatBlocksJSON / enrichTemplateBlocks →
  getBlockFinalComponentProps → getData) via a new `BlockDataContext`.
- `core/query` data layer now derives the offset from the route page and
  injects href/label/isDisabled (next/previous) and currentPage/totalPages/
  baseUri (numbers) into its pagination children.
- Re-enrich getData-returned innerBlocks so dynamic blocks nested inside a
  query (or navigation submenu) still resolve their own getData.
- Remove the superseded `query-pagination-offset.php` and its loader require.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@charl0tee
charl0tee requested review from kuuak and snugglejuice July 29, 2026 11:58
@charl0tee

Copy link
Copy Markdown
Contributor Author

@kuuak @snugglejuice Fait avec Claude, et ça fonctionne sur Tipee. Mais volontiers si vous avez un peu de temps de checker quand même, pour s'assurer que j'ai pas loupé un soucis obvious ;)

@charl0tee
charl0tee marked this pull request as draft July 29, 2026 13:05
@charl0tee
charl0tee marked this pull request as ready for review July 29, 2026 13:15

@kuuak kuuak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça me semble ok, si ça fonctionne sur Tipee c'est certainement une bonne implémentation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants