我有一个自定义的帖子类型,并创建了存档模板archive-custom\\u post\\u type。php,其中包括一个搜索表单。
然后,我使用pre\\u get\\u posts向查询中添加参数以筛选结果。
然而,为了确保这只发生在这个归档页面上,我想检查一些事情。首先,我要检查post类型是否匹配。
但后来我想检查is\\u search()参数,结果发现它是false。
如何以及何时定义?我能做些什么让WP知道正在进行搜索吗?
pre\\u get\\u posts回调
$post_type = get_query_var( \'post_type\' );
if ( $post_type === \'document\' ) {
$params = $_POST;
if ( $params ) {
$query->set( \'s\', $params[\'keyword\'] );
$query->set( \'order\', $params[\'order\'] );
$query->set( \'orderby\', $params[\'order_by\'] );
}
}
归档文档。php
<?php get_header(); ?>
<?php get_template_part( \'my-slug\', \'document-filter\' ); ?>
<div id="search-results">
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div>
<?php the_title(); ?>
</div>
<?php endwhile; else : ?>
<p>Sorry, no posts matched your criteria</p>
<?php endif; ?>
</div>
<?php get_footer(); ?>
文档筛选器。php
<form id="document-filter" method="post">
<select name="order_by">
<option value="date">Date</option>
<option value="title">Name</option>
</select>
<select name="order">
<option value="desc">DESC</option>
<option value="asc">ASC</option>
</select>
<input name="keyword" type="text" placeholder="Filter by keyword" value=""/>
<input type="submit" />
</form>
SO网友:Z. Zlatev
仅命名关键字输入s
<input name="s" type="text" placeholder="Filter by keyword" value=""/>
这足以让WP将请求识别为搜索,而且您不必执行
$query->set( \'s\', ... )
后来
在里面pre_get_posts
操作使用条件is_post_type_archive( \'document\' )
因此,您的if语句如下所示:
if ( is_post_type_archive(\'document\') && is_search() ) {
...
}
希望有帮助
Update
由于您正在搜索,搜索模板(search.php,index.php)将优先于存档。您还需要过滤WP为这些请求分配的模板。
add_filter( \'search_template\', function ( $template ) {
if ( is_post_type_archive(\'document\') && is_search() ) {
$find_template = locate_template( [\'archive-document.php\'] );
if ( \'\' !== $find_template ) {
$template = $find_template;
}
}
return $template;
});