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

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

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

Сначала патч:

[-]
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;
}
Добавить в закладки

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

1
Фев
2009

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

  1. Vladimir says:

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

  2. sonika says:

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

  3. Lecactus says:

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

  4. Lecactus says:

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

  5. Vladimir says:

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

    Changeset 10762
    Changeset 10763

  6. Nikolay says:

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

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

Подписаться на RSS-ленту комментариев к статье «Удаление родительского комментария приводит к неправильному отображению дочерних комментариев» Trackback URL: http://blog.sjinks.org.ua/wordpress/patches/495-deleting-parent-comment-causes-child-comments-to-be-incorrectly-displayed/trackback/

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

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

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

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