您正在混合表单显示和搜索逻辑。这是代码中的第一件坏事。
其次,每次运行查询时都会触发您使用的钩子,甚至是函数内部的查询,这会导致无限循环。
因此,首先,将逻辑与显示分离:
function vkss_super_search_form( $atts = \'\' ) {
$atts = shortcode_atts( array(
// your default params
), $atts );
// some code you have here
ob_start();
?>
<div id="sbc">
<form method="get" action="<?php echo $blog_url; ?>" id="ss-search">
<input type="text" value="<?php $search_text ?>" name="supers" onblur="if (this.value == \'\') { this.value = \'<?php echo $search_text; ?>\';}" />
<?php echo $list; ?>
<input type="submit" id="sbc-submit" value="Search" />
</form>
</div>
<?php
return ob_get_clean();
}
add_shortcode(\'vkss_super_search\', \'vkss_super_search_form\');
上一个函数通过快捷码打印表单。
现在,您必须在提交表单时运行搜索。您想使用search.php
但您必须注意,没有人强制将该文件放在主题上,因此您必须提供index.php
(就像WordPress一样)如果该文件不存在。
您可以使用\'pre_get_posts\'
, 检查\'supers\'
GET变量存在,如果存在,请运行更改主查询。之后search.php
将由WordPress使用,因为您正在设置搜索查询。
add_action(\'pre_get_posts\', \'vkss_super_search\');
function vkss_super_search( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_front_page() ) {
$supers = filter_input( INPUT_GET, \'supers\', FILTER_SANITIZE_STRING );
if ( empty( $supers ) ) return;
$query->is_search = true;
$query->set( \'s\', $supers );
// $query->set( \'category__not_in\', 1 );
}
}
请注意,所有第二个代码块
unnecessary 如果命名输入字段
\'s\'
而不是
\'supers\'
.
<input type="text" value="{$search_text}" name="s" />