z Магазин готовых блогов
под ключ с доменом и без
Более 900 Автонаполняемых сайтов Wordpress Ежедневно покупается 6-7 готовых сайтов.

как в WordPress вывести через php комментарии определённой записи (страницы)? в карточке продукта (можно в любом месте)

Для начала,
если у вас выводятся комментарии только на записях, а на страницах нет - то см. вот эту инструкцию:
Нет формы и не работают комментарии на страницах WordPress

На другой странице (в картчоке товара) я хочу через PHP вывести комментарии к другой записи (post)

<?php
// Укажите ID записи, комментарии к которой нужно вывести
$target_post_id = 250; // ← замените на нужный ID

// Получаем утверждённые комментарии к этой записи
$comments = get_comments( array(
    'post_id' => $target_post_id,
    'status'  => 'approve', // только одобренные
    'order'   => 'ASC'      // или 'DESC', как вам удобно
) );

if ( $comments ) :
    echo '<div class="comments-from-other-post">';
    echo '<h4>Комментарии к обзору:</h4>';
    echo '<ul class="comment-list">';
    foreach ( $comments as $comment ) :
        ?>
        <li class="comment-item">
            <div class="comment-author">
                <strong><?php echo esc_html( get_comment_author( $comment ) ); ?></strong>
                <?php echo '<span class="comment-date">' . get_comment_date( 'd.m.Y', $comment ) . '</span>'; ?>
            </div>
            <div class="comment-content">
                <?php echo wp_kses_post( $comment->comment_content ); ?>
            </div>
        </li>
        <?php
    endforeach;
    echo '</ul>';
    echo '</div>';
else :
    echo '<p>Нет комментариев к этой записи.</p>';
endif;
?>

Этот код:

  • добавляет возле заголовка еще и количество комментариев к этой записи
  • разрешает нужные теги (<p>, <br>, <strong>, <b>, <em>, <i>, <a>);
  • автоматически добавляет <p>, если их нет (через wpautop);
  • не экранирует HTML, а корректно его обрабатывает;
  • сохраняет вашу логику со склонением и структурой.
  • автоматически превращать URL в ссылки (rel="noopener noreferrer nofollow" и target="_blank")
  • выводит комментарии в случайном порядке, но при этом есть возможность легко отключить рандом
  • добавляет нумерацию (она привязывается к очередности комменатриев (как их добавляли) а не к рандому 1,2,3...
<?php
$target_post_id = 51197;
$enable_random_order = true; // true = рандом вывод, false = хронологический

// Получаем комментарии в порядке хронологии (старые → новые) — для правильной нумерации
$comments_original = get_comments( array(
    'post_id' => $target_post_id,
    'status'  => 'approve',
    'order'   => 'ASC',      // старые сначала → №1, №2, ...
    'orderby' => 'comment_date'
) );

// Создаём маппинг: comment_ID => порядковый номер
$comment_number_map = array();
foreach ( $comments_original as $index => $comment ) {
    $comment_number_map[ $comment->comment_ID ] = $index + 1; // №1, №2, ...
}

// Теперь решаем, в каком порядке ВЫВОДИТЬ
if ( $enable_random_order ) {
    shuffle( $comments_original ); // перемешиваем массив для рандомного вывода
}
$comments_to_display = $comments_original;

$comments_count = count( $comments_to_display );

// Склонение
if ( $comments_count == 0 ) {
    $word = 'отзывов';
} elseif ( $comments_count == 1 ) {
    $word = 'отзыв';
} elseif ( $comments_count >= 2 && $comments_count <= 4 ) {
    $word = 'отзыва';
} else {
    $word = 'отзывов';
}

// Функция обработки текста комментария (с ссылками и атрибутами)
function safe_comment_html_with_links( $text ) {
    $text = make_clickable( $text );
    $allowed = array(
        'p'      => array(),
        'br'     => array(),
        'strong' => array(),
        'b'      => array(),
        'em'     => array(),
        'i'      => array(),
        'u'      => array(),
        'del'    => array(),
        'a'      => array( 'href' => true ),
    );
    $text = wp_kses( $text, $allowed );
    $text = preg_replace(
        '/<a\s([^>]*)href=["\']([^"\'>]+)["\']([^>]*)>/i',
        '<a $1href="$2" $3 target="_blank" rel="noopener noreferrer nofollow">',
        $text
    );
    $text = preg_replace('/rel="[^"]*"/', 'rel="noopener noreferrer nofollow"', $text);
    return $text;
}
?>

<?php if ( $comments_to_display ) : ?>
    <div class="comments-from-other-post">
        <h4>Подтвержденные отзывы (<?php echo $comments_count . ' ' . $word; ?>):</h4>
        <ul class="comment-list">
            <?php foreach ( $comments_to_display as $comment ) : 
                $number = $comment_number_map[ $comment->comment_ID ];
            ?>
                <li class="comment-item ot" data-comment-id="<?php echo $comment->comment_ID; ?>">
                    <span class="comment-number">#<?php echo $number; ?></span>
                    <div class="comment-content">
                        <?php echo wpautop( safe_comment_html_with_links( $comment->comment_content ) ); ?>
                    </div>
                </li>
            <?php endforeach; ?>
        </ul>
    </div>
<?php else : ?>
    <div class="comments-from-other-post">
        <h4>Отзывов (0 шт):</h4>
        <p>Пока никто не оставил отзывы.</p>
    </div>
<?php endif; ?>

guest
Другие сообщения форума
Закрыть меню