Enhanced Sorting by Nested Meta Values in Pages (#681)

* Added functionality for sorting pages by nested meta values.

* Additional variables removed.

* Added comment to the config template file about the possibility to access nested metadata with a dot as separator for sorting.

* Added entry in the changelog about the possibility to access nested metadata with a dot as separator for sorting.

* Changelog and config template adapted according to the suggestions.

* Added old entry back in the Config template.
This commit is contained in:
Max P 2023-12-02 14:35:38 +01:00 committed by GitHub
parent 0fa644e64b
commit 869ab1f2e0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 4 deletions

View file

@ -32,6 +32,8 @@ Released: -
now receive the (optional) `$pageId` argument for the new `%page_*%`
Markdown placeholders
* [New] Add `page()` Twig function to access a page's data
* [New] Enhance `pages_order_by_meta` functionality to allow sorting by
nested meta values using '.' notation (e.g., 'author.info')
* [Changed] ! Pico now requires PHP 7.2.5 or later (this includes full PHP 8
support, also see #528, #534, #608)
* [Changed] ! Pico now depends on Twig 3.3, skipping Twig 2.x altogether; this

View file

@ -31,6 +31,7 @@ twig_config: # Twig template engine config
date_format: "%D %T" # Pico's default date format;
# See https://php.net/manual/en/function.strftime.php for more info
pages_order_by_meta: author # Sort pages by meta value "author" (set "pages_order_by" to "meta")
# Use '.' notation for nested meta keys (e.g. 'author.info')
pages_order_by: alpha # Change how Pico sorts pages ("alpha" for alphabetical order, "date", or "meta")
pages_order: asc # Sort pages in ascending ("asc") or descending ("desc") order
content_dir: ~ # The path to Pico's content directory

View file

@ -1877,11 +1877,18 @@ class Pico
if ($orderBy === 'meta') {
// sort by arbitrary meta value
$orderByMeta = $this->getConfig('pages_order_by_meta');
uasort($this->pages, function ($a, $b) use ($alphaSortClosure, $order, $orderByMeta) {
$aSortValue = isset($a['meta'][$orderByMeta]) ? $a['meta'][$orderByMeta] : null;
$aSortValueNull = ($aSortValue === null);
$orderByMetaKeys = explode('.', $orderByMeta);
$bSortValue = isset($b['meta'][$orderByMeta]) ? $b['meta'][$orderByMeta] : null;
uasort($this->pages, function ($a, $b) use ($alphaSortClosure, $order, $orderByMetaKeys) {
$aSortValue = $a['meta'];
$bSortValue = $b['meta'];
foreach ($orderByMetaKeys as $key) {
$aSortValue = isset($aSortValue[$key]) ? $aSortValue[$key] : null;
$bSortValue = isset($bSortValue[$key]) ? $bSortValue[$key] : null;
}
$aSortValueNull = ($aSortValue === null);
$bSortValueNull = ($bSortValue === null);
$cmp = 0;