Для начала,
если у вас выводятся комментарии только на записях, а на страницах нет - то см. вот эту инструкцию:
Нет формы и не работают комментарии на страницах 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; ?>