我正在博客首页上进行一个相当复杂的自定义查询,并尝试使用循环显示结果,如下所示: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);
我得到了正确的帖子。只有在使用循环函数时,才会输出错误的结果。
有没有一种规范的、正确的方法可以做到这一点?