Удаление родительского комментария приводит к неправильному отображению дочерних комментариев

И заплатка, решающая эту проблему

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

К счастью, есть простое решение.

Сначала :

[-]
Download comment.php
Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php     (revision 10475)
+++ wp-includes/comment.php     (working copy)
@@ -739,6 +739,8 @@
        if ( ! $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id) ) )
                return false;
 
+       $wpdb->update($wpdb->comments, array('comment_parent' => $comment->comment_parent), array('comment_parent' => $comment_id));
+
        $post_id = $comment->comment_post_ID;
        if ( $post_id && $comment->comment_approved == 1 )
                wp_update_comment_count($post_id);

Теперь объяснение: патч добавляет строку в файл wp-includes/comment.php в функцию wp_delete_comment(), которая переназначает дочерние комментарии родителю удаляемого комментария. Если удаляемый комментарий не имеет родителей (является корнем), дочерние комментарии переносятся на верхний уровень.

Тем, кому лень патчить WordPress, привожу полный текст исправленной функции wp_delete_comment():

[-]
View Code PHP
function wp_delete_comment($comment_id) {
    global $wpdb;
    do_action('delete_comment', $comment_id);

    $comment = get_comment($comment_id);

    if ( ! $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id) ) )
        return false;

    $wpdb->update($wpdb->comments, array('comment_parent' => $comment->comment_parent), array('comment_parent' => $comment_id));

    $post_id = $comment->comment_post_ID;
    if ( $post_id && $comment->comment_approved == 1 )
        wp_update_comment_count($post_id);

    clean_comment_cache($comment_id);

    do_action('wp_set_comment_status', $comment_id, 'delete');
    wp_transition_comment_status('delete', $comment->comment_approved, $comment);
    return true;
}
Автор: ; опубликовано в: Патчи; метки: WordPress, комментарии, ошибка, патч
1
Фев
2009

RSS Комментарии к статье «Удаление родительского комментария приводит к неправильному отображению дочерних комментариев» (10)  »

  1. Хотя патч предназначен для самой последней версии WordPress (2.7.1-beta1), тем не менее, он успешно накладывается на любую версию из ветки 2.7

  2. О, отлично, спасибо!

  3. а авторам про ошибку написал про это чтобы исправили в следующем релизе хотя бы?

  4. Точно, есть. просто у тебя ссылки на статьи и ссылки на теги (которых на порядок больше тут в блоге) ничем не отличаются визуально я их часто и не просматриваю. может стоит их как нибудь цветом или еще как то выделять по другому?

  5. Фикс попал в WordPress, ожидается в 2.7.2

    Changeset 10762
    Changeset 10763

  6. Тем, кому день патчить

    Опечатка – поправьте.

  7. Владимир, а в последней версии эта проблема снята?

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Удаление родительского комментария приводит к неправильному отображению дочерних комментариев»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा