我有一个博客,我需要根据一个完全自定义的表中的值的数量重新排序。我不使用元数据的原因有点复杂,但这正是我需要做的
我只需要计算表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__in
和orderby=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;
}