Последние сообщения с форума SMF

Буквально только что пришлось решать проблему, как вывести на главной странице WordPress последние сообщения на форуме под управлением движка SMF. Спешу поделиться!

Итак варианта два. Первый самый простой — через RSS. Для этого добавляем в виджет «RSS» такую ссылку:

http://site.ru/forum/index.php?type=rss;action=.xml

Последние сообщения с форума SMF

Способ универсальный для любого форума, даже если он располагается на стороннем домене. Однако, был выявлен один неприятный баг, в результате которого пришлось от него отказаться и использовать другой вариант. А заключался он в том, что новые сообщения на форуме показывались с большим опозданием по времени. В чем причина — в движке или в сервере или еще в чем-то — я разбираться не стал и реализовал запасной вариант. Называется он SSI (Server Side Includes) — включенная в SMF система транслирования той или иной информации для компоновки разных данных на странице. Чтобы отобразить последние новые сообщения на форуме, добавляем в виджет код:

где «/home/local/public_html/forum/» — абсолютный путь до корневой папки форума. Да, форум должен находиться на одном хостинге и аккаунте с вашим сайтом, то есть в поддомене или внутренней папке. И плюс к этому, у вас должна быть активирована поддержка вставки php кода из виджетов или вставьте этот код напрямую в шаблон.

После этого открываем файл forum/Sources/Security.php и удаляем или закомментируем код:

function is_admin()
{
isAllowedTo('admin_forum');
}

В принципе в таком виде все будет работать. Однако, если форум и сайт в разных кодировках, например форум в windows-1251, а сайт на WP в utf-8, то вместо русских букв могут быть знаки вопросов. Как вариант, чтобы не мучиться с кодировками, отображать только заголовок темы последних записей в виде ссылки + дату публикации — это отображается без проблем.

Настройки для вывода информации по SSI находятся в файле SSI.php, который лежит в корне форума.

Открываем его и находим строки:

// Recent topic list:   [board] Subject by Poster       Date

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

function ssi_recentTopics($num_recent = 5, $exclude_boards = null, $output_method = 'echo')

Как вы уже поняли, за это отвечает параметр «$num_recent = 5».

Далее смотрим, что содержится в массиве после строки

// Build the array

а именно:

$posts[] = array(
                        'board' => array(
                                'id' => $row['ID_BOARD'],
                                'name' => $row['bName'],
                                'href' => $scripturl . '?board=' . $row['ID_BOARD'] . '.0',
                                'link' => '' . $row['bName'] . ''
                        ),
                        'topic' => $row['ID_TOPIC'],
                        'poster' => array(
                                'id' => $row['ID_MEMBER'],
                                'name' => $row['posterName'],
                                'href' => empty($row['ID_MEMBER']) ? '' : $scripturl . '?action=profile;u=' . $row['ID_MEMBER'],
                                'link' => empty($row['ID_MEMBER']) ? $row['posterName'] : '' . $row['posterName'] . ''
                        ),
                        'subject' => $row['subject'],
                        'short_subject' => shorten_subject($row['subject'], 25),
                        'preview' => $row['body'],
                        'time' => timeformat($row['posterTime']),
                        'timestamp' => forum_time(true, $row['posterTime']),
                        'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . ';topicseen#new',
                        'link' => '' . $row['subject'] . '',
                        'new' => !empty($row['isRead']),
                        'new_from' => $row['new_from'],
                        'icon' => 'Последние сообщения с форума SMF',
                );
        }
        mysql_free_result($request);

Добавим в него новый параметр

'pubDate' => gmdate('d.m.Y', $row['posterTime']),

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

А за вывод всего этого на странице отвечает код под строкой

// Just return it.

то есть:

if ($output_method != 'echo' || empty($posts))
                return $posts;

        echo '
                

‘; foreach ($posts as $post) echo ‘ ‘; echo ‘

[‘, $post[‘board’][‘link’], ‘]‘, $post[‘subject’], ‘ ‘, $txt[525], ‘ ‘, $post[‘poster’][‘link’], ‘ ‘, $post[‘new’] ? ” : ‘Последние сообщения с форума SMF‘, ‘‘, $post[‘time’], ‘

‘; }

Поменяем на свой — более простой и без ошибок в кодировке с использованием нашего параметра вывода даты публикации :

// Just return it.
        if ($output_method != 'echo' || empty($posts))
                return $posts;

        foreach ($posts as $post)

                echo '

                        

                                
‘, $post[‘subject’], ‘‘, $post[‘pubDate’], ‘

‘; }

Получаем такой результат:

Последние сообщения с форума SMF

Я показал один из вариантов, который меня устроил. Вы можете пойти дальше и разрешить проблему с кодировками для того, чтобы задействовать весь функционал SSI в SMF и отображать полную информацию о ваших последних сообщениях на форуме. Примерами можете делиться в комментариях к статье!

Оцените статью