From b47d4a02ca75e22ef5f140a60cb745750c68ff3b Mon Sep 17 00:00:00 2001 From: Lee Willis Date: Wed, 23 Oct 2024 12:16:11 +0100 Subject: [PATCH 1/3] Support for manually adding items to the sitemap --- src/Http/Controllers/AltSitemapController.php | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/Http/Controllers/AltSitemapController.php b/src/Http/Controllers/AltSitemapController.php index 8e54b71..145f98f 100644 --- a/src/Http/Controllers/AltSitemapController.php +++ b/src/Http/Controllers/AltSitemapController.php @@ -4,9 +4,15 @@ use Illuminate\Support\Facades\Response; use Statamic\Facades\Entry; use AltDesign\AltSitemap\Helpers\Data; +use Carbon\Carbon; class AltSitemapController { + /** + * @var array + */ + private $manualItems = []; + public function index() { $data = new Data('settings'); @@ -35,6 +41,28 @@ public function update(Request $request) return true; } + /** + * Add an explicit item to the sitemap. + * + * @param array $item + * + * @return void + */ + public function registerItem(array $item) { + $this->manualItems[] = $item; + } + + /** + * @param array $items + * + * @return void + */ + public function registerItems(array $items) { + foreach ($items as $item) { + $this->registerItem($item); + } + } + public function generateSitemap(Request $request) { //get blueprint setting values @@ -86,6 +114,16 @@ public function generateSitemap(Request $request) $items[] = array($entry->url, $entry->lastModified()->format('Y-m-d\TH:i:sP'), $priority); } + foreach ($this->manualItems as $manualItem) { + $url = $manualItem[0] ?? null; + if (empty($url)) { + continue; + } + $lastModified = $manualItem[1] ?? \Carbon\Carbon::now(); + $priority = $manualItem[2] ?? 0.5; + $items[] = [$url, $lastModified, $priority]; + } + $xml = ''; $xml .= ''; foreach ($items as $item) { From 8abf9e4dc46a7e75c284a5c7d1815fa9ac43517b Mon Sep 17 00:00:00 2001 From: Lee Willis Date: Wed, 23 Oct 2024 17:42:40 +0100 Subject: [PATCH 2/3] Initial work on taxonomy support --- resources/blueprints/settings.yaml | 56 +++++++++ src/Http/Controllers/AltSitemapController.php | 119 ++++++++++++++---- 2 files changed, 154 insertions(+), 21 deletions(-) diff --git a/resources/blueprints/settings.yaml b/resources/blueprints/settings.yaml index de839e0..0c3a81c 100644 --- a/resources/blueprints/settings.yaml +++ b/resources/blueprints/settings.yaml @@ -61,3 +61,59 @@ tabs: field: type: collections display: 'Exclude Collections from Sitemap' + - + handle: default_taxonomy_priorities + field: + collapse: false + previews: true + fullscreen: true + sets: + new_set_group: + display: 'New Set Group' + instructions: null + icon: null + sets: + taxonomy_priority: + display: 'Taxonomy Priority' + instructions: null + icon: null + fields: + - + handle: taxonomy + field: + max_items: 1 + mode: select + type: taxonomies + display: Taxonomy + icon: taxonomies + listable: hidden + instructions_position: above + visibility: visible + replicator_preview: true + hide_display: false + - + handle: priority + field: + type: float + display: Priority + instructions: 'From 0.0 (lowest priority) to 1.0 (highest priority)' + listable: hidden + instructions_position: above + visibility: visible + replicator_preview: true + hide_display: false + type: replicator + display: 'Default taxonomy priorities' + icon: replicator + instructions: 'Select a taxonomy and add a default sitemap priority for all terms in the taxonomy.' + listable: hidden + instructions_position: above + visibility: visible + replicator_preview: true + hide_display: false + - + handle: exclude_taxonomies_from_sitemap + field: + mode: select + type: taxonomies + display: 'Exclude Taxonomies from Sitemap' diff --git a/src/Http/Controllers/AltSitemapController.php b/src/Http/Controllers/AltSitemapController.php index 145f98f..be35bd7 100644 --- a/src/Http/Controllers/AltSitemapController.php +++ b/src/Http/Controllers/AltSitemapController.php @@ -5,6 +5,9 @@ use Statamic\Facades\Entry; use AltDesign\AltSitemap\Helpers\Data; use Carbon\Carbon; +use Statamic\Facades\Term; +use function in_array; +use function url; class AltSitemapController { @@ -13,6 +16,15 @@ class AltSitemapController */ private $manualItems = []; + /** + * @var string + */ + private $site_url = ''; + + public function __construct() { + $this->site_url = url(''); + } + public function index() { $data = new Data('settings'); @@ -69,51 +81,108 @@ public function generateSitemap(Request $request) $data = new Data('settings'); $blueprint = $data->getBlueprint(true); $fields = $blueprint->fields()->addValues($data->all())->preProcess(); + + $xml = ''; + $xml .= ''; + $xml .= $this->generateEntries($fields); + $xml .= $this->generateTaxonomies($fields); + $xml .= $this->generateManualItems(); + $xml .= ''; + + return Response::make($xml, 200, ['Content-Type' => 'application/xml']); + } + + private function generateEntries($fields) { $defaultCollectionPriorities = $fields->values()->toArray()['default_collection_priorities']; $excludeCollectionFromSitemap = $fields->values()->toArray()['exclude_collections_from_sitemap']; foreach ($defaultCollectionPriorities as $value) { - $collection = $value['collection'][0]; - $priority = $value['priority']; - $settings[] = array($collection, $priority) ; + $settings[ $value['collection'][0] ] = $value['priority']; } - $site_url = url(''); $entries = Entry::all(); + $items = []; foreach ($entries as $entry) { // Skip if the entry is not published if (!$entry->published()) { continue; } - // skip if to be excluded + // Skip if to be excluded if ($entry->exclude_from_sitemap == true) { continue; } - // skip if collection is to be excluded + // Skip if collection is to be excluded if (in_array($entry->collection->handle, $excludeCollectionFromSitemap)) { continue; } - // if the collection has no route setup, skip + // If the collection has no route setup, skip if ($entry->url() === null) { continue; } - //check if entry collection matches setting[0], if so apply setting[1] as priority - $priority = 0.5; - $entryCollection = $entry->collection->handle; - foreach ($settings ?? [] as $setting) { - if ($entryCollection == $setting[0]) { - $priority = $setting[1]; - } - } - // override with priority from entry if set + // Check if entry collection matches setting[0], if so apply setting[1] as priority + $priority = $settings[ $entry->collection->handle ] ?? 0.5; + + // Override with priority from entry if set $priority = $entry->sitemap_priority ?? $priority; $items[] = array($entry->url, $entry->lastModified()->format('Y-m-d\TH:i:sP'), $priority); } + return $this->generateXmlFragments($items); + } + + /** + * @param $fields + * + * @return string + */ + private function generateTaxonomies($fields): string { + $defaultTaxonomyPriorities = $fields->values()->toArray()['default_taxonomy_priorities']; + $excludeTaxonomiesFromSitemap = $fields->values()->toArray()['exclude_taxonomies_from_sitemap']; + + foreach ($defaultTaxonomyPriorities as $value) { + $taxonomy = $value['taxonomy'][0]; + $priority = $value['priority']; + $settings[$taxonomy] = $priority ; + } + + $terms = Term::all(); + $items = []; + foreach ($terms as $term) { + // Skip if to be excluded + // if ($term->exclude_from_sitemap == true) { // FIXME + // continue; + // } + + // Skip if taxonomy is to be excluded + if (in_array($term->taxonomy->handle, $excludeTaxonomiesFromSitemap)) { + continue; + } + + // If the taxonomy has route, skip + if ($term->url() === null) { + continue; + } + + // Calculate priority. + $priority = $settings[$term->taxonomy->handle] ?? 0.5; + + // Override with priority from entry if set + // $priority = $term->sitemap_priority ?? $priority; // FIXME + $items[] = array($term->url, $term->lastModified()->format('Y-m-d\TH:i:sP'), $priority); + } + + return $this->generateXmlFragments($items); + } + + /** + * @return string + */ + private function generateManualItems(): string { + $items = []; foreach ($this->manualItems as $manualItem) { $url = $manualItem[0] ?? null; if (empty($url)) { @@ -123,13 +192,21 @@ public function generateSitemap(Request $request) $priority = $manualItem[2] ?? 0.5; $items[] = [$url, $lastModified, $priority]; } + + return $this->generateXmlFragments($items); + } - $xml = ''; - $xml .= ''; + /** + * @param array $items + * + * @return string + */ + private function generateXmlFragments($items): string { + $fragment = ''; foreach ($items as $item) { - $xml .=''.$site_url.$item[0].''.$item[1].''.$item[2].''; + $fragment .=''.$this->site_url.$item[0].''.$item[1].''.$item[2].''; } - $xml .= ''; - return Response::make($xml, 200, ['Content-Type' => 'application/xml']); + + return $fragment; } } From 474e89c67eb988287f70f0e8bd90c90ab8f26efa Mon Sep 17 00:00:00 2001 From: Lee Willis Date: Tue, 29 Oct 2024 11:54:52 +0000 Subject: [PATCH 3/3] Port lastModified format fix from other PR --- src/Http/Controllers/AltSitemapController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Controllers/AltSitemapController.php b/src/Http/Controllers/AltSitemapController.php index be35bd7..11eb460 100644 --- a/src/Http/Controllers/AltSitemapController.php +++ b/src/Http/Controllers/AltSitemapController.php @@ -188,7 +188,7 @@ private function generateManualItems(): string { if (empty($url)) { continue; } - $lastModified = $manualItem[1] ?? \Carbon\Carbon::now(); + $lastModified = $manualItem[1]->format('c') ?? \Carbon\Carbon::now()->format('c'); $priority = $manualItem[2] ?? 0.5; $items[] = [$url, $lastModified, $priority]; }