WordPress帖子,按自定义表格结果排序


WordPress Posts, order by custom table results

我有一个博客,我需要根据一个完全自定义的表中的值的数量重新排序。我不使用元数据的原因有点复杂,但这正是我需要做的

我只需要计算表wp_upvotes中与WordPress博客文章的ID匹配的postID的行数,并按最多到最少的"赞成票"排序。即使wp_upvotes表中没有值,这个结果也应该包括WordPress帖子。

我正在尝试的查询是:

$post = $wpdb->get_results("
     SELECT wp_posts.*, COUNT(wp_upvotes.id) AS upvotes
     FROM wp_posts 
     LEFT JOIN wp_upvotes 
               ON wp_posts.ID = wp_upvotes.postID 
               WHERE wp_posts.post_status = 'publish'  
               AND wp_posts.post_type = 'post'
      ORDER BY upvotes DESC, wp_posts.date DESC 
      LIMIT $pageNum, $numToLoad
  ", ARRAY_A);  

如果你想确保每个表之间都有匹配,那么使用LEFT JOIN是正确的——一个简单的想法是,"左边"(wp_posts)上的所有都会被包括在内,如果匹配,"右边"(wp_upvotes)上的东西也会被包括进来,否则为null。仅使用JOIN将确保只有在匹配的情况下才会显示两个表中的行。

我的猜测是,您需要包含一个GROUP BY p.ID,以使每个upvotes值都特定于特定的帖子。

请注意,使用wp_posts.date而不是wp_posts.post_date时也会出现错误;

如果您想在某个数据库前缀不是wp_的地方使用$wpdb-posts$wpdb-prefix属性,那么使用它们也是一个好主意。

如果你只想在wp_posts中看到数据的结果,你可以用ORDER BY运行一个数据库查询并返回列,或者如果你想使用WordPress过滤器(在像the_title()the_content()这样的东西上,你可以把帖子ID传递到带有post_id__inorderby=post__in参数的WP_query中),你需要通过ID引用回$upvotes

global $wpdb;
$sql = <<<SQL;
    SELECT p.*, COUNT(v.id) as upvotes
    FROM {$wpdb->posts} p
    JOIN {$wpdb->prefix}upvotes v
      ON p.ID = v.postID
    WHERE 
      p.posts_status = 'publish'
      AND p.post_type = 'post'
    GROUP BY p.ID
    ORDER BY upvotes DESC, p.post_date DESC
    LIMIT $pageNum, $numToLoad
SQL;
// use ARRAY_A to access as $row['column'] instead of $row->column
$rows = $wpdb->get_results( $sql ); 
foreach ( $rows as $row ){
    $content = $row->post_content;
    $upvotes = $row->upvotes;
}