SMF Support > SMF 2.0.x Support

Sitemap for 2.0

(1/2) > >>

Owdy:
Has anyomne updated [Unknown]'s sitemap for SMF 2.0?


--- Code: ---<?php

require_once('SSI.php');

if ($modSettings['smfVersion'] < '1.1')
ob_start('ob_sessrewrite');

header('Content-Type: text/plain');

echo '<?xml version="1.0" encoding="UTF-8"?' . '>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">';

$request = db_query("
SELECT posterTime
FROM {$db_prefix}messages
WHERE ID_MSG >= " . ($modSettings['maxMsgID'] - 30) . "
ORDER BY ID_MSG DESC
LIMIT 10", __FILE__, __LINE__);
$latest_post_times = array(time());
while ($row = mysql_fetch_assoc($request))
$latest_post_times[] = $row['posterTime'];
mysql_free_result($request);

$request = db_query("
SELECT ID_BOARD
FROM {$db_prefix}boards", __FILE__, __LINE__);
$boards = array();
while ($row = mysql_fetch_assoc($request))
{
$request2 = db_query("
SELECT posterTime
FROM {$db_prefix}messages
WHERE ID_BOARD = $row[ID_BOARD]" . ($modSettings['totalMessages'] > 100000 ? "
AND ID_MSG >= " . ($modSettings['maxMsgID'] * 0.5) : '') . "
ORDER BY ID_MSG DESC
LIMIT 10", __FILE__, __LINE__);
$board_post_times = array(time());
while ($row2 = mysql_fetch_assoc($request2))
$board_post_times[] = $row2['posterTime'];
mysql_free_result($request2);

$boards[] = array(
'id' => $row['ID_BOARD'],
'times' => $board_post_times,
);
}
mysql_free_result($request);

$request = db_query("
SELECT ID_TOPIC
FROM {$db_prefix}topics
ORDER BY numViews + numReplies DESC
LIMIT 20", __FILE__, __LINE__);
$topics = array();
while ($row = mysql_fetch_assoc($request))
{
$request2 = db_query("
SELECT posterTime
FROM {$db_prefix}messages
WHERE ID_TOPIC = $row[ID_TOPIC]
ORDER BY ID_MSG DESC
LIMIT 10", __FILE__, __LINE__);
$topic_post_times = array(time());
while ($row2 = mysql_fetch_assoc($request2))
$topic_post_times[] = $row2['posterTime'];
mysql_free_result($request2);

$topics[] = array(
'id' => $row['ID_TOPIC'],
'times' => $topic_post_times,
);
}
mysql_free_result($request);

$request = db_query("
SELECT ID_MEMBER
FROM {$db_prefix}members
ORDER BY totalTimeLoggedIn DESC
LIMIT 20", __FILE__, __LINE__);
$members = array();
while ($row = mysql_fetch_assoc($request))
{
$request2 = db_query("
SELECT posterTime
FROM {$db_prefix}messages
WHERE ID_MEMBER = $row[ID_MEMBER]" . ($modSettings['totalMessages'] > 100000 ? "
AND ID_MSG >= " . ($modSettings['maxMsgID'] * 0.5) : '') . "
ORDER BY ID_MSG DESC
LIMIT 10", __FILE__, __LINE__);
$member_post_times = array(time());
while ($row2 = mysql_fetch_assoc($request2))
$member_post_times[] = $row2['posterTime'];
mysql_free_result($request2);

$members[] = array(
'id' => $row['ID_MEMBER'],
'times' => $member_post_times,
);
}
mysql_free_result($request);

// First, the forum URL.  Highest priority!
echo '
<url>
<loc>', $scripturl, '</loc>
<lastmod>', posts_max_time($latest_post_times), '</lastmod>
<changefreq>', posts_to_freq($latest_post_times), '</changefreq>
<priority>1.0</priority>
</url>';

// Now the boards!
foreach ($boards as $board)
{
echo '
<url>
<loc>', $scripturl, '?board=', $board['id'], '.0</loc>
<lastmod>', posts_max_time($board['times']), '</lastmod>
<changefreq>', posts_to_freq($board['times']), '</changefreq>
<priority>', posts_to_priority(0.8, $board['times']), '</priority>
</url>';
}

// Popular topics too...
foreach ($topics as $topic)
{
echo '
<url>
<loc>', $scripturl, '?topic=', $topic['id'], '.0</loc>
<lastmod>', posts_max_time($topic['times']), '</lastmod>
<changefreq>', posts_to_freq($topic['times']), '</changefreq>
<priority>', posts_to_priority(0.7, $board['times']), '</priority>
</url>';
}


echo '
</urlset>';

function posts_max_time($post_times)
{
if (empty($post_times) || count($post_times) == 1)
return gmstrftime('%Y-%m-%dT%H:%M:%S+00:00', time() - 3600 * 24 * 10);

return gmstrftime('%Y-%m-%dT%H:%M:%S+00:00', max($post_times));
}

function posts_to_priority($base, $post_times)
{
if (empty($post_times) || count($post_times) == 1)
return sprintf('%1.1f', $base);

$s = (max($post_times) - min($post_times)) / count($post_times);

if ($s < 3600 * 24)
$mod = 0.1;
else
$mod = 0;

return sprintf('%1.1f', $base + $mod);
}

function posts_to_freq($post_times)
{
if (empty($post_times) || count($post_times) == 1)
return 'yearly';

$s = (max($post_times) - min($post_times)) / count($post_times);

// Changes more often than every hour.
if ($s < 3600)
return 'always';
elseif ($s < 3600 * 12)
return 'hourly';
elseif ($s < 3600 * 24 * 4)
return 'daily';
else
return 'monthly';
}

?>
--- End code ---

I belive that db_query part is changed?

Owdy:
Sorry, but bump.

metallica48423:
theres a bit more to it than that.

If i can get some time i might take a crack at rewriting it, but i'm very busy being lazy at the moment :P

Owdy:
Ok, thanks M!

rsw686:
I rewrote it for my SMF 2.0 Beta 3 forum. The first version was just a rewrite, which builds it on the fly, and the second was a package, which builds the sitemap using the scheduled tasks to save resources.

http://wgnrs.dynalias.com/smf2/sitemap.php
http://wgnrs.dynalias.com/smf2/sitemap_1.0.zip

Navigation

[0] Message Index

[#] Next page

Go to full version