Выводим ссылки на похожие материалы без доп. модулей

Появилось желание — при просмотре записи в блоге, выводить похожие материалы. Беглый поиск показал наличие 4-х модулей для решения этой задачи (в действительности может и больше). Плюсы и минусы всех четырёх можно посмотреть в сводной табличке на drupal.org — Comparison of Similiar / Relevant by term block modules.

Всё бы хорошо, бери и пользуйся Relevant Content или Similar By Terms, как самыми живыми, но моя дотошность не позволила мне установить модуль в 43 kb (Relevant Content) только ради вывода трёх ссылок =) Решил написать самостоятельно. Получилось довольно просто:

Drupal 6:
function phptemplate_preprocess_node(&$vars) {
  if (!$vars['page'] || !$vars['node'] || !isset($vars['node']->taxonomy) || !count($vars['node']->taxonomy)) {
      return;
  }
 
  $node = $vars['node'];
  $tids = array_keys($node->taxonomy);
  $items = array();
 
  $nodes = db_query_range("
    SELECT n.nid, n.title, COUNT(*) AS hits FROM {node} n
    LEFT JOIN {term_node} tn ON n.nid = tn.nid AND n.vid = tn.vid
    WHERE
      n.type = '%s' AND
      n.status = 1 AND
      tn.tid IN (" . db_placeholders($tids) . ") AND
      n.nid <> %d
    GROUP BY n.nid
    ORDER BY hits DESC, n.created DESC
  ", array_merge(array($node->type), $tids, array($node->nid)), 0, 3);
 
  while ($node = db_fetch_object($nodes)) {
    $items[] = l($node->title, 'node/' . $node->nid);
  }
 
  $vars['content'] .= theme('item_list', $items, 'Похожие материалы');
}

Drupal 7:

function [THEMENAME]_preprocess_node(&$vars) {
  if (!$vars['page'] || !$vars['node'] || !isset($vars['field_tags']) || !count($vars['field_tags'])) {
    return;
  }
 
  $tids = array();
  foreach ($vars['field_tags'] as $tag) {
    $tids[] = $tag['tid'];
  }
 
  $query = db_select('node', 'n');
  $query->fields('n', array('nid', 'title'));
  $query->addExpression('COUNT(*)', 'hits');
  $query->leftJoin('taxonomy_index', 'ti', 'n.nid = ti.nid');
  $query->condition('n.type', $vars['type']);
  $query->condition('n.status', NODE_PUBLISHED);
  $query->condition('ti.tid', $tids, 'IN');
  $query->condition('n.nid', $vars['nid'], '<>');
  $query->groupBy('n.nid');
  $query->orderBy('hits', 'DESC');
  $query->orderBy('n.created', 'DESC');
  $query->range(0, 3);
 
  $vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы');
  $vars['content']['similar']['#weight'] = 2;
}

Код добавляет 3 ссылки на похожие материалы при просмотре полной версии ноды. Похожесть определяется с помощью таксономии (поле field_tags в Drupal 7).
Написанное актуально для
Drupal 6, Drupal 7
Теги:
template.php, работа с нодами
Добавлено: 26 Июля 2018 21:57:06 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...