Сен 03 2008
Seo-компонент для CakePHP
При создании современных сайтов приходится обязательно учитывать особенности работы поисковых машин с контентом страниц. Во всех проектах, написанных с использованием CakePHP тоже нужно реализовывать seo-функции, хотя бы — простановку уникальных заголовков и мета-тегов для всех страниц. А поскольку обычно страницы сайта на CakePHP обрабатываются разными контроллерами, задача может стать совсем нетривиальной.
Для проектов в нашей студии используется простой SeoComponent, позволяющий автоматически загружать из базы данных в макет (layout) заголовки и мета-теги, основываясь на адресе запрошенной страницы.
<?
class SeoComponent extends Object {var $controller;
var $not_found = false;function startup(&$controller) {
$this->controller = &$controller;
if (substr_count($_SERVER['REQUEST_URI'], ‘admin’) == 0) {
if (strpos($_SERVER['REQUEST_URI'], “?”) == null) {
$uri = $_SERVER['REQUEST_URI'];
} else {
$uri = substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], “?”));
}
if (!empty($uri)) {
$meta = $this->controller->Seo->find(array(’uri’=>$uri));
} else {
$meta=null;
}
if (!is_null($meta)) {
$this->controller->set(’seo_keywords’, $meta['Seo']['keywords']);
$this->controller->set(’seo_description’, $meta['Seo']['description']);
$this->controller->pageTitle = $meta['Seo']['title'];
} else {
$this->not_found = true;
}
}
}
}?>
Компонент проверяет адрес запрошенной страницы. Если адрес содержит слово «admin» - поиск мета-тегов не производится (считаем, что находимся в админке). Если адрес страницы содержит параметры после знака вопроса — откидываем их. По оставшемуся URL — ищем запись в таблице Seo.
Как установить компонент?
1. Сохранить его исходный код в файл “app/controllers/components/seo.php”.
2. Создать в базе данных таблицу seos с текстовыми полями uri, keywords, description и title:
CREATE TABLE IF NOT EXISTS `seos` (
`uri` varchar(255) NOT NULL,
`keywords` text NOT NULL,
`description` text NOT NULL,
`title` text NOT NULL,
PRIMARY KEY (`uri`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
3. Создать в папке app/models/ модель seo.php:
<?php
class Seo extends AppModel {
var $name = ‘Seo’;
}
?>
4. В каждом контроллере, где нужно выдавать в макет мета-теги, добавить в заголовок класса:
<?php
class ArticlesController extends AppController {var $name = ‘Articles’;
var $helpers = array(’Html’, ‘Form’, ‘Javascript’ );
var $layout = ‘main’;
var $uses = array(’Cat’, ‘Content’, ‘Admin’, ‘Seo’);
var $components = array(’Validation’, ‘Seo’);
5. И, наконец, в макете (layout) — написать для вывода мета-тегов:
<title><?php echo $title_for_layout;?></title>
<meta name=”description” content=”<?php if(!empty($seo_description)) echo $seo_description; else echo ”; ?>”/>
<meta name=”keywords” content=”<?php if(!empty($seo_keywords)) echo $seo_keywords; else echo ”; ?>”/>
Для заполнения и редактирования значений мета-тегов можно использовать авто-сгенерированный вид и контроллер. Это уже свободное творчество :).