Вывод последнего поста в RSS ленте форума XenForo

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

Автор . Дата: 05.04.2016

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

Открываем файл /library/XenForo/Model/Thread.php и добавляем константу FETCH_LASTPOST после константы FETCH_FORUM_OPTIONS.

    const FETCH_FORUM_OPTIONS = 0x20;
    const FETCH_LASTPOST = 0x40;

Затем находим блок условия if ($fetchOptions['join'] & self::FETCH_FIRSTPOST) и после него добавляем следующий блок:

            if ($fetchOptions['join'] & self::FETCH_LASTPOST)
            {
                $selectFields .= ',
                    last_post.message as last_post_message, last_post.attach_count as last_post_attach_count';
                $joinTables .= '
                    LEFT JOIN xf_post AS last_post ON
                        (last_post.post_id = thread.last_post_id)';
            }

Должно получиться вот так:

            if ($fetchOptions['join'] & self::FETCH_FIRSTPOST)
            {
                $selectFields .= ',
                    post.message, post.attach_count';
                $joinTables .= '
                    LEFT JOIN xf_post AS post ON
                        (post.post_id = thread.first_post_id)';
            }

            if ($fetchOptions['join'] & self::FETCH_LASTPOST)
            {
                $selectFields .= ',
                    last_post.message as last_post_message, last_post.attach_count as last_post_attach_count';
                $joinTables .= '
                    LEFT JOIN xf_post AS last_post ON
                        (last_post.post_id = thread.last_post_id)';
            }

Далее открываем файл library/XenForo/ViewPublic/Forum/GlobalRss.php. В нем находим код:

            if (!empty($thread['canViewContent']) && !empty($thread['message']) && XenForo_Application::getOptions()->discussionRssContentLength)
            {
                $snippet = $bbCodeSnippetParser->render(XenForo_Helper_String::wholeWordTrim($thread['message'], XenForo_Application::getOptions()->discussionRssContentLength));

                if ($snippet != $thread['message'])
                {
                    $snippet .= "\n\n[url='" . XenForo_Link::buildPublicLink('canonical:threads', $thread) . "']" . $thread['title'] . '[/url]';
                }

                $content = trim($bbCodeParser->render($snippet));

                if (strlen($content))
                {
                    $entry->setContent($content);
                }
            }

И меняем на:

            if (!empty($thread['canViewContent']) && !empty($thread['last_post_message']) && XenForo_Application::getOptions()->discussionRssContentLength)
            {
                $snippet = $bbCodeSnippetParser->render(XenForo_Helper_String::wholeWordTrim($thread['last_post_message'], XenForo_Application::getOptions()->discussionRssContentLength));

                if ($snippet != $thread['last_post_message'])
                {
                    $snippet .= "\n\n[url='" . XenForo_Link::buildPublicLink('canonical:threads', $thread) . "']" . $thread['title'] . '[/url]';
                }

                $content = trim($bbCodeParser->render($snippet));

                if (strlen($content))
                {
                    $entry->setContent($content);
                }
            }

Вот собственно и все, после этих манипуляций в RSS ленте будет отдаваться не первое сообщение темы а последнее.


comments powered by HyperComments