Вывод посл. комментариев ВНЕ блога

Добрый день.
Есть задача – вывести последнее сообщение на странице сайта (вне блога) и несколько последних комментариев. С первой частью я разобрался, а вот вторую побороть не могу.

Вот код, которым выводится последнее сообщение:

<?php
// Include WordPress 
define('WP_USE_THEMES', false);
require('./ПАПКА БЛОГА/wp-blog-header.php');
query_posts('showposts=1');
?>

<?php while (have_posts()): the_post(); ?>
<p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br /><?php the_content(); ?></p>
<?php endwhile; ?>

Как добавить вывод комментариев к этому сообщению?

вероятно сходить сюда и поизучать:
http://codex.wordpress.org/Template_Tags#Comment_tags

Как оформить непосредственно вывод я разберусь – это не проблема. Можно взять из любого скина и оформить как нужно.
Непонятно, как получить комменты. Что-то вроде get_comment или как? Я практически незнаком с ВП

<? wp_widget_recent_comments() ?>

<? wp_widget_recent_comments() ?>

Это не работает _вне_ блога. Либо я не смог верно подключить. Может подскажете, как это подключается?

Вот в скине есть строка

<?php if ($comments) : ?>

Откуда берется значение переменной comments? Как мне его получить?

Это не работает _вне_ блога.

:rolleyes:

Извините, я Вашего языка не понимаю.

Есть сайт site.ru, есть блог на ВП site.ru/blog/.
Надо на странице сайта вывести тему с блога с комментариями.
Предложенная Вами конструкция выдает ошибку о необходимости подключения дополнительных файлов движка.

Сейчас мне нужно только получить значение переменной comments. Подскажите, как мне это сделать или, хотя бы, где можно в кодах покопаться? На кодексе я про комментарии не смог найти ничего полезного

Только два пути: либо подключать весь движок (это большой цельный комплекс, а не куча мелких скриптов), либо писать свой скрипт, работающий напрямую с базой.
http://forum.maxsite.org/viewtopic.php?id=1604
http://forum.maxsite.org/viewtopic.php?id=7391

Эти ссылки дают ответ только на вопрос "Как вывести сообщения?". Код, который я привел в первом сообщении делает это намного лучше и проще. Да и гибкость настройки позволяет сделать более удобную форму вывода.

Только мне одно непонятно: если я этим кодом могу вывести сообщения и, при добавлении строки

<?php comments_number('Нет комментариев', 'Один комментарий', '% коммент.' );?>

, количество комментариев, то почему я не могу также ловко вывести сам текст комментариев?

Чего мне не хватает, как можно это дело решить?

Вот, к примеру есть тэг comment_text();
Как мне его использовать, чтобы я мог получить комментарии к текущему сообщению?
Как организовать цикл в моём конкретном случае?

Вы случайно не обратили внимание, что в Темах форма комментариев вынесена в отдельный шаблон и что она подключается не инклюдом, а вызовом comments_template()? Если обратили, то могли бы посмотреть, что эта функция делает, кроме как подключает шаблон. А она как раз и заполняет массив $comments, который… короче, смотрите коды движка, если уж взялись программировать под него.

Хорошо. Попробуем подойти с другой стороны.
Предложенный Вами <? wp_widget_recent_comments() ?>
Выдает такую картину:

Warning: Missing argument 1 for wp_widget_recent_comments(), called in /home/www/..../1.php on line 12 and defined in /home/www/.../wp-includes/widgets.php on line 968

Warning: extract() [function.extract]: First argument should be an array in /home/www/.../wp-includes/widgets.php on line 970
Комментарии

    * Автор1 на Тема сообщения
    * Автор2 на Тема сообщения

Вопрос:
Какой формат использования этой функции, где можно изучить ее работу?
И можно ли с помощью этой функции вывести непосредственно текст комментария? (Судя по коду wp-includes/widgets.php – нельзя)

Изучить можно в /wp-includes/widgets.php 😀

А то возьмите какой-нибудь плагин из серии last/recent comments и выдерите из него код.

Как это я сразу не догадался 🙂

Вот такой получился код:

<?php
// Include WordPress 
define('WP_USE_THEMES', false);
require('./blog/wp-blog-header.php');
query_posts('showposts=1');
?>
<?php
function mdv_recent_comments($no_comments = 4, $comment_lenth = 10, $before = '<li>', $after = '</li>', $show_pass_post = false, $comment_style = 0) {
    global $wpdb;
    $request = "SELECT ID, comment_ID, comment_content, comment_author, comment_author_url, post_title FROM $wpdb->comments LEFT JOIN $wpdb->posts ON $wpdb->posts.ID=$wpdb->comments.comment_post_ID WHERE post_status IN ('publish','static') ";
    if(!$show_pass_post) $request .= "AND post_password ='' ";
    $request .= "AND comment_approved = '1' ORDER BY comment_ID DESC LIMIT $no_comments";
    $comments = $wpdb->get_results($request);
    $output = '';
    if ($comments) {
        foreach ($comments as $comment) {
            $comment_author = stripslashes($comment->comment_author);
            if ($comment_author == "")
                $comment_author = "anonymous"; 
            $comment_content = strip_tags($comment->comment_content);
            $comment_content = stripslashes($comment_content);
            $words=split(" ",$comment_content); 
            $comment_excerpt = join(" ",array_slice($words,0,$comment_lenth));
            $permalink = get_permalink($comment->ID)."#comment-".$comment->comment_ID;

            if ($comment_style == 1) {
                $post_title = stripslashes($comment->post_title);
                
                $url = $comment->comment_author_url;

                if (empty($url))
                    $output .= $before . $comment_author . ' on ' . $post_title . '.' . $after;
                else
                    $output .= $before . "<a href='$url' rel='external'>$comment_author</a>" . ' on ' . $post_title . '.' . $after;
            }
            else {
                $output .= $before . '<strong>' . $comment_author . ':</strong> <a href="' . $permalink;
                $output .= '" title="View the entire comment by ' . $comment_author.'">' . $comment_excerpt.'</a>' . $after;
            }
        }
        $output = convert_smilies($output);
    } else {
        $output .= $before . "None found" . $after;
    }
    echo $output;
}
?>

<?php while (have_posts()): the_post(); ?>
<p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br /> <?php the_content(); ?><br /> 
<?php comments_number('Нет комментариев', 'Один комментарий', '% коммент.' );?><br />
<? mdv_recent_comments() ?>
</p>
<?php endwhile; ?>

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

Смотрим, где функция берет инфу:
SELECT … FROM $wpdb->comments ….
Смотрим структуру таблицы и видим среди прочего поле comment_post_ID. Добавляем в SELECT условие:
… WHERE comment_post_ID=XXX AND post_status IN …
где XXX – номер поста, комментарии к которому нас интересуют.
Разумеется, с тем же успехом это условие можно дорисовать в строке $request .= "AND …
Если номер поста заранее неизвестен и меняется каждый раз, то его можно передать как параметр функции mdv_recent_comments.

Все понял, но вот как передать номер поста – не могу понять. Никак не получается

function mdv_recent_comments($post_ID=0, $no_comments = 4, …

… comment_post_ID=$post_ID …

<? mdv_recent_comments(get_the_ID()) ?>

Вот это мне и надо было. Я использовал the_ID(), поэтому ничего и не получалось.

Большое спасибо. Теперь все работает в лучшем виде. Можете эту тему в FAQ закинуть, наверняка еще кому-то пригодится.

Всё равно не найдут 😀

У меня еще вопрос возник.
ВП выдает все в кодировке utf-8, что естественно. А остальной текст страницы, на которой выводится результат работы этого кода – win-1251.
Как перекодировать вывод? iconv почему-то не помогает
Использовал так:

<?php echo iconv("utf-8", "windows-1251", the_title()); ?>
Результат не меняется

Потому что the_title() ВЫВОДИТ заголовок, а не возвращает его. Тут нужна функция get_the_title().

Спасибо.

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

Полный список функций – внутри движка 🙂

Anonymous
Отправить
Ответ на: