Michael Foster
11 years ago
3 changed files with 100 additions and 0 deletions
@ -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'; |
@ -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 %} |
@ -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…
Reference in new issue