68 lines
2.0 KiB
Plaintext
68 lines
2.0 KiB
Plaintext
|
title: Sitemap
|
||
|
---
|
||
|
summary: Quick demo of how to build a custom sitemap.xml.
|
||
|
---
|
||
|
body:
|
||
|
|
||
|
If you want to have a `sitemap.xml` file for search engines this is something
|
||
|
you can very easily create yourself. All you need for that is a contents file
|
||
|
and a custom template.
|
||
|
|
||
|
## Contents File
|
||
|
|
||
|
First we need to create a contents file. Since `sitemap.xml` always goes
|
||
|
into the same location we create a folder called `sitemap.xml` inside our
|
||
|
`content` folder and add a `contents.lr` file with the following data:
|
||
|
|
||
|
```
|
||
|
_template: sitemap.xml
|
||
|
----
|
||
|
_model: none
|
||
|
```
|
||
|
|
||
|
This instructs Lektor to use the template `sitemap.xml` for this page. We
|
||
|
also give it the empty `none` model for good measure.
|
||
|
|
||
|
## Template File
|
||
|
|
||
|
The template loaded will be `templates/sitemap.xml`. In this file we just
|
||
|
iterate over all pages of the site recursively. This also automatically
|
||
|
skips hidden pages so those will not be generated out.
|
||
|
|
||
|
```xml+jinja
|
||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||
|
{%- for page in [site.root] if page != this recursive %}
|
||
|
<url><loc>{{ page|url(external=true) }}</loc></url>
|
||
|
{{- loop(page.children) }}
|
||
|
{%- endfor %}
|
||
|
</urlset>
|
||
|
```
|
||
|
|
||
|
Note that because sitemaps need to have external URLs (with scheme and
|
||
|
everything) you will need to configure the `url` of the site before the
|
||
|
template starts working. For more information see [Project File
|
||
|
:ref](../../project/)
|
||
|
|
||
|
## Human Readable Sitemap
|
||
|
|
||
|
But what if you want a beautiful sitemap as a tree for human reading? This is
|
||
|
not any harder. Instead of making a `sitemap.xml/contents.lr` file just
|
||
|
create a `sitemap/contents.lr` file instead and use a template like
|
||
|
`sitemap.html`. Then use something like this:
|
||
|
|
||
|
```html+jinja
|
||
|
{% extends "layout.html" %}
|
||
|
{% block title %}Sitemap{% endblock %}
|
||
|
{% block body %}
|
||
|
<ul class="sitemap">
|
||
|
{% for page in [site.root] recursive if page.record_label %}
|
||
|
<li><a href="{{ page|url }}">{{ page.record_label }}</a>
|
||
|
{% if page.children %}
|
||
|
<ul>{{ loop(page.children) }}</ul>
|
||
|
{% endif %}
|
||
|
{% endfor %}
|
||
|
</ul>
|
||
|
{% endblock %}
|
||
|
```
|