SQL 按喜欢对 wordpress 中的嵌套评论进行排序

SQL to sort nested comments in wordpress by likes

希望有好心人能帮帮我。

我想按喜欢对 wordpress 中的嵌套评论进行排序。我只找到一个插件可以做到这一点,但它不能满足我的需求,所以我正在尝试编写自己的插件。其中大部分实际上非常简单,但 sql 却让我望而却步(不是我的强项)。

我需要一个 SQL 查询来按喜欢对评论进行排序,回复紧跟在 parent 之后,并且对每个 parent 的回复也按喜欢排序。顶级评论和回复以 'layer' 区分。只有一级回复。我的 table 看起来像这样:

ID(整数)

Comment_Name (可变字符)

Layer (Int)... 1 用于顶级评论,2 用于回复

ID_of_Parent_Comment (Int)... 回复必须分组在具有此 id

的顶级评论下

喜欢(整数)

例如,如果顶级评论用数字表示,回复用字母表示,则看起来像这样:

1、2、3、3a、3b、4、5、5a...等等

有人有什么想法吗?

看起来应该很接近:

select 
  post.ID,
  post.likes as postLikes,
  reply.ID,
  reply.likes as replyLikes
from MyTable post
  left join MyTable reply
    on post.ID = reply.ID_of_Parent_Comment
where post.ID_of_Parent_Comment is  null
order by post.likes desc, reply.likes desc
;

它将为您提供按 parent 喜欢排序的 parent ID 以及按最喜欢 [=] 排序的每个 parent(如果有)的相关 child ID 15=]

事实证明,另一个答案终究不太成立。它看起来确实不错。回复在适当的家长评论下方很好地分组,一切都按喜欢排序。但是如果你仔细观察,sqlfiddle 测试返回了 14 条记录,而只有 12 条可用。

在我的网站上花了太多时间摆弄它之后,我无法进一步解决它。一组或另一组(顶级评论或回复)总是被遗漏或重复。

最后放弃了,假设用SQL做不出来,于是又回到了自己熟悉的东西:php。这是我的解决方案。希望有人会发现它有用。如果不出意外,这是一个有趣的项目。

myComments.php

<?php

global $wpdb;

$post_ID = get_the_ID();

// Get Comment Table
$sql =
 " SELECT *"
." FROM wp_comments"
." WHERE comment_post_ID = " . $post_ID     // only retrieve comments for this post
." AND comment_parent = '0'"                // only retrieve top level comments
." ORDER BY likes DESC"
.";";
$tlc = $wpdb->get_results($sql, ARRAY_A);   // Retrieve all records into $tlc
                                            // this should never be
                                            // large enough to be a problem.
$commentCount = count( $tlc );              // Number of TopLevelComments

// Adjust Comments
for ( $i = 0; $i <= $commentCount-1; $i++ ) {
    $tlc[$i]['layer'] = 0;                  // Layer 0 indicates top level comment
    $tlc[$i]['index'] = $i;                 // index is used to group parents 
                                            // with children
}

// Get Reply Table
$sql =
 " SELECT *"
." FROM wp_comments"
." WHERE comment_post_ID = " . $post_ID
." AND comment_parent > '0'"                        // only retrieve replies
." ORDER BY likes DESC"
.";";
$replies = $wpdb->get_results($sql, ARRAY_A);
$replyCount = count( $replies );

// Adjust Replies
for ( $i = 0; $i <= $commentCount-1; $i++ ) {
    $replies[$i]['layer'] = 1;                      // Layer 1 indicates replies
}

// Set child index to that of parent
// then add child record to parent array
for ( $i = 0; $i <= $replyCount-1; $i++ ) {
    $x = $replies[$i]['comment_parent'];            // Get ID of parent
    for ( $j = 0; $j <= $commentCount-1; $j++ ) {
        if ( $tlc[$j]['comment_ID'] == $x ) {       // If parent found
            $value = $tlc[$j]['index'];             // Get parent's index
            $replies[$i]['index'] = $value;         // Give child parent's index
            array_push ( $tlc, $replies[$i]);
        }
    }
}

// Sort comments
// Note that $tlc was sorted by select
// and index was assigned while in that order
$tlc = array_orderby($tlc,  'index', SORT_ASC, 
                            'layer', SORT_ASC,
                            'likes', SORT_DESC);

// Display comments
$commentCount = count($tlc);
if ( $commentCount ) {
    echo "<ol class='commentNumbering'>";
    // Used to determine if we have opened a second <ol> for nested comments
    // and ensure we close it before we are done.
    $inReplyList = false;
    // We don't want to close the <ol> before we've opened it.
    $firstComment = true;
    for ( $i = 0; $i <= $commentCount-1; $i++ ) {
        $myComment = $tlc[$i];
        // Set $depth (needed by reply-link on myCommentTemplate page)
        $depth = 0;
        $comment_ID = $myComment['comment_ID'];
        while( $comment_ID > 0  ) {
            $tempComment = get_comment( $comment_ID );
            $comment_ID = $tempComment->comment_parent;
            $depth++;
        }
        // Treat each group of nested comments as a separate ordered group
        if ( $depth == 2 ) {
            if ( ! $inReplyList ) {
                echo "<ol>";
                $inReplyList = true;
            }
        } else {
            if ( ! $firstComment ) {
                if ( $inReplyList ) {
                    echo "</ol>";
                    $inReplyList = false;
                }
            }
        }
        $firstComment = false;
        // Display each comment
        include ('myCommentTemplate.php');
    }
    if ( $inReplyList ) {
        echo "</ol>";
    }
    echo "</ol>";
} else {
    echo 'No comments found.';
}
// Where comments are made
include('myCommentForm.php');

$wpdb->flush();

?>

函数array_orderby()(位于functions.php)

/* SORT PHP ARRAYS OF RECORDS */

// PHP function 'array_multisort' requires columns //
// This function handles the conversion from row to col and back again //

// Example:
// $sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);

function array_orderby()
{
    $args = func_get_args();
    $data = array_shift($args);
    foreach ($args as $n => $field) {
        if (is_string($field)) {
            $tmp = array();
            foreach ($data as $key => $row)
                $tmp[$key] = $row[$field];
            $args[$n] = $tmp;
            }
    }
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}