Список пользовательских комментариев, правильная глубина

Вопрос или проблема

Я создал специальную функцию comments_list(), она работает хорошо, единственная проблема заключается в том, чтобы отображать дочерние комментарии внутри родительского div. Она работает хорошо с первыми и вторыми уровнями глубины, но не для других.

Вот мой код:

/* -----------------------------------------------------------------------------
 * Пользовательские функции комментариев
 * -------------------------------------------------------------------------- */
// Пользовательский список комментариев
function t_one_comments_list( $comment, $args, $depth ) {
    $GLOBALS['comment'] = $comment;
    switch( $comment->comment_type ) :
        case 'pingback' :
        case 'trackback' : ?>
        <li <?php comment_class(); ?> id="comment<?php comment_ID(); ?>">
            <div class="back-link"><?php comment_author_link(); ?></div>
    <?php
            break;
        default :
    ?>
</li>
<?php if ($depth == 1) {?>
   <div <?php comment_class('media'); ?> id="comment-<?php comment_ID(); ?>">
        <?php if ($comment->comment_approved == '0') : ?>
            <p><?php _e('Ваш комментарий ожидает модерации.', 't_one') ?></p>
        <?php endif; ?>
            <div class="pull-left">
                <?php echo get_avatar( $comment, 100 ); ?>
            </div>
            <div class="media-body">
                <div class="well">
                    <div class="media-heading">
                        <strong><?php comment_author(); ?></strong>&nbsp; <small><?php printf( __('%1$s', 't_one'), get_comment_date()) ?></small>
                        <?php edit_comment_link(__(' Редактировать', 't_one'), ' ', '' ); ?>
                        <?php comment_reply_link( array_merge( $args, array( 
                                'reply_text' => __( '<i class="fa fa-repeat"></i>Ответить', 't_one' ),
                                'depth' => $depth,
                                'max_depth' => $args['max_depth'] 
                                ) ) ); ?>
                    </div>
                    <p><?php comment_text() ?></p>
            </div>
            <?php if ( $depth + 1) { ?>
            <div <?php comment_class('media'); ?> id="comment-<?php comment_ID(); ?>">
        <?php if ($comment->comment_approved == '0') : ?>
            <p><?php _e('Ваш комментарий ожидает модерации.', 't_one') ?></p>
        <?php endif; ?>
            <div class="pull-left">
                <?php echo get_avatar( $comment, 100 ); ?>
            </div>
            <div class="media-body">
                <div class="well">
                    <div class="media-heading">
                        <strong><?php comment_author(); ?></strong>&nbsp; <small><?php printf( __('%1$s', 't_one'), get_comment_date()) ?></small>
                        <?php edit_comment_link(__(' Редактировать', 't_one'), ' ', '' ); ?>
                        <?php comment_reply_link( array_merge( $args, array( 
                                'reply_text' => __( '<i class="fa fa-repeat"></i>Ответить', 't_one' ),
                                'depth' => $depth,
                                'max_depth' => $args['max_depth'] 
                                ) ) ); ?>
                    </div>
                    <p><?php comment_text() ?></p>
            </div>
            </div>

            <?php } ?>
            </div>
         <?php } ?>
    <?php // Завершение стандартного стиля комментария
        break;
    endswitch;
}

Как правильно использовать $depth?

Спасибо заранее!

Боюсь, что проблема в этом:

Ошибочно:

<?php if ( $depth + 1) { ?>

Правильно:

<?php if ( $depth > 1) { ?>

Вот что я думаю…

Ответ или решение

Для того чтобы правильно обрабатывать вложенные комментарии в функции t_one_comments_list, необходимо учесть, что переменная $depth отвечает за уровень вложенности комментария. Ваш текущий код работает корректно для первых и вторых уровней, но вводит ошибки при отображении более глубоких уровней. Давайте разберёмся с вашей проблемой более детально.

Анализ кода

Ключевой момент заключается в том, как вы используете переменную $depth для определения уровня вложенности комментарии. В вашем коде есть неправильная проверка:

<?php if ( $depth + 1) { ?>

Это условие просто проверяет, больше ли $depth 0, что не соответствует необходимой логике для вывода комментариев на разных уровнях. Вместо этого вы правильно заметили, что нужно использовать:

<?php if ( $depth > 1) { ?>

Это условие позволяет выполнять действия, когда уровень вложенности больше 1, что является правильным способом обработки уровней комментариев.

Корректировка реализации

Чтобы ваша функция t_one_comments_list корректно отображала комментарии всех уровней, вам нужно немного изменить структуру кода, а именно:

  1. Убедитесь, что проверка глубины верно определяет нужный уровень комментария.
  2. Убедитесь, что каждый уровень комментария правильно вложен внутри своего родительского комментария.

Вот примерный подход к исправлению вашего кода:

function t_one_comments_list( $comment, $args, $depth ) {
    $GLOBALS['comment'] = $comment;

    switch( $comment->comment_type ) :
        case 'pingback':
        case 'trackback':
            echo '<li ' . comment_class() . ' id="comment-' . comment_ID() . '">';
            echo '<div class="back-link">' . comment_author_link() . '</div>';
            break;

        default:
            echo '<li ' . comment_class('media') . ' id="comment-' . comment_ID() . '">';
            if ($comment->comment_approved == '0') {
                echo '<p>' . __('Your comment is awaiting moderation.', 't_one') . '</p>';
            }
            echo '<div class="pull-left">' . get_avatar( $comment, 100 ) . '</div>';
            echo '<div class="media-body"><div class="well"><div class="media-heading">';
            echo '<strong>' . comment_author() . '</strong> <small>' . sprintf(__('on %s', 't_one'), get_comment_date()) . '</small>';
            edit_comment_link(__(' Edit', 't_one'), ' ', '');

            comment_reply_link(array_merge($args, array(
                'reply_text' => __('<i class="fa fa-repeat"></i> Reply', 't_one'),
                'depth' => $depth,
                'max_depth' => $args['max_depth']
            )));
            echo '</div><p>' . comment_text() . '</p></div></div>';
            break;
    endswitch;

    // Убедитесь, что мы закрываем теги <li> и <div> этажей корректно
    echo '</li>';
}

Заключение

Следуя вышеперечисленным рекомендациям, вы сможете реализовать корректное отображение всех уровней комментариев, начиная с родительского и заканчивая самыми глубокими дочерними слоями. Использование переменной $depth требует внимательности, чтобы структура разметки оставалась логичной и правильно вложенной.

Для повышения качества и доступности кода вы также можете рассмотреть возможность добавления комментариев и документации, чтобы облегчить понимание структуры и функциональных возможностей вашей реализации как для себя, так и для будущих разработчиков.

Оцените материал
Добавить комментарий

Капча загружается...