Вопрос или проблема
Я создал специальную функцию 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> <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> <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
корректно отображала комментарии всех уровней, вам нужно немного изменить структуру кода, а именно:
- Убедитесь, что проверка глубины верно определяет нужный уровень комментария.
- Убедитесь, что каждый уровень комментария правильно вложен внутри своего родительского комментария.
Вот примерный подход к исправлению вашего кода:
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
требует внимательности, чтобы структура разметки оставалась логичной и правильно вложенной.
Для повышения качества и доступности кода вы также можете рассмотреть возможность добавления комментариев и документации, чтобы облегчить понимание структуры и функциональных возможностей вашей реализации как для себя, так и для будущих разработчиков.