diff --git a/index.php b/index.php
index 83e4ab7..e300591 100644
--- a/index.php
+++ b/index.php
@@ -17,23 +17,59 @@
// (Popeye-style) while keeping the other plugins in the right sidebar.
// Mirrors Bludit's own Theme::plugins() loop, but captures the output.
global $plugins;
- $sidebarSearchHtml = '';
- $sidebarOtherHtml = '';
+ $sidebarSearchHtml = ''; // search box, rendered under the hero on the homepage
+ $sidebarItems = array(); // every sidebar plugin, to be sorted into a fixed order
+ $sidebarIndex = 0;
if (isset($plugins['siteSidebar'])) {
foreach ($plugins['siteSidebar'] as $plugin) {
$out = $plugin->siteSidebar();
- if (strpos($out, 'plugin-search') !== false) {
+
+ $isSearch = (strpos($out, 'plugin-search') !== false);
+ $isNav = (strpos($out, 'plugin-navigation') !== false || strpos($out, 'plugin-pages') !== false);
+
+ // Fixed sidebar order (lower = higher up). Unknown plugins such as
+ // the Hit Counter default to 90, i.e. pinned to the bottom.
+ $priority = 90;
+ if (strpos($out, 'plugin-about') !== false) $priority = 10; // Blog / About
+ elseif ($isSearch) $priority = 20; // Search
+ elseif ($isNav) $priority = 30; // Navigation
+ elseif (strpos($out, 'plugin-categories') !== false) $priority = 40; // Category
+
+ if ($isSearch) {
$sidebarSearchHtml .= $out;
- } else {
- // Mark the navigation / pages plugin so its list can be
- // shuffled client-side (see the script near the body end).
- if (strpos($out, 'plugin-navigation') !== false || strpos($out, 'plugin-pages') !== false) {
- $out = '
' . $out . '
';
- }
- $sidebarOtherHtml .= $out;
}
+ // Mark the navigation / pages plugin so its list can be shuffled
+ // client-side (see the script near the body end).
+ if ($isNav) {
+ $out = '
' . $out . '
';
+ }
+
+ $sidebarItems[] = array(
+ 'priority' => $priority,
+ 'index' => $sidebarIndex++,
+ 'search' => $isSearch,
+ 'html' => $out,
+ );
}
}
+
+ // Stable sort by priority, then original order (PHP < 8 usort isn't stable).
+ usort($sidebarItems, function ($a, $b) {
+ if ($a['priority'] === $b['priority']) {
+ return $a['index'] - $b['index'];
+ }
+ return $a['priority'] - $b['priority'];
+ });
+
+ $sidebarFullHtml = ''; // all plugins, ordered (used off the homepage)
+ $sidebarNoSearchHtml = ''; // same, minus search (used on the homepage)
+ foreach ($sidebarItems as $item) {
+ $sidebarFullHtml .= $item['html'];
+ if (!$item['search']) {
+ $sidebarNoSearchHtml .= $item['html'];
+ }
+ }
+
// The hero (and the relocated search) only appear on the blog front page.
$heroVisible = ($WHERE_AM_I === 'home' && Paginator::currentPage() == 1);
?>
diff --git a/php/head.php b/php/head.php
index dcd338c..3034208 100644
--- a/php/head.php
+++ b/php/head.php
@@ -36,8 +36,12 @@
-
-
+
+
+
diff --git a/php/sidebar.php b/php/sidebar.php
index b14bd46..827cf10 100644
--- a/php/sidebar.php
+++ b/php/sidebar.php
@@ -18,13 +18,14 @@
Search > Navigation > Category > … > Hit Counter (bottom)
+ // On the homepage front page the search box is shown under the hero, so
+ // it is omitted from the sidebar there.
if ($heroVisible) {
- echo $sidebarOtherHtml;
+ echo $sidebarNoSearchHtml;
} else {
- echo $sidebarSearchHtml . $sidebarOtherHtml;
+ echo $sidebarFullHtml;
}
?>