我有一个博客,我需要根据完全自定义表格中的值数量重新排序。我不使用元数据的原因有点复杂,但这正是我需要做的。
我只需要计算 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
是正确的 - 一种简单的思考方式是 everything “左侧”(wp_posts
) 将被包含,“右侧”(wp_upvotes
) 的内容如果匹配则将被包含,否则为空。只需使用 JOIN
即可确保只有匹配时才会显示两个表中的行。
我的猜测是您需要包含一个 GROUP BY p.ID
以使每个 upvotes
值特定于特定帖子。
请注意,您在使用 wp_posts.date
而不是 wp_posts.post_date
时也会出错;
如果您想在某个数据库前缀不是wp_
.
如果您只想查看 wp_posts
中的数据结果,您可以使用 ORDER BY
运行数据库查询并返回列,或者如果您想要要使用 WordPress 过滤器(在 the_title()
和 the_content()
之类的东西上,您可以将帖子 ID 传递到带有 post_id__in
的 WP_Query 和orderby=post__in
参数 - 但是,您需要通过 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;
}
关于php - WordPress 帖子,按自定义表格结果排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26680319/