mat
  • 0
Новичок

Вложенные комментарии игнорируются для максимального количества на страницу в wordpress

  • 0

У меня есть настройка по умолчанию (IIRC) 10 комментариев на страницу и максимальная вложенность 5 в глубину.

Проблема (или, по крайней мере, небольшая неприятность) заключается в том, что ответы на комментарии не учитываются при подсчете максимум десяти на страницу. Я могу понять, что вы не хотите разрывать нить, и этого следует избегать, но в моем тестовом примере у меня есть:

test10
- test10 2
- test10 3
- - test10 4
- - - test10 5
- - test10 6
- test10 7
- test10 8
- test10 9
test9
test8 (should be on a new page?)
test7
test6
test5
test4
test3
test2
test1

Все они отображаются на одной странице. Но на самом деле я хочу сломать это после комментария test9.

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

Share
  1. Лично я не думаю, что это можно сделать без взлома основных файлов. Просматривая основные файлы WP, я не могу найти никаких фильтров или хуков для изменения этой функциональности. Вы пробовали смотреть какие-то плагины? wordpress.org/extend/plugins/paginated-comments может корректно подсчитывать количество комментариев на странице.

    • 0
    • @Брэди, у меня было ощущение, что так и будет. Я пробую этот плагин и, возможно, несколько других, чтобы посмотреть, есть ли у них какие-либо решения, или, возможно, добавить фильтр или хук, который я мог бы использовать.

      • 0
    • Этот конкретный плагин действительно работает… За исключением того, что он, похоже, не поддерживает вложенность XD. Тем не менее, он дал мне интересную идею, которую я добавлю к вопросу в качестве идеи для решения.

      • 0
    • красиво, мне нужно было что-то подобное. Но есть еще один побочный эффект: WP get_comment_link / get_page_of_comment не будет работать с ним, поскольку они вычисляют целевую страницу на основе простого SQL-запроса, который не учитывает дочерние комментарии. Чтобы исправить это в рамках отправки комментариев (когда вы публикуете ответный комментарий на старой странице), вам просто нужно установить скрытый ввод redirect_to с текущим URL-адресом страницы комментариев, поэтому WP будет использовать этот URL-адрес и избегать функций, которые я упомянул. Я все еще ищу способ исправить это на других страницах, которые их используют, например, на панели управления комментариями…

      • 0
  2. Так как я решил, что это будет чертовски полезно и для меня, я продолжил и написал собственный ходок, Walker_Paged_Threaded .

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

    Как это использовать

    Класс написан с тем же абстрактным подходом, что и оригинал Walker, чтобы не ограничиваться только комментариями. Однако для простоты мы переименуем его в * ;

    Walker_Comment_Paged_Threaded extends Walker_Comment
    

    Теперь в вашей теме comments.php ;

    wp_list_comments( array( 'walker' => new Walker_Comment_Paged_Threaded ) );
    

    Эй! Постраничные комментарии, учитывающие многопоточность.

    Известные побочные эффекты

    Так как мы изменили способ расчета страниц, функции типа get_comment_pages_count начинают вести себя ненормально при передаче таких параметров, как $per_page или $threaded . Однако из коробки это не так.

    Тем не менее, get_comment_pages_count все равно будет отступать, Walker_Comment если $wp_query::max_num_comment_pages пусто. Но если вы wp_list_comments сначала позвоните, он запустит ходок и автоматически установит свойство.

    Если вы показываете разбиение на страницы комментариев или ссылки на страницы перед вашими комментариями, вам нужно сделать что-то вроде этого;

    <?php
    
    /**
     * Capture comments in an output buffer. The function needs to run before
     * displaying page links, as it runs the walker and then sets the
     * 'max_num_comment_pages' property on $wp_query.
     */
    ob_start();
    
    wp_list_comments( array( 'walker' => new Walker_Comment_Paged_Threaded ) );
    $comments_list = ob_get_clean();
    
    ?>
    
    <?php paginate_comments_links(); ?>
    
    <?php echo $comments_list; ?>
    

    На самом деле это самый изящный способ обойти это, поверьте мне!

    * Если вы хотите сохранить его абстрактным, без нескольких копий для каждого намерения, вы можете подделать «множественное наследование», что немного уродливо.

    NB Я подумал, что лучше добавить это как отдельный ответ, так как на самом деле это ответ!

    • 0
  3. Сначала я такой «ну-ну», а потом такой «о да!» 😉

    Что здорово, так это то, что все «разбиение на страницы» выполняется в PHP. Другими словами, это просто foreach циклы и вложенные массивы, а не ограничения и смещения SQL.

    Настоящую суть работы можно свести к Walker::paged_walk() (в частности, примерно на полпути метода).

    По сути, он перебирает комментарии и складывает их по их родителю, а затем вычисляет, какой фрагмент «верхнего уровня» должен отображаться (на основе аргументов $page_num и ). $per_page Затем он просто зацикливается на этом «срезе», а также зацикливает дочерние комментарии (если они есть).

    Это можно и нужно сделать! Все, что нужно, — это хороший ум, чтобы применить ту же логику, но также добавить в картину вложенные комментарии. Я это или нет — другой вопрос!

    Но я решил опубликовать это сейчас, просто чтобы пролить свет на этот вопрос и, надеюсь, продолжить работу.

    NB Есть еще один метод, Walker::get_number_of_root_elements(), который используется только ( по get_comment_pages_count() крайней мере, в ядре). Однако эта функция используется повсеместно, поэтому, несмотря на то, что следует из названия метода, ей также необходимо будет приспособиться к новому алгоритму и инкапсулировать дочерние элементы.

    • 0
  4. Возможно, вы захотите поиграть с Walker_Comment wp-includes/comment-template.php.

    • 0

Оставить ответ

You must login to add an answer.