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

时间:2014-10-31 17:29:36

标签: php mysql wordpress

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

我只需要计算表格wp_upvotes中的行数,这些行的postID与WordPress博客文章的ID相匹配,并按大多数“upvotes”排序至少。即使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);  

1 个答案:

答案 0 :(得分:1)

如果你想确保每个表之间匹配,那么使用LEFT JOIN是正确的 - 一个简单的方法来考虑它是“左边的所有” “(wp_posts)将被包括在内,如果匹配则包含”右“(wp_upvotes)的内容,否则为空。仅使用JOIN将确保只有匹配时才会显示两个表中的行。

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

注意,使用wp_posts.date代替wp_posts.post_date时也会出错;

使用$wpdb-posts$wpdb-prefix属性也是个好主意,以防您想要在数据库前缀不是wp_的情况下使用它。

如果您只想在wp_posts中查看数据结果,可以使用ORDER BY运行数据库查询并返回列,或者如果要使用WordPress过滤器(在the_title()the_content()之类的内容可以将帖子ID传递给带有post_id__inorderby=post__in参数的WP_Query - 您需要引用$upvotes值然而,通过ID。

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;
}