Автоматизация: перекладываем работу на Google XML Sitemaps
Продолжение цикла статей на тему генерации карты сайта в HTML из карты XML.
В данной статье будет рассмотрен вопрос модификации плагина Google XML Sitemaps с целью добавления поддержки автоматической генерации HTML-версии карты сайта; как и в предыдущих статьях, преобразование будет осуществляться средствами XSL.
В первой части статьи мы рассматривали вариант, основанный на использовании утилиты xsltproc
. Предполагалось, что генерация HTML-версии карты сайта осуществляется с использованием cron
. Создание карты по расписанию означает, что построение HTML-карты будет запаздывать на некоторое время; а если не сравнивать время модификации XML- и HTML-версий карт, получим бесполезные вызовы xsltproc
.
Те, кто используют WordPress, очень часто для автоматического построения карты сайта используют плагин Google XML Sitemaps; для них предлагается вариант с модификацией кода плагина для автоматической генерации HTML-карты.
Плагин позволяет задавать свою таблицу стилей XSLT:
Мы изменим плагин таким образом, чтобы при заданной таблице стилей XSL плагин создавал HTML-файл с результатами преобразований XSL.
В файле sitemap-core.php
ищем такой кусок кода:
- if($this->GetOption("b_xml")) {
- if($this->_fileHandle && fclose($this->_fileHandle)) {
- $this->_fileHandle = null;
- $status->EndXml(true);
- $pingUrl=$this->GetXmlUrl();
- } else $status->EndXml(false,"Could not close the sitemap file.");
После него добавляем такой:
$file = $this->GetXmlPath();
$styleSheet = ($this->GetDefaultStyle() && $this->GetOption('b_style_default') === true ? $this->GetDefaultStyle() : $this->GetOption('b_style'));
if (!empty($styleSheet)) {
$xsl = new DOMDocument();
$xsl->load($styleSheet);
$xml = new DOMDocument();
$xml->load($file);
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
$proc->transformToURI($xml, 'file://' . str_replace('.xml', '.html', $file));
}
}
Данный код требует PHP 5 и расширения XSLT (в Debian/Ubuntu оно предоставляется пакетом php5-xsl
). Код получает имя файла с картой сайта и адрес таблицы стилей (этот адрес должен быть задан абсолютным URL); XML и XSL скармливаются XSLT Processor’у, результат записывается в файл с тем же именем, что и карта сайта XML, но с расширением .html
.
Теперь при каждом построении карты сайта будет создаваться и HTML-версия.
Тем, кто любит патчи (патч кумулятивный, исправляет и некоторые другие недостатки плагина):
+++ sitemap-core.php 2010-11-28 02:10:08.000000000 +0200
@@ -1654,9 +1654,9 @@
$this->AddElement(new GoogleSitemapGeneratorXmlEntry('<' . '?xml-stylesheet type="text/xsl" href="' . $styleSheet . '"?' . '>'));
}
- $this->AddElement(new GoogleSitemapGeneratorDebugEntry("generator=\"wordpress/" . get_bloginfo('version') . "\""));
- $this->AddElement(new GoogleSitemapGeneratorDebugEntry("sitemap-generator-url=\"http://www.arnebrachhold.de\" sitemap-generator-version=\"" . $this->GetVersion() . "\""));
- $this->AddElement(new GoogleSitemapGeneratorDebugEntry("generated-on=\"" . date(get_option("date_format") . " " . get_option("time_format")) . "\""));
+// $this->AddElement(new GoogleSitemapGeneratorDebugEntry("generator=\"wordpress/" . get_bloginfo('version') . "\""));
+// $this->AddElement(new GoogleSitemapGeneratorDebugEntry("sitemap-generator-url=\"http://www.arnebrachhold.de\" sitemap-generator-version=\"" . $this->GetVersion() . "\""));
+// $this->AddElement(new GoogleSitemapGeneratorDebugEntry("generated-on=\"" . date(get_option("date_format") . " " . get_option("time_format")) . "\""));
//All comments as an asso. Array (postID=>commentCount)
$comments=($this->GetOption("b_prio_provider")!=""?$this->GetComments():array());
@@ -2172,6 +2172,22 @@
$status->EndXml(true);
$pingUrl=$this->GetXmlUrl();
} else $status->EndXml(false,"Could not close the sitemap file.");
+
+ if (class_exists('XSLTProcessor', true)) {
+ $file = $this->GetXmlPath();
+ $styleSheet = ($this->GetDefaultStyle() && $this->GetOption('b_style_default') === true ? $this->GetDefaultStyle() : $this->GetOption('b_style'));
+ if (!empty($styleSheet)) {
+ $xsl = new DOMDocument();
+ $xsl->load($styleSheet);
+
+ $xml = new DOMDocument();
+ $xml->load($file);
+
+ $proc = new XSLTProcessor();
+ $proc->importStyleSheet($xsl);
+ $proc->transformToURI($xml, 'file://' . str_replace('.xml', '.html', $file));
+ }
+ }
}
if($this->IsGzipEnabled()) {
@@ -2514,9 +2530,9 @@
* @return int The time in seconds
*/
function GetTimestampFromMySql($mysqlDateTime) {
- list($date, $hours) = split(' ', $mysqlDateTime);
- list($year,$month,$day) = split('-',$date);
- list($hour,$min,$sec) = split(':',$hours);
+ list($date, $hours) = explode(' ', $mysqlDateTime);
+ list($year,$month,$day) = explode('-',$date);
+ list($hour,$min,$sec) = explode(':',$hours);
return mktime(intval($hour), intval($min), intval($sec), intval($month), intval($day), intval($year));
}
© 2014 सत्यं वद धर्मं चर. Все права защищены. Перепубликация материалов без разрешения автора запрещена.
При использовании материалов блога наличие активной не закрытой от индексирования ссылки на источник обязательно.