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