WordPress: похожие посты (хардкор-вариант)

Задача: в wordpress’е после статьи выводить список «похожие статьи».

Если у двух статей совпадает один из тегов или категория, то это похожие статьи. Чем больше тегов совпадает, тем сильнее похожие. Вывести нужно пяток наиболее похожих. Если у двух статей одна «релевантность», то выше выводить более свежую.

По запросу «wordpress similar posts» можно найти множество плагинов данной тематики. У них у всех отличный код, подробная документация и богатый набор настроек. Единственный минус: вместо похожих постов они выводят какую-то рандомную хероту.

Так, как разбираться в функциях связанных с тегами и писать свой плагин нам лениво, то просто всё захардкорем. В файле темы, где выводится отдельный пост (обычно в wp-content/themes/mytheme/single.php), в нужном месте говнокодим:

$limit = 5;
$query = '
SELECT
    COUNT(*) AS `relev`,
    `p`.`ID`,
    UNIX_TIMESTAMP(`p`.`post_date`) AS `post_date`,
    `p`.`post_title`,
    `p`.`post_name`
FROM
    `'.$wpdb->prefix.'term_relationships` AS `r`
INNER JOIN
    `'.$wpdb->prefix.'posts` AS `p`
    ON `p`.`ID`=`r`.`object_id`
WHERE
    `term_taxonomy_id` IN 
        (SELECT `term_taxonomy_id` FROM `'.$wpdb->prefix.'term_relationships` WHERE `object_id`='.$post->ID.')
    AND `object_id` != '.$post->ID.'
    AND `post_type`="post"
    AND `post_status`="publish"
GROUP BY
    `object_id`
ORDER BY
    `relev` DESC,
    `p`.`post_date` DESC
LIMIT
    '.$limit.'
';
 
$simposts = $wpdb->get_results($query);
if (count(simposts) > 0) {
    echo '<h3>Похожие записи</h3><ul class="similar-posts">';
    foreach ($simposts as $p) {    
        $url = 'http://example.com/blog/'.date('Y/m/d/', $p->post_date).$p->post_name.'/';
        $title = htmlspecialchars($p->post_title, ENT_COMPAT, 'UTF-8');
        echo '<li><a href="'.$url.'" rel="bookmark" title="Постоянная ссылка на '.$title.'">'.$title.'</a></li>';
    }
    echo '</ul>';
}

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

Вот так, всего за 5 минут мы позволили вордпрессу стать ещё говнокодистее. До новых встреч.

4 комментария »

Leave a comment