Вы здесь

SEO Drupal

 

 

Введение в 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-->

 

Отталкиваясь от выше описанной логики вы можете оптимизировать и остальные шаблоны модулей. Думайте над структурой и улучшайте семантичность вёрстки.

Итоги

Выполнив рефакторинг и доработку сайт приобретёт более правильную информационную архитектуру, повысится статический вес целевых страниц и улучшится ранжирование результатов поиска.

Значительно снизятся затраты на продвижение и исключится некоторое число возможных негативных манипуляций со стороны конкурентов с целью понизить сайт.

 

Автора автора

Комментарии

Нормальный такой гайд :) Попробую познакомиться с друпалом поближе)

Конечно конечно.

Советую! -)

Поделитесь в социальных сетях!