2014-10-31 121 views
0

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

我只需要计数表wp_upvotes其中有WordPress的博客文章的ID匹配postID的行数,并通过最“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

如果你想确保有各表之间的匹配,你是正确的使用LEFT JOIN - 一个简单的方法来思考它是“左侧”(wp_posts)中的所有内容将包含在内,如果匹配则包含“右侧”(wp_upvotes)的内容,否则为空。只要使用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为WP_Query与post_id__inorderby=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; 
} 
+0

感谢您的信息和精力,但它似乎并不奏效,它不返回任何结果:( – 2014-10-31 18:20:55

+0

你可以在SQL工具中运行它吗?我只是免费的forme d有可能出现语法错误,或者$ pageNum或$ numToLoad没有被设置?尝试删除它们,看看它是否有效。 – doublesharp 2014-10-31 18:37:30

+0

它似乎是很好的SQL,并且这两个值确实正在设置。 – 2014-10-31 18:43:53