我创建了一个自定义查询,以从自定义帖子类型中提取所有帖子,按评论计数排序。这是您的常规自定义查询:
<?php
$querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wposts.post_status = \'publish\'
AND wposts.post_type = \'Tutorials\'
ORDER BY wposts.comment_count DESC
";
$tutorialposts = $wpdb->get_results($querystr, OBJECT);
?>
<?php if ($tutorialposts): ?>
<?php global $post; ?>
<?php $i = 0; ?>
<?php foreach ($tutorialposts as $post): ?>
<?php $i++; ?>
<?php setup_postdata($post); ?>
<h2><?php echo $i ?>: <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"> <?php the_title(); ?></a></h2>
<?php endforeach; ?>
<?php endif; ?>
它添加了一些代码来对帖子进行编号。但我删除了这段代码,同样的问题仍然存在。
它实际上做了它应该做的!事实上,它对做它应该做的事情非常兴奋,以至于它做了两次。
还有,如果有人能告诉我如何解析这段代码,这样它只显示查询检索到的前10篇文章,那就太好了。但我自己可能会想出来,那只是我有点懒。
我真的只想知道为什么它会拉每个帖子并显示两次o.0
最合适的回答,由SO网友:Chris_O 整理而成
确实没有理由使用原始sql查询帖子。您可以使用WordPress API完成几乎任何类型的查询。完整参考请参见法典,Function Reference query posts. 请尝试以下操作:
global $post;
$args=array(
\'post_type\' => \'tutorial\',
\'orderby\' => \'comment_count\',
\'posts_per_page\' => 10
);
$posts= query_posts($args);
foreach ($posts as $post) :
//do stuff
endofforeach;
SO网友:wyrfel
你为什么要加入postmeta
如果你不在WHERE
也没有从中获得一块田地?
您的双重结果是因为您运行的是一个非独特的查询,并且由于您加入了Posteta,MySQL为每个Posteta记录提供了一个单独的记录,即使您只从posts
.
所以要么放弃postmeta
加入或执行SELECT DISTINCT
, 前者更好。
我同意Chris\\u O。。。如果可以的话,最好使用查询变量,因为WP会确保不会给自己带来这种麻烦。