mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
wscott: Added base code for a working Google Sitemaps support.
Changes in Files: * Sitemap.php - controller for the sitemap, new * Sitemap.ss - template for the sitemap, new * main.php - added director rule * SiteTree?.php - added 'priority' database field, cms code to override priority TODO: ping google when the sitemap is updated, namely when pages are added / removed, or when a priority is overridden git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@41689 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
285e6aa8f9
commit
5857c4cab6
80
core/control/Sitemap.php
Executable file
80
core/control/Sitemap.php
Executable file
@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Initial implementation of Sitemap support.
|
||||||
|
* SitemapController should handle requests to 'sitemap.xml'
|
||||||
|
* the other two classes are used to render the sitemap
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Sitemap extends Controller {
|
||||||
|
protected $Pages;
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
$this->Pages=DataObject::get('SiteTree');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Items()
|
||||||
|
{
|
||||||
|
foreach($this->Pages as $page)
|
||||||
|
{
|
||||||
|
// The one field that isn't easy to deal with in the template is
|
||||||
|
// Change frequency, so we set that here.
|
||||||
|
$properties = $page->toMap();
|
||||||
|
$created = new Datetime($properties['Created']);
|
||||||
|
$now = new Datetime();
|
||||||
|
$versions = $properties['Version'];
|
||||||
|
$timediff = $now->format('U') - $created->format('U');
|
||||||
|
|
||||||
|
// Check how many revisions have been made over the lifetime of the
|
||||||
|
// Page for a rough estimate of it's changing frequency.
|
||||||
|
|
||||||
|
$period = $timediff / ($versions + 1);
|
||||||
|
|
||||||
|
if($period > 60*60*24*365) // > 1 year
|
||||||
|
{
|
||||||
|
$page->ChangeFreq='yearly';
|
||||||
|
}
|
||||||
|
else if($period > 60*60*24*30) // > ~1 month
|
||||||
|
{
|
||||||
|
$page->ChangeFreq='monthly';
|
||||||
|
}
|
||||||
|
else if($period > 60*60*24*7) // > 1 week
|
||||||
|
{
|
||||||
|
$page->ChangeFreq='weekly';
|
||||||
|
}
|
||||||
|
else if($period > 60*60*24) // > 1 day
|
||||||
|
{
|
||||||
|
$page->ChangeFreq='daily';
|
||||||
|
}
|
||||||
|
else if($period > 60*60) // > 1 hour
|
||||||
|
{
|
||||||
|
$page->ChangeFreq='hourly';
|
||||||
|
}
|
||||||
|
else // < 1 hour
|
||||||
|
{
|
||||||
|
$page->ChangeFreq='always';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->Pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function Ping()
|
||||||
|
{
|
||||||
|
$location = urlencode(Director::absoluteBaseURL() . '/sitemap.xml');
|
||||||
|
|
||||||
|
$response = HTTP::sendRequest("www.google.com", "/webmasters/sitemaps/ping",
|
||||||
|
"sitemap=" . $location);
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
function index($url)
|
||||||
|
{
|
||||||
|
// We need to override the default content-type
|
||||||
|
ContentNegotiator::disable();
|
||||||
|
header('Content-type: application/xml; charset="utf-8"');
|
||||||
|
|
||||||
|
// But we want to still render.
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
@ -671,7 +671,9 @@ class SiteTree extends DataObject {
|
|||||||
new HeaderField("Search Engine Meta-tags"),
|
new HeaderField("Search Engine Meta-tags"),
|
||||||
new TextField("MetaTitle", "Title"),
|
new TextField("MetaTitle", "Title"),
|
||||||
new TextareaField("MetaDescription", "Description"),
|
new TextareaField("MetaDescription", "Description"),
|
||||||
new TextareaField("MetaKeywords", "Keywords")
|
new TextareaField("MetaKeywords", "Keywords"),
|
||||||
|
new LiteralField("", "<p>Manually specify a Priority for this page:: (valid values are from 0 to 1)</p>"),
|
||||||
|
new NumericField("Priority","Page Priority")
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
new Tab("Behaviour",
|
new Tab("Behaviour",
|
||||||
@ -990,7 +992,8 @@ class SiteTree extends DataObject {
|
|||||||
"Viewers" => "Enum('Anyone, LoggedInUsers, OnlyTheseUsers', 'Anyone')",
|
"Viewers" => "Enum('Anyone, LoggedInUsers, OnlyTheseUsers', 'Anyone')",
|
||||||
"Editors" => "Enum('LoggedInUsers, OnlyTheseUsers', 'LoggedInUsers')",
|
"Editors" => "Enum('LoggedInUsers, OnlyTheseUsers', 'LoggedInUsers')",
|
||||||
"ViewersGroup" => "Int",
|
"ViewersGroup" => "Int",
|
||||||
"EditorsGroup" => "Int"
|
"EditorsGroup" => "Int",
|
||||||
|
"Priority" => "Float"
|
||||||
);
|
);
|
||||||
|
|
||||||
static $indexes = array(
|
static $indexes = array(
|
||||||
@ -1028,7 +1031,8 @@ class SiteTree extends DataObject {
|
|||||||
"Status" => "New page",
|
"Status" => "New page",
|
||||||
"CanCreateChildren" => array(10),
|
"CanCreateChildren" => array(10),
|
||||||
"Viewers" => "Anyone",
|
"Viewers" => "Anyone",
|
||||||
"Editors" => "LoggedInUsers"
|
"Editors" => "LoggedInUsers",
|
||||||
|
"Priority" => .5
|
||||||
);
|
);
|
||||||
|
|
||||||
static $has_one = array(
|
static $has_one = array(
|
||||||
|
1
main.php
1
main.php
@ -63,6 +63,7 @@ Director::addRules(10, array(
|
|||||||
'$Controller/$Action/$ID/$OtherID' => '*',
|
'$Controller/$Action/$ID/$OtherID' => '*',
|
||||||
'images/$Action/$Class/$ID/$Field' => 'Image_Uploader',
|
'images/$Action/$Class/$ID/$Field' => 'Image_Uploader',
|
||||||
'' => 'RootURLController',
|
'' => 'RootURLController',
|
||||||
|
'sitemap.xml' => 'Sitemap',
|
||||||
));
|
));
|
||||||
|
|
||||||
Director::addRules(1, array(
|
Director::addRules(1, array(
|
||||||
|
13
templates/Sitemap.ss
Executable file
13
templates/Sitemap.ss
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84">
|
||||||
|
<% control Items %>
|
||||||
|
<url>
|
||||||
|
<loc>$AbsoluteLink</loc>
|
||||||
|
<lastmod>$LastEdited.Format(c)</lastmod>
|
||||||
|
<% if ChangeFreq %><changefreq>$ChangeFreq</changefreq><% end_if %>
|
||||||
|
<% if Priority %><priority>$Priority</priority><% end_if %>
|
||||||
|
</url>
|
||||||
|
<% end_control %>
|
||||||
|
</urlset>
|
Loading…
Reference in New Issue
Block a user