这与此问题类似: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。
我确信我只是缺少了一些简单的东西,可以让我将结果从插件层传递给循环。有什么建议吗?谢谢
最合适的回答,由SO网友:Philip Schweiger 整理而成
找到要使用的正确挂钩。这将截取查询并允许我出于自己的目的修改它:
add_filter(\'posts_request\', \'changeQuery\');
function changeQuery($query) {
$query = \'my new sql query here\';
return $query;
}