Browse Source

New theme: XML sitemap generator

pull/40/head
Michael Foster 11 years ago
parent
commit
7e95e80c25
  1. 53
      templates/themes/sitemap/info.php
  2. 19
      templates/themes/sitemap/sitemap.xml
  3. 28
      templates/themes/sitemap/theme.php

53
templates/themes/sitemap/info.php

@ -0,0 +1,53 @@
<?php
$theme = Array();
// Theme name
$theme['name'] = 'Sitemap Generator';
// Description (you can use Tinyboard markup here)
$theme['description'] = 'Generates an XML sitemap to help search engines find all threads and pages.';
$theme['version'] = 'v1.0';
// Theme configuration
$theme['config'] = Array();
$theme['config'][] = Array(
'title' => 'Sitemap Path',
'name' => 'path',
'type' => 'text',
'default' => 'sitemap.xml',
'size' => '20'
);
$theme['config'][] = Array(
'title' => 'URL prefix',
'name' => 'url',
'type' => 'text',
'comment' => '(with trailing slash)',
'default' => 'http://' . $_SERVER['HTTP_HOST'] . $config['root'],
'size' => '20'
);
$theme['config'][] = Array(
'title' => 'Thread change frequency',
'name' => 'changefreq',
'type' => 'text',
'comment' => '(eg. "hourly", "daily", etc.)',
'default' => 'hourly',
'size' => '20'
);
$__boards = listBoards();
$__default_boards = Array();
foreach ($__boards as $__board)
$__default_boards[] = $__board['uri'];
$theme['config'][] = Array(
'title' => 'Boards',
'name' => 'boards',
'type' => 'text',
'comment' => '(boards to include; space seperated)',
'size' => 24,
'default' => implode(' ', $__default_boards)
);
$theme['build_function'] = 'sitemap_build';

19
templates/themes/sitemap/sitemap.xml

@ -0,0 +1,19 @@
{% filter remove_whitespace %}
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for board in boards %}
<url>
<loc>{{ settings.url ~ (config.board_path | format(board)) ~ config.file_index }}</loc>
</url>
{% endfor %}
{% for board, thread_list in threads %}
{% for thread in thread_list %}
<url>
<loc>{{ settings.url ~ (config.board_path | format(board)) ~ config.dir.res ~ (config.file_page | format(thread.thread_id)) }}</loc>
<lastmod>{{ thread.lastmod | date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}</lastmod>
<changefreq>{{ settings.changefreq }}</changefreq>
</url>
{% endfor %}
{% endfor %}
</urlset>
{% endfilter %}

28
templates/themes/sitemap/theme.php

@ -0,0 +1,28 @@
<?php
require 'info.php';
function sitemap_build($action, $settings) {
global $config;
// Possible values for $action:
// - all (rebuild everything, initialization)
// - news (news has been updated)
// - boards (board list changed)
// - post (a post has been made)
$boards = explode(' ', $settings['boards']);
$threads = array();
foreach ($boards as $board) {
$query = query(sprintf("SELECT `id` AS `thread_id`, (SELECT `time` FROM `posts_%s` WHERE `thread` = `thread_id` OR `id` = `thread_id` ORDER BY `time` DESC LIMIT 1) AS `lastmod` FROM `posts_%s` WHERE `thread` IS NULL", $board, $board)) or error(db_error());
$threads[$board] = $query->fetchAll(PDO::FETCH_ASSOC);
}
file_write($settings['path'], Element('themes/sitemap/sitemap.xml', Array(
'settings' => $settings,
'config' => $config,
'threads' => $threads,
'boards' => $boards,
)));
}
Loading…
Cancel
Save