Забытые трафикогенерящие темы

Автор gorbi, 12 июля 2020, 09:47:32

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gorbi

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

Попробую объяснить идею, может кто предложить другое решение, более дешёвое.

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

Вопрос - как вычислить по просмотрам такие темы и как их поднимать - автоматом или руками.

Цель банальная - увеличить просмотры без больших усилий и увеличить время, проведённое на форуме.

На этой идее живут Пикабу, Реддит, Хабр и так далее.

Yarik

Цитата: gorbi от 12 июля 2020, 09:47:32Вопрос - как вычислить по просмотрам такие темы
https://g-news.com.ua/forum_smf/index.php?action=stats
Первая десятка тем (по количеству просмотров)

gorbi

Цитата: S.T.A.L.K.E.R. от 12 июля 2020, 10:09:27https://g-news.com.ua/forum_smf/index.php?action=stats
Первая десятка тем (по количеству просмотров)

Нет, это не оно. Это длинные многостраничные темы, я их без статистики знаю. И это за всё время. 
За день, неделю и месяц будет совсем другая статистика. Она намного интереснее ) Там будет секс, цены на еду и другой Хайп

gorbi


Yarik

Цитата: gorbi от 12 июля 2020, 10:21:10За день, неделю и месяц будет совсем другая статистика.
Получается за текущий день,неделю,месяц?

gorbi

Цитата: S.T.A.L.K.E.R. от 12 июля 2020, 10:39:25Получается за текущий день,неделю,месяц?
Ну да. Не обязательно автоматизировать, можно на уровне запросов руками в БД

gorbi

Идея кажется рабочей, но перепроверить руками не мешает )

Yarik

Цитата: gorbi от 12 июля 2020, 10:56:28Идея кажется рабочей, но перепроверить руками не мешает )
Можно посмотреть как работает вывод статистики родной.Ну и взять его за основу.

Ulibka

Вы имеете ввиду - что если на главной спустится в самый низ - то будет: ?
Последние сообщения
Наиболее популярная тема за последние 24 часа

gorbi

Цитата: Ulibka от 12 июля 2020, 18:05:14Вы имеете ввиду - что если на главной спустится в самый низ - то будет: ?
Там популярная по числу каментов за 24 часа. В идеале хотелось бы сделать пункт меню Популярное и соответствующую страницу. Глубина просмотров и время точно увеличится. И выхлоп с рекламы )

Ulibka

Посмотрите у меня в самом низу:
https://woodcraftsman.ru/
Последние сообщенияПоследние сообщения

Сам запрос у меня лежит в stored proc, настраивается весьма в широких пределах.

gorbi

Мне же нужны популярные, а не последние.

Ulibka

У меня сейчас работает так:

Сделал stored proc. (Только MYSQL !)
В таблицу _topics_last заносятся топики, удовлетворяющие нужному Вам условию
(В моем случаи - это последние посты)
Если более подробно опишите нужное Вам условие - то могу скорректировать под Вас.

Попутно замечу что вынос работы с данными в stored proc позволяет существенно упростить работу с данными и что немаловажно - разработку и отладку запроса.

Второй Select выдает данные для SMF

create procedure get_last_topics_post(IN num_last_post int)
begin
    select value into @recycle_board from smf_settings where variable="recycle_board" limit 1;

    CREATE TEMPORARY TABLE IF NOT EXISTS _topics_last AS (
        select T.id_topic,T.id_last_msg from smf_topics T
        inner join smf_boards sb on T.id_board = sb.id_board
        where T.id_board != @recycle_board # {int:recycle_board}
        and sb.member_groups like '%-1,0%' # просмотр должен быть разрешен для всех
        order by T.id_last_msg desc limit num_last_post
    );

    SELECT m.poster_time,
           m.subject,
           m.id_topic,
           m.id_member,
           m.id_msg,
           IFNULL(mem.real_name, m.poster_name) AS poster_name,
           m.id_board,
           b.name                               AS board_name,
           SUBSTRING(m.body, 1, 385)            AS body,
           m.smileys_enabled
    FROM smf_messages AS m
             INNER JOIN smf_boards AS b ON (b.id_board = m.id_board)
             LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member)
             inner join _topics_last tl on tl.id_last_msg=m.id_msg and tl.id_topic=m.id_topic
    order by m.poster_time desc;
end;





В файле
Subs-Recent.php
Надо заменить функцию getLastPosts на эту: (протестировано только на SMF 2.017)

// Get the latest posts of a forum.
function getLastPosts($latestPostOptions)
{
   global $scripturl, $txt, $user_info, $modSettings, $smcFunc, $context;

    $request = $smcFunc['db_query']('',
        'call get_last_topics_post ( {int:likely_max_msg})',
        array(
            'likely_max_msg' =>  $latestPostOptions['number_posts'],
        )
    );


   $posts = array();
   while ($row = $smcFunc['db_fetch_assoc']($request))
   {
      // Censor the subject and post for the preview ;).
      censorText($row['subject']);
      censorText($row['body']);

      $row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']), array('<br />' => '&#10;')));
      if ($smcFunc['strlen']($row['body']) > 128)
         $row['body'] = $smcFunc['substr']($row['body'], 0, 128) . '...';

      // Build the array.
      $posts[] = array(
         'board' => array(
            'id' => $row['id_board'],
            'name' => $row['board_name'],
            'href' => $scripturl . '?board=' . $row['id_board'] . '.0',
            'link' => '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['board_name'] . '</a>'
         ),
         'topic' => $row['id_topic'],
         'poster' => array(
            'id' => $row['id_member'],
            'name' => $row['poster_name'],
            'href' => empty($row['id_member']) ? '' : $scripturl . '?action=profile;u=' . $row['id_member'],
            'link' => empty($row['id_member']) ? $row['poster_name'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['poster_name'] . '</a>'
         ),
         'subject' => $row['subject'],
         'short_subject' => shorten_subject($row['subject'], 24),
         'preview' => $row['body'],
         'time' => timeformat($row['poster_time']),
         'timestamp' => forum_time(true, $row['poster_time']),
         'raw_timestamp' => $row['poster_time'],
         'href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#msg' . $row['id_msg'],
         'link' => '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#msg' . $row['id_msg'] . '" rel="nofollow">' . $row['subject'] . '</a>'
      );
   }
    $smcFunc['db_free_result']($request);

   global $db_connection;
    @mysqli_next_result($db_connection);


   return $posts;
}




P.S. Искал - но не нашел спойлер - поэтому получилось длинно

digger®

#13
Цитата: Ulibka от 14 июля 2020, 09:37:57У меня сейчас работает так:
А ssi_recentTopics не то же самое делает? Причем более правильно, с учетом прав доступа, игнорирования разделов, неодобренных тем и прочего.

И так и не понимаю, зачем здесь сделана конструкция из хранимой процедуры, временной таблицы и двух запросов. Тут вполне достаточно просто одного запроса к smf_topics без всех этих обвесов.
 

Ulibka

Есть ньюансы :)
Про существование ssi_recentTopics я не знал

Сама конструкция из двух запросов использовалась в оригинальной версии getLastPosts
Права доступа я учел:
sb.member_groups like '%-1,0%'

игнорирование разделов, неодобренные темы правда не включил .

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