如何使用$wpdb->GET_RESULTS()让循环工作

时间:2011-05-01 作者:Pekka

我正在博客首页上进行一个相当复杂的自定义查询,并尝试使用循环显示结果,如下所示:Displaying posts using a custom SELECT query

该查询按包含日期的自定义字段筛选帖子(仅显示该字段设置为今天或以后的帖子),并按该日期排序。

查询返回正确的帖子,但如果我将它们交给循环,结果会显示为我在执行常规查询,而不是专门的查询(即显示错误的帖子)。

里面的人this forum thread 有同样的问题;我使用了此处显示的$GLOBALS解决方案,但没有任何效果。

  global $post;
  global $wpdb;

 $querystr = "SELECT wposts.* FROM $wpdb->posts wposts ...... some conditions and joins";
 $eventsPosts = $wpdb->get_results($querystr, OBJECT);

 print_r($eventsPosts); // shows CORRECT data      

 if ($wpdb->num_rows > 0)
  foreach ($eventsPosts as $post) 
   {

    /* workaround */
    $stored_post = clone $GLOBALS[\'post\']; // Why, Wordpress, why?
    $GLOBALS[\'post\'] = $post;              // Why are you making me do such terrible things?

    setup_postdata($post);
    the_post();
    the_title(); // shows INCORRECT post

    /* workaround: Restore global */
    $GLOBALS[\'post\'] = clone $stored_post;

   }
然而,这个输出给我的结果就像我做了一个常规查询,而不是我的特殊查询。Ie,the_title() 输出不在查询结果中的帖子标题。

如果我测试输出自定义查询结果:

print_r($eventsPosts);
我得到了正确的帖子。只有在使用循环函数时,才会输出错误的结果。

有没有一种规范的、正确的方法可以做到这一点?

1 个回复
SO网友:Pekka

原来我没有严格按照手册中的说明进行操作:我似乎已经声明global $post 太早了。我并没有完全看透这一点,但现在使用以下代码可以很好地工作:

$eventsPosts = $wpdb->get_results($querystr, OBJECT);

if ($eventsPosts)
 {
   global $post;
   foreach ($eventsPosts as $post) 
    { 
     setup_postdata($post);
     the_title(); // or whatever - the loop functions work
    }  
 }

结束

相关推荐

Pagination with custom loop

我的问题可能是Pagination not working with custom loop, 但有一种不同。我使用自定义循环来显示flash游戏。我想按类别在游戏页面上分页。类别php:<?php if ($cat) { $cols = 2; $rows = 4; $paged = ((\'paged\')) ? get_query_var(\'paged\') : 1; $post_per_page = $cols * $rows; // -1 s