Как сделать «Ссылки по теме»

27.08.2007

Допустим, у меня есть блог, и я публикую две статьи о разведении черепах в домашних условиях. Дальше я хочу сделать так, чтобы под каждой из статей под заголовком «Ссылки по теме» была ссылка на другую статью. Как мне это сделать?

Вариант со ссылками из текста

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

Представьте, сколько времени уйдет на то, чтобы связать пять статей.

Вариант с прямым связыванием статей (улучшение предыдущего)

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

Так я связываю статьи друг с другом в этом блоге

Связывание статей в Drupal

Если связи сделать двусторонними, то редактировать остальные статьи вообще не придется.

Этот способ хорош, однако, при добавлении четвертой статьи придется найти три других, при добавлении пятой — четыре других. То есть никак не учитывается уже существующее связывание статей.

Вариант с категориями

Статьи можно привязывать к категориям, а не друг к другу. В этом случае редактору сайта вообще не нужно делать лишних движений. Побочный эффект — ссылки по теме становятся неконтролируемыми. Так устроены сайты многих интернет-изданий.

Если в блоге есть категория «Разведение черепах», то проблем не возникнет. Если же есть только категория «Домашние питомцы», то содержание блока «Ссылки по теме» будет непредсказуемым.

Вариант с тегами

Если для классификации материалов сайта используются многочисленные теги, то контроль над составом ссылок возвращается. Но все теги не предусмотришь, поэтому придется возиться с привязкой старых статей к новым тегам.

Этот вариант хуже второго (с прямым связыванием статей), поскольку теги — это абстрактная надстройка, следить за которой сложнее, чем за прямыми связями.

Вариант с поиском

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

Редактору не нужно делать ничего, но контроль над составом ссылок исчезает.

Заключение

С одной стороны — трудоемкие методы с контролируемыми результатами, с другой — методы для ленивых с неточными результатами. По собственному опыту скажу, иногда хочется ставить двусторонние ссылки, а иногда односторонние. Соответственно варианты с тегами, категориями и поиском обладают недостатком — не позволяют ставить односторонние ссылки.

Вопрос знатокам

Предположим, у меня есть форум. Тематика разделов достаточно узкая, темы тегами не размечаются. Я хочу к каждому топику прикрутить блок «Ссылки по теме», состоящий из ссылок на похожие темы этого же форума. Как бы лучше это сделать?

Комментарии

Алексей Новиков, 27.08.2007 22:31

Сделать это лучше посредством редактора. Редактор — это такой умный человек, который обеспечивает качество.

Алексей, 27.08.2007 23:19

Я предполагаю, что для объединения схожих тем на форумах и придумали кроме разделов еще и категории (выражаюсь в терминологии phpBB). Но, увы, с помощью категорий сетевую иерархию не реализовать, а для кросс-сылок нужна (в общем случае по крайней мере).

Для форума мне кажется разумной некая комбинация технологий. Администратор задаёт жестко категорию(ии) форума, может быть даже сами разделы (форумы — в терминологии phpBB) и поисковый запрос. Таким образом, в «ссылки по теме» помещаются только те результаты поиска, которые находятся в выбранных форумах и категориях.

Это снова не позволит жестко контролировать состав ссылок, но раз тематика разделов узкая, то, по крайней мере, получится предсказуемый набор ссылок.

Дмитрий Сергеев, 28.08.2007 00:04

Да, я тоже о чем-то таком подумываю. А значит буду искать поисковый движок. Кстати, может есть что-нибудь на примете?

Алексей, 28.08.2007 00:17

Google :)

Если серьезно, то, увы, никогда не пытался прицепить внешний поисковый движок с форуму или CMS из, так сказать, концептуальных соображений: на мой взгляд, поиск довольно-таки массовая функция, чтобы входить в стандартный набор подобного ПО.

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

Буду рад, если отстал от времени.

Дмитрий Сергеев, 28.08.2007 00:32

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

a.sysoev, 05.09.2007 12:32

Попробуйте mnogoSearch

Дмитрий Сергеев, 05.09.2007 14:24

Спасибо, в моем случае не подходит.

Дмитрий Сергеев, 28.08.2007 12:31

Я поискал поисковые движки (простите за каламбур), и оказалось, что они либо стоят денег (RiSearch PHP), либо требуют хостинга с «развязанными руками» (DataparkSearch Engine, Яндекс.Сервер), либо вообще не внушают доверия (iSearch PHP).

В итоге сделал простейший поиск через LIKE '%keyword%', где keyword -- привязываемое модератором к каждой теме ключевое слово без окончания. Например, «тренир» для охвата тем со словами «тренироваться» и «тренировка».

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

Сурин Александр, 29.08.2007 00:22

Я обычно предлагаю на информационно насыщенных ресурсах использовать многоуровневую категоризацию.
Если брать в качестве основы Drupal, то получается следующая схема:
1. Словарь "Категории" - категории материалов, в том виде как они обычно используются в блогах.
2. Словарь "Теги" - список ключевых слов, можно в свойствах этого словаря поставить free-taging и дать возможность пользователям указывать свои теги, сделать это можно с помощью модуля "Community_tags". При этом пользователь видит и все теги присвоенные материалу, и свои персональные, то есть в принципе может сам выстраивать свою персональную структуру сайта.
3. Словарь "Темы". Это как раз термины для увязывания статей по одной теме.

Остается только в коде нода прописать, чтобы он смотрел какой термин из словаря "Темы" присвоен статье и выводил внизу список всех материалов привязанных к этому же термину.
Подозреваю, что проще всего это сделать с помощью Views.

Дмитрий Сергеев, 29.08.2007 00:34

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

snow_wons, 30.08.2007 11:37

Связывать статьи вручную - это, наверно, лучший вариант.
Только должно быть несколько взаимосвязей между статьями:
1. Статья 1 ревалентна статье 2. Т.е во второй статье будут отображаться ссылки на 1, а в 1 на вторую нет.
2. Статья 2 ревалентна статье 1. Это как раз для того чтобы не обновлять ранее написаные статьи.
3. Статьи 1 и 2 ссылаются друг на друга.

Также было бы хорошо реализоваться копирование связаных ссылок из других статей.

Дмитрий Сергеев, 30.08.2007 11:54

У нас похожие мысли :) Как раз на иллюстрации к этой заметке в выпадающем списке с установленным значением «seeAlso» на самом деле есть и другие. Конкретно в этом случае есть еще значения «seePrev» и «seeNext» -- для тех случаев, когда статья публикуется по частям, а между частями вклиниваются другие материалы.

snow_wons, 30.08.2007 12:28

:-) хорошая идея.
Мне такое даже в голову не приходило.

Тут еще одна проблема. Как это всё хранить в БД?
Допустим есть таблица (master, rel, slave).
Если делать двойную связь - то придётся делать 2 запроса, что не есть хорошо.
Поэтому придётся двойную связь разбивать на две односторонние.
То же самое нужно делать и при добавлении связей "Предыдущий" и "Следующий". Ведь та статья которую мы делаем предыдущей должна будет ссылатся на текущую статью.

Maxime, 05.09.2007 19:05

Для Wordpress есть плагин Related Posts:
http://www.w-a-s-a-b-i.com/archives/2006/02/02/wordpress-related-entries...
К сожалению, эта ссылка из самого плугина сейчас не работает, попробуйте поискать по иени в репозиториях плагинов к Wordpress.

Дмитрий Сергеев, 05.09.2007 20:35

Спасибо, поставил галочку.