您的替换查询与后台运行的默认搜索查询之间发生冲突。
不要运行新的WP\\u查询,请尝试通过挂接到pre\\u get\\u帖子来修改默认查询:
function wpse276396_search_filter($query) {
if ( !is_admin() && $query->is_main_query() ) {
if ($query->is_search) {
$text = urldecode( get_query_var(\'search_text\') );
$my_products = aws_search_byozan($text);
$query->set(\'post_type\', \'product\');
$query->set(\'posts_per_page\', 2);
$query->set(\'post__in\', $my_products);
}
}
}
add_action(\'pre_get_posts\',\'wpse276396_search_filter\');
然后在模板中输出默认循环,而不是自定义WP\\U查询循环。
这样做的好处是,默认查询不会命中数据库一次,然后忽略结果,而是使用自定义查询来呈现页面,再加上paged
和posts_per_page
参数与WP的预期一致。
Edit: I somehow managed to miss that this is in a page template. 对于我来说,今天的WPSE已经足够了,但我将更新我的答案以反映这一点,而不是修改默认搜索查询(这仍然是一个更好的选项,除非您需要自定义搜索与内置搜索表单共存)。
在这种情况下,WP期望paged
和posts_per_page
要应用于获取搜索页面的主查询的参数,这意味着您链接的Codex页面上的说明绝对适用。
$my_products = aws_search_byozan($text);
global $query_string;
$query_args = explode("&", $query_string);
$search_query = array();
if( strlen($query_string) > 0 ) {
foreach($query_args as $key => $string) {
$query_split = explode("=", $string);
$search_query[$query_split[0]] = urldecode($query_split[1]);
} // foreach
} //if
global $paged;
$paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
$args = array(
\'post_type\' => \'product\',
\'posts_per_page\' => 2,
\'paged\' => $paged,
\'post__in\' => $my_products
);
$loop = new WP_Query( array_merge($search_query, $args ) );