Сен 07 2008
Автоматическое создание Sitemap в CakePHP
В Пекарне CakePHP появилась статья с примерами кода для автоматического создания карты сайта в любом проекте. Предлагаю здесь ее перевод.
Чем большее распространение получает CakePHP, чем больше сайтов использует эту платформу, тем чаще возникает необходимость в автоматическом создании и обновлении sitemap’ов. Предлагаю простое сочетание вида и контроллера для оповещения пользователей и поисковых машин о новом контенте на вашем сайта.
Хотя sitemap’ы и не обязательны, но поддерживаются уже почти всеми поисковиками. С помощью CakePHP можно создавать их автоматически. Такие карты будут всегда самыми свежими и отражать весь контент, представленный на сайте. Это помогает быстрее достичь первых строк выдачи поисковиков.
Сначала необходимо определиться, какой контент будет отражаться в карте сайта. Например, если сайт состоит из статей и комментариев, то в карту надо включить ссылки на все статьи и страницы с комментариями. Примеры кода я буду приводить для двух моделей — Page, содержащей статические страницы и Post — содержащей комментарии пользователей.
Создаем контроллер /app/controllers/sitemaps_controller.php:
<?php
class SitemapsController extends AppController{var $name = ‘Sitemaps’;
var $uses = array(’Page’, ‘Post’);
var $helpers = array(’Time’);
var $components = array(’RequestHandler’);function index (){
$this->set(’posts’, $this->Post->find(’all’, array( ‘conditions’ => array(’is_published’=>1,’is_public’=>’1′), ‘fields’ => array(’date_modified’,'id’))));
$this->set(’pages’, $this->Page->find(’all’, array( ‘conditions’ => array(’ispublished’ => 1 ), ‘fields’ => array(’date_modified’,'id’,'url’))));
//обязательно отключаем отладку, иначе получится невалидный xml-код и поисковики не смогут его обработать
Configure::write (’debug’, 0);
}
}
?>
Затем, вместо использования макета по-умолчанию, создаем отдельный макет для xml-вывода /app/views/layouts/xml/default.ctp:
<?php header(’Content-type: text/xml’); ?>
<?php echo $content_for_layout; ?>
Создаем вид /app/views/sitemaps/xml/index.ctp:
<urlset xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd” xmlns=”http://www.sitemaps.org/schemas/sitemap/0.9″>
<url>
<loc><?php echo Router::url(’/',true); ?></loc>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<!– cтатичные страницы –>
<?php foreach ($pages as $post):?>
<url>
<loc><?php echo Router::url(’/’.$post['Page']['url'],true); ?></loc>
<lastmod><?php echo $time->toAtom($post['Page']['date_modified']); ?></lastmod>
<priority>0.8</priority>
</url>
<?php endforeach; ?>
<!– комментарии–>
<?php foreach ($posts as $post):?>
<url>
<loc><?php echo Router::url(array(’controller’=>’posts’,'action’=>’view’,'id’=>$post['Post']['id']),true); ?></loc>
<lastmod><?php echo $time->toAtom($post['Post']['date_modified']); ?></lastmod>
<priority>0.8</priority>
</url>
<?php endforeach; ?>
</urlset>
Обратите внимание на использование класса Router для получения полного URL с именем домена сайта для каждой страницы. Также заметьте где я выводил информацию о контенте, полученную из моделей.
Теперь научим CakePHP воспринимать расширение xml и перенаправлять на функцию соответствующую имени запрошенного файла с этим расширением. Например, чтобы при запросе файла /sitemaps/index.xml был обработан вид /views/sitemaps/xml/index.ctp. Добавляем всего одну строчку в файл /app/config/routes.php:
Router::parseExtensions(’rss’,'xml’);
Ну и для пущей красоты, чтобы карта выдавалась по запросу http://ваш_домен/sitemap.xml, добавляем еще одну строку в тот же файл:
Router::connect(’/sitemap’, array(’controller’ => ’sitemaps’, ‘action’ => ‘index’));
Вот и все.
Несколько замечаний. Благодаря использованию класса Router, данный код может обслуживать сразу несколько доменов и создавать правильные карты для них всех. Код достаточно простой и его легко использовать в любых приложениях. Этот способ создания карт сайта подходит только для небольших и средних сайтов, с количеством страниц менее 50000. Для больших сайтов необходимо проводить оптимизации по скорости, потребляемой памяти, внедрять механизмы кеширования.