forked from wilr/silverstripe-googlesitemaps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GoogleSitemap.php
executable file
·149 lines (127 loc) · 4.47 KB
/
GoogleSitemap.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
/**
* Initial implementation of Sitemap support.
* GoogleSitemap should handle requests to 'sitemap.xml'
* the other two classes are used to render the sitemap.
*
* You can notify ("ping") Google about a changed sitemap
* automatically whenever a new page is published or unpublished.
* By default, Google is not notified, and will pick up your new
* sitemap whenever the GoogleBot visits your website.
*
* Enabling notification of Google after every publish (in your _config.php):
* <example
* GoogleSitemap::enable_google_notificaton();
* </example>
*
* @see http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=34609
*
* @package sapphire
* @subpackage misc
*/
class GoogleSitemap extends Controller {
/**
* @var boolean
*/
protected static $enabled = true;
/**
* @var DataObjectSet
*/
protected $Pages;
/**
* @var boolean
*/
protected static $google_notification_enabled = false;
public function Items() {
$this->Pages = Versioned::get_by_stage('SiteTree', 'Live');
$newPages = new DataObjectSet();
foreach($this->Pages as $page) {
// Only include pages from this host and pages which are not an instance of ErrorPage
// We prefix $_SERVER['HTTP_HOST'] with 'http://' so that parse_url to help parse_url identify the host name component; we could use another protocol (like
// 'ftp://' as the prefix and the code would work the same.
if(parse_url($page->AbsoluteLink(), PHP_URL_HOST) == parse_url('http://' . $_SERVER['HTTP_HOST'], PHP_URL_HOST) && !($page instanceof ErrorPage)) {
// If the page has been set to 0 priority, we set a flag so it won't be included
if($page->canView() && (!isset($page->Priority) || $page->Priority > 0)) {
// 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 SSDatetime();
$created->value = $properties['Created'];
$now = new SSDatetime();
$now->value = date('Y-m-d H:i:s');
$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';
} elseif($period > 60*60*24*30) { // > ~1 month
$page->ChangeFreq='monthly';
} elseif($period > 60*60*24*7) { // > 1 week
$page->ChangeFreq='weekly';
} elseif($period > 60*60*24) { // > 1 day
$page->ChangeFreq='daily';
} elseif($period > 60*60) { // > 1 hour
$page->ChangeFreq='hourly';
} else { // < 1 hour
$page->ChangeFreq='always';
}
$newPages->push($page);
}
}
}
return $newPages;
}
/**
* Notifies Google about changes to your sitemap.
* Triggered automatically on every publish/unpublish of a page.
* This behaviour is disabled by default, enable with:
* GoogleSitemap::enable_google_notificaton();
*
* If the site is in "dev-mode", no ping will be sent regardless wether
* the Google notification is enabled.
*
* @return string Response text
*/
static function ping() {
if(!self::$enabled) return false;
//Don't ping if the site has disabled it, or if the site is in dev mode
if(!GoogleSitemap::$google_notification_enabled || Director::isDev())
return;
$location = urlencode(Director::absoluteBaseURL() . '/sitemap.xml');
$response = HTTP::sendRequest("www.google.com", "/webmasters/sitemaps/ping",
"sitemap=" . $location);
return $response;
}
/**
* Enable pings to google.com whenever sitemap changes.
*/
public static function enable_google_notification() {
self::$google_notification_enabled = true;
}
/**
* Disables pings to google when the sitemap changes.
*/
public static function disable_google_notification() {
self::$google_notification_enabled = false;
}
function index($url) {
if(self::$enabled) {
SSViewer::set_source_file_comments(false);
// We need to override the default content-type
ContentNegotiator::disable();
$this->getResponse()->addHeader('Content-Type', 'application/xml; charset="utf-8"');
// But we want to still render.
return array();
} else {
return new HTTPResponse('Not allowed', 405);
}
}
public static function enable() {
self::$enabled = true;
}
public static function disable() {
self::$enabled = false;
}
}