Введение в Drupal-SEO
Есть мнение, что друпал трудный и негибкий, имеет кучу недостатков и плохо индексируется, что делать на друпал маленькие сайты неразумно и затратно. Так ли это на самом деле и как избежать SEO-граблей молодому сайту?
Несомненно, есть определённые трудности, но потратив немного времени на изучение проблемных мест и ликвидацию их причин, вы достигнете более правильной организации контента и более гибкой оптимизации.
Для кого эта статья? Для тех, кто искушён в SEO, но мало знаком с Drupal, для интересующихся и желающих улучшить SEO-характеристики, тех кто боится использовать Drupal.
Drupal, в силу модульной архитектуры, являясь очень гибкой системой, имеет ряд проблем связанных с внутренней оптимизацией. Огромное количество модулей, вариантов реализации и разобщённость разработчиков одни из факторов, которые требуют уделения пристального внимания подбору модулей и планированию организации ресурса. Стоит учесть тот факт, что при расширении функциональности ядра многие модули взаимодействуют не согласованно.
Даже при создании ресурса сравнительно простой структуры на базе Core модулей(из коробки) в зависимости от выбранного пути решения требуется анализ и пересмотр SEO-конфигурации с целью предотвращения возможных негативных эффектов на поисковые системы. Одними из основных проблемных мест архитектуры Drupal является динамическая система URL адресов, конфигурация robots.txt и в некоторой степени производительность.
Данный материал — попытка обозначить слабые места системы и предложить пути их решения.
Терминология
Поскольку статья будет содержать достаточно обильное количество профессиональной терминологии, рекомендуется ознакомиться с её значением.
- iSEO
- abbr: Internal Search Engines Optimization
- Внутренняя поисковая оптимизация, комплекс методов направленных на улучшение характеристик индексируемости и привлекательности ресурса в глазах поисковой системы концентрируясь на ходовых характеристиках и контентной составляющей.
- Десинхронизация
- Явление, когда части общего связанного механизма или системы выбиваются из общего потока, работают в разнобой. В контексте iSEO десинхронизация чаще всего проявляется в расстановке ключевых слов, логической структуры URL.
- Примером SEO-десинхронизации могут служить неверно проставленные заголовки относительно контента или неверное их наполнение. Нелогичная URL структура вложенности страниц в каталоги.
- Дубликаты, дубляж, дубли
- Явление, когда один и тот же контент(процент одинакового контента велик) может быть отображён по разным URL-адресам. Может приводить к штрафам со стороны поисковых систем, мешает продвижению целевых страниц.
- Целевая страница
- Страница с контентом, которая должна быть продвинута в выдаче, оптимизированная по определённым ключевым словам страница, являющаяся точкой входа.
- Точка входа
- Страница с оптимизированным релевантным определённому запросу пользователя поисковой системы контентом. Является приоритетным местом, куда попадает пользователь с поисковика.
- Штрафы, штрафные санкции
- Меры наказания со стороны поисковых систем за неверный подход к оптимизации либо его отсутствие. Чаще всего выражаются в понижении позиций штрафуемого ресурса в поисковой выдаче.
- Вес страницы, статический вес
- Абстрактное значение характеризующее совокупность таких факторов, как плотность ключевых слов и их значимость, количество релевантных ссылок с ресурса ведущих на страницу. Чем больше вес, тем выше шанс попасть в топ.
- Не стоит путать вес обозначенный в этой статье с PageRank или тИЦ: речь идёт о другом явлении.
- Структура URL
- Логическая вложенность страницы структуру каталогов. Например, Сайт -> Раздел -> Подраздел -> Страница. Нелогично, когда контент страницы отображается на выходах из разных каталогов.
Ядро, модули ядра и настройка
Рассмотрим минимальный набор модулей необходимых для создания сайта и сконфигурируем их в зависимости от задачи. Для примера возьмём реализацию простого информационного сайта.
Модули, проблемы и дополнения
Для дальнейшего понимания фронта работ по оптимизации ознакомимся со списком модулей, их проблемными местами. Также в списке присутствуют описания модулей устраняющих некоторые проблемы и улучшающих семантичность.
Все описанные методы настройки и допиливания подходят для последней версии Drupal 6, актуальной на момент написания. Перед вмешательством в исходные коды необходимо обязательно делать бэкап и по завершению этапа проводить тестирование всех взаимосвязанных модулей.
- Node -> Ядро
- Нода, универсальный узел являющийся контейнером хранения минимальной единицы информации. Каждому типу информации могут быть определены отдельные типы узла. Некоторые категории узлов создаются пользователем, некоторые программно модулями и ядром.
- По умолчанию корневая директория /node и не дружественный пользователю цифровой идентификатор (например /node/386) лишают логики и наглядной уникальности адреса материала.
- Taxonomy -> Ядро
- Таксономия, основной инструмент структурирования информации(нод) по принципу раздел-термин.
- По умолчанию неуклюжие конструкции адресов вида taxonomy/termin/ и дубликация контента при использовании дополнительных модулей работающих с ядерными(Core) URL путями, подстановка лишнего аргумента сортировки при построении адреса некоторыми модулями приводит к десинхронизации. Дублирование и путаница с виртуальными адресами RSS каналов.
- Book -> Ядро
- Книга, дополнительный инструмент структурирования информации с возможность создавать навигабельные подшивки и коллекции.
- Корень проблемы в Node и Taxonomy
- Blog -> Ядро
- Подключает функциональность блога и задаёт дополнительный одноименный тип узла.
- Дублирование контента при неправильном построении сайта, создание рассеивающих статический вес ссылок.
- Comments -> Ядро
- Подключает функционал комментирования к любому типу ноды.
- Создание массы ссылок неудобных для пользователя, рассеивающих вес. Дополнительные пути к малоинформативным(бесполезным для ПС) страницам, вызывающие эффекты штрафов со стороны S.E.
- Archives -> Дополнительный
- Позволяет структурировать информацию и реализует навигацию по критерию даты её создания.
- Очевидное дублирование информации вызывает штрафные санкции. Создание уникальных, но тем не менее нелогичных путей при навигации по датам. Отсутствие head-линковки(link rel="archives").
- Настройка элементарна. Просто отметьте типы нод, которые должны отображаться.
По желанию вы можете найти в коде модуля участок отвечающий за отрисовку заголовков даты и переверстать его чем другим, например тегом span. - Sitemap -> Дополнительный
- Создаёт страницу с навигацией по разделам на базе таксономии.
- Десинхронизация путей таксономии и RSS каналов, отсутствие интеграции системы URL с некоторыми модулями. Дубликаты контента.
- Настроим уникальное сообщение карты сайта, оно поможет разбавить ссылочную массу релевантным описанием. Отключим показ, главной страницы, авторов блогов и RSS каналов, остальные опции по задаче в зависимости от потребностей.
Найдём файл site_map.module в папке модуля, отыщем строку:// Display the $term. $output .= "\n<li>"; $term_item = ''; if ($forum_link) { $term_item .= l($term->name, 'forum/'. $term->tid, array('attributes' => array('title' => $term->description))); } elseif ($term->count) { $term_item .= l($term->name, ($cat_depth < 0) ? taxonomy_term_path($term) : "taxonomy/term/$term->tid/$cat_depth", array('attributes' => array('title' => $term->description))); } else { $term_item .= check_plain($term->name); } if (variable_get('site_map_show_count', 1)) { $term_item .= " ($term->count)"; }
Заменим её на:
// Display the $term. $output .= "\n<li>"; $term_item = ''; if ($forum_link) { $term_item .= l($term->name, 'forum/'. $term->tid, array('attributes' => array('title' => $term->description))); } elseif ($term->count) { $term_item .= l($term->name, ($cat_depth < 0) ? taxonomy_term_path($term) : "taxonomy/term/$term->tid", array('attributes' => array('title' => $term->description))); } else { $term_item .= check_plain($term->name); } if (variable_get('site_map_show_count', 1)) { $term_item .= " ($term->count)"; }
Этот хак устранит лишний концевой аргумент all в адресе термина и десинхронизацию с адресами карты сайта, которую строит модуль XML Sitemap. Таким образом индексироваться будет то, что нужно.
- XML Sitemap -> Дополнительный
- Строит машиночитаемый файл карты сайта, содержащий все материалы ресурса, категории, штампы времени и правила повторного обращения.
- Десинхронизация системы URL с некоторыми модулями. Дубликаты, рассеивание веса.
- Модуль составной, но нам понадобится только несколько компонентов. Включаем XML Sitemap, XML Sitemap Node, XML Sitemap Taxonomy, остальные компоненты можно смело удалить.
В настройках модуля установим значением Default base URL: главное зеркало сайта. Last modification date format: — полный. Приоритет главной страницы — 1, частота обновления daily(раз в сутки). Для таксономии включим термины, которые должны присутствовать в карте.
Отдельные опции кастомизаруются непосредственно в настройках словарей и терминов таксономии. Опции excluded\included — включено в карту \ исключено из карты. Приоритет разумно выставлять в пределах 0.4-0.7.
- Page Title -> Дополнительный
- Позволяет автоматизировать создание уникальных, структурозависимых заголовков страниц ядра и контента используя API функциональность модуля Token путём подстановки значений из шаблона.
- Улучшает привлекательность контента, наглядную структурность, повышает iSEO характеристики.
- Модуль помогает кастомизировать заголовки(title) страниц в зависимости от их адреса или типа.
Настройка достаточно простая. Смотрим какой странице характерен заголовок, подбираем значения из списка доступных Token и подставляем после стандартного заголовка страницы через разделитель « | ». - Nodewords -> Дополнительный
- Добавляет семантические уникальные мета-описания страницам генерируемым яром и пользователями.
- Повышает привлекательность ресурса и SEO характеристики.
- Модуль составной. Минимальный набор компонентов: Nodewords, Administration interface for Nodewords, Basic meta tags, Meta tags for custom pages, User interface for Nodewords. Включаем эти компоненты, а остальные удаляем из папки модуля.
Общие настройки: канонический URL и описание(по желанию ключевые слова), остальное выключаем. Отмечаем опции показа формах только для описания и ключевых слов. Базовый URL устанавливаем равный адресу главного зеркала(с www или без www в зависимости от требований). Если таксономия уже содержит какое-то приличное число терминов, то можно отметить автоподстановку из них. Если нет, то сделать это можно будет позже — так мы избежим возможных санкций за перенакачку ресурса ключевиками.
Настройки, специфичные отдельным страницам: здесь нужно указать адреса страниц, для которых буду генерироваться особые мета теги, настроить поля.
Важно следить чтобы все мета описания были уникальными и не повторялись, они должны отражать краткую суть материала.
- Path -> Дополнительный
- Создаёт виртуальные синонимы для стандартных /node.
- ЧПУ, уникальность, структурность, ключи в адресе.
- Модуль не требует детальной настройки, при добавлении материала в опциях создания появится возможность назначить синоним адреса.
- Pathauto -> Дополнительный
- Автоматизирует создание более привлекательных синонимов адресов для контента.
- Избыточная шаблонность, десинхронизация URL пространства.
- ЧПУ, уникальность, структурность.
- Global Redirect -> Дополнительный
- Устраняет проблемы создания ядром адресов с слешем на конце и без, перенаправляя все запросы на один адрес. Проверяет регистр запрашиваемого содержимого и перенаправляет на правильный адрес. Сверяет права доступа к содержимому и при необходимости отправляет на страницу авторизации.
- ЧПУ, уникальность, структурность, ключи в адресе.
- Настройки: удаление слеша — включено, убрать конечный нулевой аргумент — включено, проверка доступа — включено, проверка — регистра включено.
- Associated Nodes
- Добавляет релевантные ссылки к материалам на основе словарей таксономии.
- В настройках модуля добавить блок для каждого словаря, настроить заголовок и критерии отбора. Для избежания дублирования установить условия отключения показа.
- Multiping
- Позволяет пинговать обновившийся и новый контент по списку определённых сервисов, что ускоряет индексацию содержимого.
- Comment RSS
- Реализует дополнительную ленту RSS с комментариями
- Previous/Next API
- Позволяет создавать навигационные ссылки типа "Следующий-Предыдущий"
Список показывает, что основная проблема — это создание целой кучи нелогичных и неуникальных адресов, которые зачастую дублируют содержимое сайта. Создаются проблемы продвижения: вес страниц вместо концентрации на объекте продвижения рассеивается, под фильтры попадают более привлекательные целевые страницы, выдача захламляется. Корень структурной базы сайта, таксономия, по умолчанию создаёт грубые адреса и каждый модуль формирует связки по своему.
Рассмотрим пример: модули XML Sitemap и Sitemap создают карты сайта и включают одни и те же материалы сайта, но по разным путям. Сканирующий робот поисковой системы обошёл оба адреса и нашёл одинаковый контент. Велик шанс, что продвигаемая более привлекательная страница окажется под фильтром и не попадёт в выдачу. Пользователь будет попадать туда, куда не надо и возможна вероятность появления внешней ссылки на нежелательный адрес, что укрепит его позиции.
Не менее значительная проблема — это отсутствие в заводской поставке функционала для мета-описаний. Снижается привлекательность ресурса в глазах поисковой системы и для пользователя, ведь основная цель оптимизации — поднять позиции сайта в выдаче по релевантному запросу и пользователь вряд ли кликнет по малоинформативному сниппету.
Некоторая часть проблем решается простой настройкой ядра и модулей, другая потребует правки кода. Поскольку хакать ядро является плохим тоном, но решение проблемы само собой не появится, плюнем на этикет Drupal Way. Вторым аргументом в пользу хаков и фиксов представлю фактор устаревания версии 6 и близкую дату релиза 7, что фактически означает прекращение поддержки и сосредоточение всех сил на новой системе. С ней еще будут отдельные проблемы, но это в будущем. На данный момент переход на сырец не целесообразен.
Хаки и исправления
Robots.txt
Для снижения числа дубликатов воспользуемся директивой Disallow и хорошенько проанализируем структуру ресурса. Если очевидно совпадение содержимого по нескольким адресам, то выберем более привлекательный и удобный для продвижения, остальные закроем.
- Оригинальный Robots.txt для Drupal 6
- Помните, что оригинальный robots.txt Drupal вы всегда найдёте в сборке официального дистрибутива. Полный его код не приводится т.к. в этом нет смысла.
- Улучшенный robots.txt для Drupal 6
-
User-agent: * Crawl-delay: 4 Disallow: /includes/ Disallow: /misc/ Disallow: /modules/ Disallow: /profiles/ Disallow: /scripts/ Disallow: /themes/ Disallow: /comment/reply Disallow: /comment Disallow: /contact Disallow: /search Disallow: /user/register Disallow: /user/password Disallow: /user/login Disallow: /search/ Disallow: /search/google* Disallow: /search/node* Disallow: /search/user* Disallow: /filter Disallow: /node$ Disallow: /archive/all$ Disallow: /archive/all/2011$ Disallow: /*?sort* Disallow: /*&sort* Disallow: /tracker? Sitemap: <a href="http://www.domain.ru/sitemap.xml<br /> Host:" title="http://www.domain.ru/sitemap.xml<br /> Host:">http://www.domain.ru/sitemap.xml<br /> Host:</a> www.domain.ru
- Хардкорный robots.txt : убивает львиную долю шлака
-
User-agent: * Crawl-delay: 4 Disallow: /archive/all/2011$ Disallow: /archive/all$ Disallow: /*comment* Disallow: /includes Disallow: /profiles Disallow: /modules Disallow: /contact Disallow: /scripts Disallow: /themes Disallow: /search Disallow: /filter Disallow: /*atom* Disallow: /*sort* Disallow: /*utm_* Disallow: /misc* Disallow: /user* Disallow: /node$ Disallow: /*?* Sitemap: <a href="http://www.domain.ru/sitemap.xml<br /> Host:" title="http://www.domain.ru/sitemap.xml<br /> Host:">http://www.domain.ru/sitemap.xml<br /> Host:</a> www.domain.ru
Следите за вашими URL синонимами, которые могут попасть в условие маски. Индексация таких адресов будет невозможна.
Есть пару замечаний. Клиентам шустрых хостингов и своих серверов Crawl-delay можно устанавливать в районе 1-4, это ускорит сбор информации поисковиками. Если хостинг медленный или информации очень много, то планку стоит повышать — это обеспечит баланс между индексируемостью и генерацией нагрузки.
Модуль Archives зачастую дублирует информацию главной страницы, для избежания санкций перекроем страницу со всеми материалами и материалами за текущий год.
Модифицированный robots.txt не содержит запретов для файлов лицензий, readme и changelog, рекомендуется вообще удалить их после ознакомления из всех директорий движка т.к. их информационная ценность на production стремится к нулю.
Также стоит провести анализ и очистить файл от лишних запретов тех путей, по которым неавторизованному пользователю отдаётся головок 403(доступ запрещён). Например, админка и добавление материала.
Исправление кривых URL RSS таксономии
В папке модуля taxonomy найти в файле taxonomy.pages.inc.
строку
drupal_add_feed(url('taxonomy/term/'. $str_tids .'/'. $depth .'/feed'), 'RSS - '. $title)
заменить на
drupal_add_feed(url('taxonomy/term/'. $str_tids .'/feed'), 'RSS - '. $title);
строку
$channel['link'] = url('taxonomy/term/'. $str_tids .'/'. $depth, array('absolute' => TRUE));
заменить на
$channel['link'] = url('taxonomy/term/'. $str_tids, array('absolute' => TRUE));
В корневом файле .htaccess
<IfModule mod_rewrite.c> </IfModule>
Сразу перед директивой RewriteBase /
RewriteRule ^taxonomy/term/(.+)/feed taxonomy/term/$1/0/feed [NC]
Устранит нулевой аргумент и лишний уровень вложения RSS канала словаря таксономии.
Редирект на главное зеркало и тюнинг корневого .htaccess в Drupal
С помощью .htaccess пропишем правила для перенаправления дополнительного зеркала на главное.
В оригинальном файле .htaccess в корне сайта найдём секцию &IfModule mod_rewrite.c добавим правила после директивы RewriteEngine.
- Редирект 301 .htacess на www
-
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} ^domain\.ru$ [NC] RewriteRule ^(.*)$ http://www.domain.ru/$1 [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !=/favicon.ico RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] RewriteRule ^.htaccess$ - [F] </IfModule>
Такой код секции должен получиться в итоге. Как показывает практика, предложенная опция редиректа не работает на некоторых хостингах, это связано с настройками платформы сервера.
Не забываем синхронизировать редирект с директивами Host и Sitemap в файле Robots.txt.
Также стоит добавить в самый низ .htaccess секцию запрещающую редирект при обращению к robots.txt. Это гарантирует точное определение главного зеркала и поможет при смене домена или склейке.
<FilesMatch "robots.txt$"> RewriteEngine off </FilesMatch>
Иногда при переносе с другого движка требуется сохранить не весь контент, но только его часть. Для того чтобы перенести трафик со старых страниц на их новые адреса можно воспользоваться следующими директивами
RewriteRule ^old_Path/old_Page.html$ new_Path/new_Page [L,R=301]
Правила должны быть вписаны в секцию IfModule mod_rewrite.c после директивы RewriteBase и объявленного редиректа на главное зеркало. Помните, что порядок записи правил имеет значение.
Анализ и доработка системы шаблонизации
Что это даёт?
Комплекс мероприятий позволит улучшить разнесение ключей по front-end коду страниц, исключить нежелательные вхождения, очистить от мусорных элементов навигации, ускорить рендеринг страниц.
Что нужно понимать выполняя оптимизацию вёрстки и блочной архитектуры Drupal? Нужно тщательно анализировать контент, структуру разделов и отталкиваясь от этого перестраивать шаблоны. Целесообразна в первую очередь оптимизация всех заголовков и кода, который их генерирует.
Статичность как аргумент пользы
Стоит помнить, что все опции и участки вёрстки, которые не требуют частого изменения лучше выносить в виде чистого статичного HTML, например, постоянное меню навигации. Тоже самое касается установки кучи модулей, обеспечивающих маломальский функционал front-end. Почти все их можно и даже нужно стараться пересадить на статику. Это не только упростит работу с админкой, но позволит с лёгкостью кастомизировать и вносить правки. Вторым аргументом пользу отказа от модулей является скорость работы ядра. Чем меньше движку придётся обращаться к базе данных, тем быстрее пользователь увидит контент, тем мягче будут происходить перестройки кэша.
Заголовки
Поговорим о заголовках. Это те самые маркеры, которые позволяют визуально и по смыслу обозначить характер секции. Поскольку заголовки играют достаточно ощутимую роль при выделении релевантного запросу пользователя контента, имеет смысл озадачиться их оптимизацией.
Тезисы:
- Заголовки должны иметь иерархическую структуру вложенности.
- Имеют смысл только заголовки h1 - h3. Они самые важные и только ими имеет смысл размечать контент.
- Заголовки h4 - h6 не дают ощутимого эффекта усиления ключевика и могут быть использованы для обозначения служебных участков шаблона.
- Чем больше на странице заголовков, тем сильнее рассеивается их значимость. Если требуется подчеркнуть важность ключа, не стоит использовать много заголовков.
- Заголовки не должны быть отделены от характерного им контента крупными конструкциями разметки. Это препятствует выделению релевантного контента.
Заголовки h1 - h3 используем для разметки контента. Остальные(h4 - h6) по желанию можем использовать для разметки блоков, навигации, участков взаимодействия с пользователем. Если блоков слишком много и есть угроза понизить значимость ключевиков контента, заголовки блоков рекомендуется переверстать другими тегами.
Множество факторов будет зависеть от выбранной темы оформления и тематики ресурса, если Вы проектируете тему для Drupal с нуля или адаптируете готовый layout, то мини-мануал поможет сделать грамотную семантическую вёрстку.
- Шаблон - > page.tpl.php
- Основной шаблон каркаса сайта, является обёрткой для всех генерируемых движком страниц и блоков. В этом шаблоне заложен потенциал предварительной разметки и прописаны вызовы других функций.
- Переместим title выше.
<head> <title><?php print $head_title; ?></title> <?php print $head; ?> <?php print $styles; ?> <?php print $scripts; ?> </head>
Если ваш сайт не брендовый и нет хорошей известности названия, то не стоит делать логотип тегом h1. Ведь вряд ли Вас будут сразу-же искать по названию сайта. Отдадим приоритет заголовкам контента(пользы будет больше), а логотип обверстаем картинкой или другими тегами.
Участок разметки контента при правильном построении должен иметь примерно следующий вид. Он будет повторяться число раз, равное числу материалов установленных в админке.
<div class="content"> <?php if ($title): ?> <h1> <?php print $title; ?> </h1> <?php if ($tabs): ?> <?php print '<div id="tab-control">'.$tabs.'</div>';?> <?php endif;?> <?php endif; ?> <?php print $content; ?> </div>
Такой код сделает все заголовки на всех уровнях страниц обёрнутыми в h1, что играет определённую роль. Обратите внимание на то, что вызов вкладок обёрнут в условие заголовка, это логично т.к. они обычно показываются только авторизованному пользователю и не бывают там, где заголовка нет.
В template.php файла темы добавим код, который уберёт лишнюю meta кодировки, уберём также объявление в шаблоне(останется только одна мета, идущая сразу после head т.к. образом будет соблюдено требование безопасности и уменьшится кол-во мусорного кода).
/* strip the dublicate meta charset */ function phptemplate_preprocess_page(&$vars) { $vars['head'] = preg_replace(' /<meta http-equiv=\"Content-Type\"[^>]*>/', '', $vars['head'] ); }
Все остальные переменные доступные для шаблона page.tpl.php вы можете применять на своё усмотрение.
- Шаблон - > node.tpl.php
- Основная обёртка контента страницы. Содержимое этого шаблона подгружается в шаблон page.tpl.php в регион $content.
- Всё содержимое шаблона можно разделить на 3 участка(заголовок, метаданные, дополнительные ссылки).
В условие $page == 0 обёрнут заголовок, это предотвращает рендеринг заголовков одинакового уровня для страниц разной вложенности относительно корня ресурса. Заголовок дополнительно обвёрстан ссылкой ведущей на материал.<?php if ($page == 0):?> <?php print '<h2> <a title="'.$title.' смотреть полностью" href="'.$node_url.'">'.$title.'</a> </h2>'; ?> <div class="meta-data"> <?php print $name; ?> <?php print $date; ?> </div> <?php endif; ?>
Переменная $content в дурпал встречает в разных шаблонах, но почти всегда содержит основную информацию. В шаблоне node.tpl.php в это переменной содержится контент материала(новости, заметки блога, темы форума, страницы).
<?php print $content; ?>
Переменная $links отвечает за вывод ссылок материала, комментариев к нему и маркера принадлежности к типу ноды. Рекомендую закрыть его от индексации с помощью пары noindex.
<?php if ($links): print '<!--noindex--> <div class="linker">'.$links.'</div> <!--/noindex-->'; ?> <?php endif; ?>
Дополнительно в шаблоне node.tpl.php доступны такие переменные, как $taxonomy, $picture, $teaser, $submited. Полезным для SEO является только $taxonomy и то далеко не всегда.
Обратите внимание, что на стиль кодинга. Помешать в один print конструкцию целиком не совсем удобно при разработке, зато отработанный код шаблона на front-end будет опрятнее и компактнее. - Шаблон - > comment.tpl.php
- Отвечает за вывод комментариев
- Перекрываем переменную $links вместе в обёрткой.
<?php print'<a id="comment_'.$id.'"></a>'; ?> <div class="comment<?php print ($comment->new) ? ' comment-new' : ''; print ' '. $status ?> clear-block"> <div class="meta-data"> <?php if ($comment->new): ?> <span class="new"><?php print $new ?></span> <?php endif; print $submitted ?> </div> <div class="content"> <?php print $picture; ?> <div class="remark"> <?php print $content; ?> </div> </div> <?php print '<!--noindex--> <div class="linker">'.$links.'</div> <!--/noindex-->'; ?> </div>
- Небольшой хак для template.php убирает из тизера материала ссылку на добавление комментария
/* strip the "add comment" link */ function phptemplate_links($links) { if (count($links)>0){ if (isset($links[node_read_more]) && isset($links[comment_add])){ unset($links[comment_add]); } } return theme_links($links); }
- Шаблон - > block.tpl.php
- Шаблон является обёрткой для контента отображаемого в блоках.
- Самый простой пример шаблона будет содержать контент и заголовок.
<div class="block"> <?php if (!empty($block->subject)): ?> <h5><?php print $block->subject ?></h5> <?php endif;?> <?php print $block->content ?> </div>
Обратите внимание на тег h5. Если вы проанализировали содержимое блока и хорошо подобрали ключевики для заголовка, можно смело использовать заголовки вплоть до h3. При совпадении запроса пользователя с релевантным содержимым блока есть шанс попасть в выдачу. В противном случае от тега заголовка лучше отказаться вовсе.
- Шаблон - > box.tpl.php
- Обёртка форм взаимодействия с пользователем. Содержимое шаблоны выводится ниже переменной $content в шаблоне page.tpl.php.
- Содержимое шаблона, как правило, вообще не содержит никакой ценной информации. Закрываем от индексации, заголовок обвёрстываем самым нижним уровнем.
<!--noindex--> <div class="box-container"> <?php if ($title): print '<h6>' . $title . '</h6>'; endif; ?> <?php print $content; ?> </div> <!--/noindex-->
Отталкиваясь от выше описанной логики вы можете оптимизировать и остальные шаблоны модулей. Думайте над структурой и улучшайте семантичность вёрстки.
Итоги
Выполнив рефакторинг и доработку сайт приобретёт более правильную информационную архитектуру, повысится статический вес целевых страниц и улучшится ранжирование результатов поиска.
Значительно снизятся затраты на продвижение и исключится некоторое число возможных негативных манипуляций со стороны конкурентов с целью понизить сайт.
Комментарии
Опубликовано Чт, 02/06/2011 - 09:03 пользователем Анонимный (не проверено) Постоянная ссылка (Permalink)
seocolt
Нормальный такой гайд :) Попробую познакомиться с друпалом поближе)
Опубликовано Пт, 10/06/2011 - 16:09 пользователем wshurik Постоянная ссылка (Permalink)
Конечно конечно. Советую! -)
Конечно конечно.
Советую! -)