1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.3.x Вывод последних тем форума вне форума (wordpress) - проблемка

Тема в разделе "Для новичков", создана пользователем bvlk, 15.07.2014.

Загрузка
  1. bvlk

    bvlk Пользователь

    Регистрация:
    28.02.13
    Сообщения:
    46
    Симпатии:
    0
    Версия XF:
    1.0.0
    Уже давно стоит у меня этот код в вордпрессе, который выводит последние темы со всего форума, сейчас мне нужно сделать вывод только из определенных разделов, и это не работает

    Код:
          $forum_ids = 'ALL'; // Укажите с каких разделов брать последние темы, либо укажите "ALL" что бы брать со всего форума.
    В этом месте пробовал ставить цифру раздела, вместо ALL например 33, и он ничего не показывает, хотя новые темы там есть.

    Помогите решить проблемку

    Код:
    <?php
            // Ниже укажите имя, пароль и имя бд для подключения.
            $database_host = 'localhost'; // по стандарту это localhost
            $database_username = 'username'; // Имя к БД
            $database_password = 'password'; // Пароль к БД
            $database_db = 'db'; // Имя БД
    
            $forum_url = 'http://infinitecrisis.ru/forum/'; // Укажите тут путь к вашему форуму (независимо от папки в которой он находится)
    
            $limit = 9; // Укажите лимит на отображение последних тем.
    
            $forum_ids = 'ALL'; // Укажите с каких разделов брать последние темы, либо укажите "ALL" что бы брать со всего форума.
    
            mysql_connect($database_host, $database_username, $database_password);
            mysql_select_db($database_db);
    
            $where = '';
            if ($forum_ids != 'ALL')
            {
                $where = 'WHERE `node_id` IN ($forum_ids)';
            }
    
            $sql_forum = "SELECT `title`, `thread_id` FROM `xf_thread` {$where} ORDER BY `last_post_date` DESC LIMIT {$limit}";
    
            $query_forum = mysql_query($sql_forum);
                while ($topics = mysql_fetch_assoc($query_forum))
                {
                    $url_title = str_replace(' ', '-', $topics['title']);
                    $url_title = str_replace('.', '', $url_title);
                    $url_title = str_replace('?', '', $url_title);
                    $url_title = str_replace('/', '-', $url_title);
                    $url_title = str_replace('\\', '-', $url_title);
                    $url_title = str_replace('"', '-', $url_title);
                    echo "<img src='http://infinitecrisis.ru/arrow_right.png'>&nbsp;<a href=\"{$forum_url}index.php?threads/{$url_title}.{$topics['thread_id']}/\">{$topics['title']}</a><br>";
                }
            ?>
    
     
  2. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Запустите его в скрипте вне форума. Будет работать?
     
  3. bvlk

    bvlk Пользователь

    Регистрация:
    28.02.13
    Сообщения:
    46
    Симпатии:
    0
    Версия XF:
    1.0.0
    он у меня и работает вне форума, с ALL , мне пояснили проблему уже, надо ещё во 2ом куске менять :
    $where = '';
    if ($forum_ids != 'ALL')
    --- добавлено : 15 июл 2014 в 21:40 ---
    хотя пока не получается :( поставил и там и там и ничего
    --- добавлено : 15 июл 2014 в 21:54 ---
    вообщем не пашет, ребят нету альтернативы как вывести подобным кодом последние темы из определенных разделов, ну ооооочень надо
     
    Последнее редактирование модератором: 23.07.2014
  4. OlegM

    OlegM Местный

    Регистрация:
    10.03.13
    Сообщения:
    37
    Симпатии:
    2
    Версия XF:
    1.4.3
    Запрос должен получиться типа:
    PHP:
    $sql_forum "SELECT `title`, `thread_id` FROM `xf_thread` WHERE `node_id` IN (1,3,5) ORDER BY `last_post_date` DESC LIMIT {$limit}";
     
  5. bvlk

    bvlk Пользователь

    Регистрация:
    28.02.13
    Сообщения:
    46
    Симпатии:
    0
    Версия XF:
    1.0.0
    спасибо ! работает
    --- добавлено : 17 июл 2014 в 21:00 ---
    у меня дополнительный вопрос, как сделать лимит на кол-во символов в выводе, кол-во символов в названии темы
     
    Последнее редактирование модератором: 25.07.2014
  6. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Замените
    Код:
    title
    на

    Код:
    SUBSTR (`title`, 1, 80) AS title
    80 - количество символов, до которого нужно обрезать title.

    Если библиотеки XenForo доступны вам в вашем скрипте, лучше воспользоваться хелпером XenForo уже при выводе:

    PHP:
    $threadTitle XenForo_Template_Helper_Core::helperWordTrim($thread['title'], 50);
    Кстати говоря, вот тут было приведено решение.
     
    Последнее редактирование: 17.07.2014
    OlegM нравится это.
  7. OlegM

    OlegM Местный

    Регистрация:
    10.03.13
    Сообщения:
    37
    Симпатии:
    2
    Версия XF:
    1.4.3
    Можно еще добавить к запросу
    PHP:
     AND `discussion_state`='visible' AND `discussion_type`!='redirect' 
    в итоге должно получиться
    PHP:
    $sql_forum "SELECT `title`, `thread_id` FROM `xf_thread` WHERE `node_id` IN (1,3,5) AND `discussion_state`='visible' AND `discussion_type`!='redirect' ORDER BY `last_post_date` DESC LIMIT {$limit}";
    Это позволит избежать дублей тем в виде редиректов при перемещении тем. Кстати, дубли есть в модулях [bd] Widget Framework.

    Мой полный код при отображении тем из заданных разделов:
    PHP:
    <?php
    ini_set
    ('error_reporting''-1');
    if (!
    ini_get('display_errors')) {
        
    ini_set('display_errors''1');
    }
    // Ниже укажите имя, пароль и имя бд для подключения.
    $config['db']['host'] = 'localhost';
    $config['db']['username'] = '';
    $config['db']['password'] = '';
    $config['db']['dbname'] = '';

    $limit 10;
    $fidx_raw "1,3,5"// Отображать темы ТОЛЬКО их этих узлов.
    $forumDirectory realpath(__DIR__).'/../'// Полный путь к форуму

    if(!$forumDirectory) {
        die(
    '$forumDirectory is incorrect!');
    }

    require(
    $forumDirectory'/library/XenForo/Autoloader.php');

    XenForo_Autoloader::getInstance()->setupAutoloader($forumDirectory '/library');

    // Initializing application
    XenForo_Application::initialize($forumDirectory '/library'$forumDirectory);

    if (
    $fidx_raw) {
        
    $fidx_final "IN ($fidx_raw)";
    }

    // Requesting last N viewable nodes `title`, `thread_id`
    $sql_forum "SELECT `thread_id`, `title`, `last_post_id` FROM `xf_thread` WHERE `node_id` "
                
    .$fidx_final AND `discussion_state`='visible' AND `discussion_type`!='redirect' ORDER BY `last_post_date` DESC LIMIT $limit";
    $lastThreads XenForo_Application::get('db')->fetchAll($sql_forum);

    // Произвольный код
    echo '<ul class="recenttopic">';

    // Отображение содержимого
    foreach ($lastThreads as $thread) {
        
    // Построение пути к теме
        
    $threadUrl XenForo_Application::get('options')->boardUrl '/' XenForo_Link::buildPublicLink('threads'$thread);

        
    $postModel XenForo_Model::create('XenForo_Model_Post');
        
    $post $postModel->getPostById($thread['last_post_id']);

        
    $bbCodeParser = new XenForo_BbCode_Parser(new XenForo_BbCode_Formatter_Wysiwyg);

        
    $bbCodeOptions = array(
            
    'showSignature' => false,
            
    'states' => array(
                
    'viewAttachments' => false
            
    )
        );

        
    $message XenForo_ViewPublic_Helper_Message::getBbCodeWrapper($post$bbCodeParser$bbCodeOptions);
          
        
    // Trimming and escaping
        
    $threadTitle XenForo_Template_Helper_Core::helperWordTrim($thread['title'], 90);

        
    $message strip_tags($message);
        
    $message preg_replace('!\[.+?\]!is'''$message);
        
    $message XenForo_Template_Helper_Core::helperWordTrim($message150); // Обрезка сообщения до 150 символов.
        
    $message preg_replace('![\n\r\t]{1,5}!'' '$message);

        
    // Отображение ссылок на темы
       
    echo "<li><a href=\"$threadUrl\" title=\"$message\" target=\"_blank\">$threadTitle</a></li>";
    }
    echo 
    '</ul>';
    Сам скрипт у меня лежит в library и инклюдится из корня форума другим скриптом, поэтому в коде такие пути.

    Почему всё сделано именно так - без понятия (взято с других форумов), главное работает. :) Если кто-нибудь объяснит необходимость используемых функций фреймворка - будем благодарны. ;)
     
    Последнее редактирование: 17.07.2014
  8. bvlk

    bvlk Пользователь

    Регистрация:
    28.02.13
    Сообщения:
    46
    Симпатии:
    0
    Версия XF:
    1.0.0
    Код:
    $sql_forum = "SELECT `SUBSTR (`title`, 1, 80) AS title`, `thread_id` FROM `xf_thread` WHERE `node_id` IN (1,3,5) ORDER BY `last_post_date` DESC LIMIT {$limit}";
    так чтоли?
     
  9. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Перед SUBSTR и после title бектиков не должно быть.
     
  10. bvlk

    bvlk Пользователь

    Регистрация:
    28.02.13
    Сообщения:
    46
    Симпатии:
    0
    Версия XF:
    1.0.0
    перестает работать так

    Код:
    $sql_forum = "SELECT SUBSTR (`title`, 1, 80) AS title, `thread_id` FROM `xf_thread` WHERE `node_id` IN (1,3,5) ORDER BY `last_post_date` DESC LIMIT {$limit}";
     
  11. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Что значит "перестает"?
     
  12. bvlk

    bvlk Пользователь

    Регистрация:
    28.02.13
    Сообщения:
    46
    Симпатии:
    0
    Версия XF:
    1.0.0
    то и значит ) перестает работать, ничего не выводит
     
  13. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Ну, я в таких случаях беру текст результирующего SQL оператора и вставляю его в phpMyAdmin для проверки :)
     

Поделиться этой страницей