在编写插件时将自定义查询的结果传递给循环

时间:2012-07-09 作者:Philip Schweiger

这与此问题类似:How to change a custom query into a standard loop? - 但我想在编写插件时这样做,而不是编写主题。

我需要能够运行自定义查询(使用常规的旧sql),并将结果设置为可用于循环的post。我正在写一个插件,所以模板标签、foreach循环等不是我想要的。我只想运行sql查询,选择正确的行,并告诉wordpress将其用作循环的post。

以下是我迄今为止所做的尝试:

add_filter( \'pre_get_posts\' , \'customQuery\' );

function customQuery() {
  global $wpdb;
  $sql = "some sql here";
  $safequery = $wpdb->prepare($sql);

  $queryResults = $wpdb->get_results($safequery);
}
这可用于检索我的预期结果。变量$queryResults 保存正确的数据。在那之后,我尝试了几件事,但都没有成功。

...snip...
global $post;
$post = $queryResults[0]; //since it is an array, and I just need the first result
那没用。或者更确切地说,如果我var_dump 就在那条线之后,$post 这是我所期望的,但当页面实际呈现时,它似乎在某个地方重置了,因为我得到了404。

我还尝试了:

...snip...
global $post;
$post = $queryResults[0];
setup_postdata($post); 
同样的结果。如果我马上检查变量的值,我就会看到我所期望的。在第二个例子中,我甚至试过,只是为了好玩the_title(); 这是可行的(但对我没有帮助,因为我正在尝试写一个插件,而不是一个主题)。但当我让页面运行到渲染时,我得到了404。

我确信我只是缺少了一些简单的东西,可以让我将结果从插件层传递给循环。有什么建议吗?谢谢

1 个回复
最合适的回答,由SO网友:Philip Schweiger 整理而成

找到要使用的正确挂钩。这将截取查询并允许我出于自己的目的修改它:

add_filter(\'posts_request\', \'changeQuery\');

function changeQuery($query) {
  $query = \'my new sql query here\';
  return $query;
}

结束

相关推荐