Реализуем модуль похожих постов на нашем блоге

 

Всем доброго времени суток! Спасибо, что все еще присутствуете на моем блоге Улыбаюсь и ждете новых постов к циклу "Создать блог с нуля". Да, я искренне извиняюсь за то, что обновления теперь происходят не очень часто. Данная проблема связана с тем, что я вышел на работу и не могу посвящать блогу также много внимание как делал это ранее. Уж поверьте, после восьми часов работы с php кодом на рабочем месте не особо хочется лезть в php код своего проекта Плачу

Ладно, что-то я отвлекся. Чем мы сегодня займемся? Я предлагаю создать очередной мини модуль для нашего проекта.

 

 

Цель заметки - создать мини модуль похожих постов. Работу данной чудо штуки Вы можете лицезреть в самом низу данного (и не только данного) поста. Вот скрин для того чтобы Вы поняли, что именно мы будем делать Улыбаюсь

 

мини модуль похожих постов

 

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

Для реализации нам понадобится:

  • Шаблон. Шаблон представляющий собой блок с списком ссылок
  • Модуль. Сам модуль который будет генерировать пять ссылок из тех что есть в базе данных
  • Подключение модуля. Данный модуль будет подключен не к главной странице нашего блога, а к модулю статей
  • Вывод с генерированных ссылок на экран пользователя. Вывод будет производится в шаблоне модуля статей.

Скажу пару строк для тех кто на блоге в первый раз, и приступим к реализации данного мини модуля

 

Для тех кто на блоге в первый раз

 

В общем-то цель этого блока ввести нового читателя, который чисто случайно вышел на данную страницу, в курс дела. Текст изложенный в данном посте будет полезен тем кто читает глобальный цикл статей "Создать блог с нуля". Этот цикл повествует о создание простого скрипта персонального блога на великом и могучем php. Если Вам интересен данный курс, то заходите по ссылке, что я дал Вам чуть выше, и приступайте к изучению изложенного мной материала. Если у Вас есть какие либо вопросы, то Вы можете оставить комментарий в заметке к которой у Вас есть вопрос. Если я в силах Вам помочь, то обязательно помогу Улыбаюсь

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

 

Приступаем.. Создаем шаблон для нашего мини модуля

 

В шаблоне буквально пару строк, поэтому я не думаю что у Вас возникнут по нему вопросы Улыбаюсь Нарек я данный шаблон следующим именем - morepost.html. А поместил в пользовательскую папку templates. Теперь собственно сам html код:

			<!--ЕЩЕ ПОСТЫ-->
<div class="title_txt">Возможно Вам будут интересны следующие заметки:</div>
<ul style="padding-left:25px;">
[_more]
</ul>
<div class="end"></div>
<!--ЕЩЕ ПОСТЫ-->

 

Создаем функции мини модуля похожих постов

 

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

В основном (скажем плагин для wordpress) данный модуль выбирает заметки опираясь на так называемые теги, но так как у нас в движке нет тегов, то придется делать выборку по категории.

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

Вторая функция просто с генерирует список из пяти полученных заметок

 

Первая функция модуля - сбор массива

 

Создаем в пользовательской папке moduls файл с именем morepost.php. Теперь прописываем в созданном файле следующую функцию:

function morepost($cat,$blog)//модуль похожих постов (сбор массива)
{
$result_index = mysql_query("SELECT title,id,nameurl FROM blog WHERE
viewindex='1' AND
cat='$cat' AND
cat!='0' AND
id!='$blog'
");//Выводим из базы статью
$myrow_index = mysql_fetch_array($result_index);

if($myrow_index != "")//если найдена хотя бы одна заметка
{
$more = file("templates/morepost.html");//подключаем шаблон
$more = implode("",$more);//склеиваем его

//Формируем массив со всеми постами необходимой категории
$ps = 0;//индикатор массива
do
{
$post[$ps][0] = $myrow_index['title'];//заголовок заметки
$post[$ps][1] = $myrow_index['id'];//id заметки
$post[$ps][2] = $myrow_index['nameurl'];//чпу заметки

$ps++;//переключаем индикатор массива
}
while($myrow_index = mysql_fetch_array($result_index));
//Формируем массив со всеми постами необходимой категории

$ellem = count($post);//определяем кол-во элементов в массиве, то бишь кол постов

if($ellem > 5)//Если постов больше 5-ти то отсеиваем не нужные (рандом)
{
$maxr = $ellem - 1;//максимальное кол постов в массиве, от нуля

for($i=0;$i<5;$i++)
{
$rand = rand(0, $maxr);//генерируем число от нуля до макс

if(isset($post[$rand]))//если такой элемент есть
{
$gen[$i][0] = $post[$rand][0];//переносим заголовок
$gen[$i][1] = $post[$rand][1];//переносим id
$gen[$i][2] = $post[$rand][2];//переносим чпу

unset($post[$rand]);//уничтожаем элемент для того чтобы снова его не выбрать
}
else $i--;//если элемента нет, то пере запускаем шаг цикла
}

$li = listMOREpost($gen);//генерируем список из массива содержащего рандомные посты
}
else $li = listMOREpost($post);//если постов меньше 5-ти то просто генерируем список без отсеивания

$more = str_replace("[_more]",$li,$more);//заменяем код-слово в шаблоне на список заметок

return $more;//выводим с генерированный html код
}
else return "";//если заметок не найдено функция выдаст пустоту
}
  • Входные параметры у функции это id категории ($cat) и id заметки в базе данных ($blog).
  • Далее скрипт выдирает все посты из нужной категории (все кроме открытого поста. Для определения открытого поста нам понадобится переменная blog)
  • С помощью цикла do while соберется глобальный массив в котором будут содержаться совершенно вся информация о выбранных заметок из базы данных
  • Следующим шагом скрипт определит сколько заметок удалось вытащить из базы данных
  • С помощью функции rand() скрипт определит рандомное число с помощью которого движок выберет случайную заметку
  • С помощью цикла for() скрипт выберет лишь пять заметок из всех
  • Далее с генерированный массив из пяти заметок отправляется в функцию listMOREpost() (которую мы напишем чуть ниже) Данная функция с генерирует html код, который в последствие заменит код-слово [_more]
  • Последнее что сделает функция это выведет уже готовый html код

Код за комментирован, так что проблем с пониманием кода быть не должно Улыбаюсь

 

Вторая функция - генерация списка

 

Тут все просто. Запускается цикл for() с помощью которого сформируется пять пунктов с ссылками. В общем Улыбаюсь вот код:

function listMOREpost($massiv)//модуль похожих постов (список)
{
global $chpu;
for($i=0;isset($massiv[$i]);$i++)
{
if($chpu == 0)$li .= "<li><a href=\"index.php?blog=".$massiv[$i][1]."\">".$massiv[$i][0]."</a></li>";
if($chpu == 1)$li .= "<li><a href=\"post/".$massiv[$i][2]."\">".$massiv[$i][0]."</a></li>";
}

return $li;
}

Поместите данную функцию в самый низ файла morepost.php

 

Подключаем созданный модуль к нашему движку

 

Как я уже говорил подключение будет производится не в главном файле (НЕ в index.php) а в модуле статей. Поэтому открываем файл text.php и прописываем новые строчки кода сразу после алгоритма вырезание код-слова [end]. Вот код (я дам Вам код функции blog(), учтите это не полный код станицы text.php!):

function blog($blog)
{
$result_index = mysql_query("SELECT * FROM blog WHERE id = '$blog'");//Выводим из базы статью
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...

$newloock = $myrow_index['loock'] + 1;//прибавляем плюс один к просмотрам
$up_loock = mysql_query ("UPDATE blog SET loock='$newloock' WHERE id='$blog'");//записываем новое значение в базу данных

$sm_read = file("templates/text.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
$text = str_replace("<p>[end]</p>","",$myrow_index[text]);//Удаляем код-слово из текста
//(напоминаю, что этот [end] служит нам разделителем текста статьи, это нужно для вклеивания кнопки "Читать дальше")

//МОДУЛЬ ПОХОЖИХ ПОСТОВ
include("moduls/morepost.php");
$more = morepost($myrow_index['cat'],$blog);
$sm_read = str_replace("[_morepost]",$more,$sm_read);
//МОДУЛЬ ПОХОЖИХ ПОСТОВ


//Замены идентификаторов на переменные из базы данных
$sm_read = str_replace("[_text]",$text,$sm_read);//Текст
$sm_read = str_replace("[_title]",$myrow_index[title],$sm_read);//Название статьи
$sm_read = str_replace("[_author]",$myrow_index[author],$sm_read);//Автор статьи
$sm_read = str_replace("[_date_b]",$myrow_index[date_b],$sm_read);//Дата размещения
}
else $sm_read = "<p align='center'>Нет записей в базе данных</p>";//Если записей нет, то вывести это сообщение
$result[0] = $sm_read;
$result[1] = $myrow_index[viewcomm];
return $result;//Выводим с генерированный html код
}

В общем то все очень просто.

  • Подключаем файл (morepost.php) модуля
  • Запускаем функцию morepost()
  • Заменяем код-слово [_morepost]. Данное код-слово необходимо добавить в шаблон модуля статей, чем сейчас и займемся Улыбаюсь

 

Выводим новый модуль на экран пользователя

 

Вывод будет производится не в сайтбаре как мы делали это в предыдущих заметках, а в модуле статей. Стало быть нам необходимо подправить шаблон text.html. Открываем его и вставляем код-слово [_morepost] в то место где Вы хотите видеть список похожих постов. В моем случае (да и в большинстве остальных Смеюсь) данный модуль выводится в самом конце текста заметки. Поэтому прописываем код слово вот так (даю Вам полный html код шаблона text.html):

		<!--ТЕКСТ-->
<div class="title_txt">[_title]</div>
<div class="txt">
[_text]
<p align="right"><a href="javascript:history.go(-1);">Назад</a></p>
</div>
<div class="txt">Автор: [_author] | [_date_b]</div>
<div class="end"></div>
<br />
<!-- ПОХОЖИЕ ПОСТЫ -->
[_morepost]
<!-- ПОХОЖИЕ ПОСТЫ -->
<br />
<!--ТЕКСТ-->

 

Заключение

 

Ну что же, еще один модуль на нашем блоге Крутой Поздравляю! Подмигиваю В завершение покажу что получилось у меня:

 

результат работы

 

Не особо конечно красиво, да и заметка вывелась всего одна (их в базе данных всего две) но тем не менее все работает Улыбаюсь

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

Всего Вам наилучшего! У меня все!

Исходник

_________

P.S.: Вам когда-нибудь приходила в голову мысль: "Какие позиции занимает мой проект в поисковых системах?" Те кто задумывался подобным вопросом прекрасно знают, что не так уж и просто проанализировать свой проект, особенно бесплатно. Но выход из данного положения есть! Анализ своего сайта можно произвести с помощью сервиса megaindex.ru. Как именно пользоваться данным сервисом можете почитать в посте Мегаиндекс (megaindex) на замечательном блоге ktonanovenkogo.ru

 

Возможно Вам будут интересны следующие заметки

Комментарии (5)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
IgorOkCJ, 10 Октября 2012 г. 16:43 пишет:
Гость
как по мне, так очень полезная штука на сайте!
нужно будет и себе такую сделать!
спасибо)
Виктор, 29 Января 2015 г. 23:51 пишет:
Читатель
Добрый день Алексей, не подскажите как реализовать чтобы выводилось еще и изображение похожей статьи рядом с заголовком. Я на движке сделал вывод изображений по другому, создал в таблице blog, поле url_images, то есть с ссылкой на изображение, в шаблоне вывел с как обычный текст, ток в в теге img. Попытался сделать чтобы в новых записях и в похожих, выводился не только заголовок с ссылкой на похожую или новую статью, а все это только с изображением новой или похожей записи. Подскажите что в этот код надо добавить, чтобы эта заработало
<?
if(!defined('USERPART')) die();
function newdoc($chpu)
{
$result_index = mysql_query("SELECT nameurl,title,id,cat FROM blog WHERE viewindex!='0' AND pablick='1' ORDER BY date_b DESC LIMIT 5");
$myrow_index = mysql_fetch_array($result_index);

//Подсчитываем количесво sql запросов
global $maxSQL;
$maxSQL++;
//Подсчитываем количесво sql запросов

if($myrow_index != "")
{
$sm_read = getTPL('newdoc.tpl.php');

preg_match("/\[_divmenu\](.*?)\[_divmenu\]/s",$sm_read,$a);

do
{
$edd_tamp = $a[1];

if($chpu == 0)$href = "<a href=\"index.php?blog=".$myrow_index['id']."\">".$myrow_index['title']."</a>";
else $href = "<a href=\"".gen_catalog($myrow_index['cat']).$myrow_index['nameurl']."\">".$myrow_index['title']."</a>";

$edd_tamp = str_replace("[_station]",$href,$edd_tamp);

$link .= $edd_tamp;
}
while($myrow_index = mysql_fetch_array($result_index));
$newdoc = preg_replace("/\[_divmenu\].*?\[_divmenu\]/s",$link,$sm_read);
}
return $newdoc;
}
?>
Спасибо за ранее.
Алексей, 30 Января 2015 г. 11:00 пишет:
Автор
Что-то типа такого
<?
if(!defined('USERPART'))
    die();

    function newdoc($chpu)
{
    $sql = ''
        . 'SELECT'
            . ' url_images,' // добавил Ваше новое поле в выборку SELECT
            . ' nameurl,'
            . ' title,'
            . ' id,'
            . ' cat'
        . ' FROM'
            . ' blog'
        . ' WHERE'
            . '     viewindex != \'0\''
            . ' AND pablick    = \'1\''
        . ' ORDER BY date_b DESC LIMIT 5'
    ;
    
    $result_index   = mysql_query($sql);
    $myrow_index    = mysql_fetch_array($result_index);

    //Подсчитываем количесво sql запросов
    global $maxSQL;
    $maxSQL++;
    //Подсчитываем количесво sql запросов

    if($myrow_index != "") {
        $sm_read = getTPL('newdoc.tpl.php');

        preg_match("/\[_divmenu\](.*?)\[_divmenu\]/s", $sm_read, $a);

        do {
            $edd_tamp = $a[1];

            if($chpu == 0)
                $href = "<a href=\"index.php?blog=".$myrow_index['id']."\">".$myrow_index['title']."</a>";
            else
                $href = "<a href=\"".gen_catalog($myrow_index['cat']).$myrow_index['nameurl']."\">".$myrow_index['title']."</a>";
                
            // добавляем слева от ссылки изображение
            $href = '<img src="' . $myrow_index['url_images'] . '">' . $href;

            $edd_tamp = str_replace("[_station]", $href, $edd_tamp);

            $link .= $edd_tamp;
        }
        while($myrow_index = mysql_fetch_array($result_index));
        
        $newdoc = preg_replace("/\[_divmenu\].*?\[_divmenu\]/s", $link, $sm_read);
    }
    return $newdoc;
}
?>
Ответ для пользователя: Виктор
Виктор, 01 Февраля 2015 г. 20:32 пишет:
Читатель
Спасибо большое.
Ответ для пользователя: Алексей
Станислав, 04 Февраля 2015 г. 01:56 пишет:
Гость
Доброго времени суток Уважаемый Алексей. У Вас случайно не найдется времени, помочь мне реализовать поиск по сайту, может у Вас какие то заготовки есть, для RS-Blog 2.8.0, сторонний поиск никак не могу внедрить. Буду очень благодарен если Вы поможете, думаю не только мне.