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

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

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

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

Сначала :

[-]
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(), которая переназначает дочерние родителю удаляемого комментария. Если удаляемый комментарий не имеет родителей (является корнем), дочерние переносятся на верхний уровень.

Тем, кому лень патчить , привожу полный текст исправленной функции 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;
}
Добавить в закладки

Связанные записи

Автор: Vladimir; опубликовано в: Патчи; метки: 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. Владимир, а в последней версии эта проблема снята?

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

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Изображения должны быть включены!

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

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