我知道这个问题已经被问过很多次了,从上午11点到晚上9点,我一整天都在尝试我遇到的每一个答案,我被卡住了。
这是我的搜索页面http://tribute-software.com/development/?s=1991
正如你所看到的,现在的搜索是针对1991年的。我在页面上打印了一些数据,这样可以帮助我们调试。它在打印的数据中显示了正确的10篇文章,并计算了正确的页数(2)--(我在后端将每页的文章数设置为4篇)。
单击第2页时,我无法获得任何结果。但当我搜索一个名字“Danielle”时,第2页就可以了。我已经在模板中重写了很多内容,并逐渐意识到,如果我的搜索来自post\\u标题,它将只显示第2页的结果。
通过查看页面,让我知道是否有任何明显的内容。我将在下面发布代码:
global $wp_query; /*were only keeping this so we can grab the s variable*/
//$numPostsFound = $wp_query->found_posts;
/*\'s\' is what the user typed in the search bar*/
$string = $wp_query->query[\'s\'];
//adhere to paging rules
$paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;
//Get all \'fallen_hero\' posts to start
$args = array(
\'post_type\' => \'fallen_hero\',
\'meta_key\' => \'hero_last_name\',
\'meta_type\' => \'\',
\'orderby\' => \'meta_value\',
\'order\' => \'ASC\',
\'post_status\' => \'publish\',
\'posts_per_page\' => -1,
);
$origPosts = new WP_Query( $args );
$posts1 = $origPosts->get_posts();
$ids = []; //array to store the id\'s of the wanted posts
/*Go through each post and check*/
foreach($posts1 as $post) {
setup_postdata( $post );
$classDate = get_field(\'class\'); //search if it matches class date
$fullName = $post->post_title; //search if it matches post title
//if its a match to one of the 2, add the ID to the array
if((stripos($fullName, $string) > -1) || $classDate == $string){
$ids[] = $post->ID;
}
}
wp_reset_postdata();
if (!empty($ids)) { //search the array of good IDs
/*make new query with the right IDs - need to do this to make pagination work*/
$args = array(
\'post__in\' => $ids,
\'post_type\' => \'fallen_hero\',
\'meta_key\' => \'hero_last_name\',
\'meta_type\' => \'\',
\'orderby\' => \'meta_value\',
\'order\' => \'ASC\',
\'post_status\' => \'publish\',
\'paged\' => $paged,
);
$results = new WP_Query( $args );
print_r($results);
//this is for the pagination at the bottom
$numPostsFound = count($ids);
然后在同一模板中
if ( function_exists(\'html5wp_cpt_pagination\') ) {
html5wp_cpt_pagination($results, $numPostsFound);
}
最后是我的自定义post类型分页(由我之前的其他人编写)
function html5wp_cpt_pagination($cpt_query, $numPostsFound){
$big = 999999999;
if($cpt_query->max_num_pages){
$maxpages = $cpt_query->max_num_pages;
}else{
//$maxpages= 20;
//echo $numPostsFound;
$maxpages = ceil($numPostsFound/get_option( \'posts_per_page\' ));
}
$paginate = paginate_links( array(
\'base\' => str_replace($big, \'%#%\', get_pagenum_link($big)),
\'type\' => \'array\',
\'format\' => \'?paged=%#%\',
\'current\' => max(1, get_query_var(\'paged\')),
\'total\' => $maxpages,
\'prev_text\' => __(\'«\'),
\'next_text\' => __(\'»\'),
));
if ($maxpages > 1) : ?>
<ul class="pagination">
<?php foreach ( $paginate as $page ) {
echo \'<li>\' . $page . \'</li>\';
} ?>
</ul>
<?php
endif;
}
EDIT步骤->1)从主查询(搜索查询)中获取“s”变量,以便我们可以将其与自定义帖子类型进行比较
2) 获取所有Fally\\u heroes帖子类型(是的,我知道我可以在这一部分中搜索元值,但我尝试扩展它,因为它没有那样工作)
3) 从上面收集的帖子中,搜索“s”字符串是否与字段“class”(用于class date)匹配,或者是否与人的姓名匹配(在本例中,我使用post\\u title)
4) 将所有匹配项添加到id[]数组,以便跟踪
5) 最后,使用ID数组查询所有Fally\\u hero帖子类型,但也要使用$paged,因为我们需要在此处进行分页。
SO网友:Milo
与其尝试使用默认的搜索查询,我将采用不同的方法,创建一个自定义搜索功能。
首先,在本例中,我们添加了一个新的自定义搜索查询varsearch_var
. 然后,我们添加了几个重写规则,这样我们就可以有如下URL:
http://example.com/custom-search/1991/
http://example.com/custom-search/1991/page/2/
使用此功能:
function wpd_custom_search_rules() {
add_rewrite_tag(
\'%search_var%\',
\'([^/]+)\'
);
add_rewrite_rule(
\'custom-search/([^/]+)/?$\',
\'index.php?post_type=fallen_hero&search_var=$matches[1]\',
\'top\'
);
add_rewrite_rule(
\'custom-search/([^/]+)/page/?([0-9]{1,})/?$\',
\'index.php?post_type=fallen_hero&search_var=$matches[1]&paged=$matches[2]\',
\'top\'
);
}
add_action( \'init\', \'wpd_custom_search_rules\' );
别忘了
flush rewrite rules 添加这些之后。您还需要更新搜索表单以使用此新的查询变量/模式。
以上规则只是为我们的帖子类型设置了基本的主查询,WordPress基本上将其标识为帖子类型档案。
下一步是修改这些主要查询,以提供我们想要的帖子。您可以将大部分现有查询代码粘贴到此处,然后将生成的ID数组传递给主查询:
function wpd_custom_search_query( $query ) {
if ( isset( $query->query[\'search_var\'] ) ) {
// your custom query code would go here
$post_ids = [23,42,66];
$query->set( \'post__in\', $post_ids );
}
}
add_action( \'pre_get_posts\', \'wpd_custom_search_query\', 10, 2 );
您不必担心分页,因为现在分页是自动进行的。如果您想为这些文件创建一个不同于post类型存档模板的特定模板,您可以
filter the template hierarchy 然后注入一个新的。只要检查一下
get_query_var(\'search_var\')
包含要知道的内容,您正在为其中一个搜索请求提供服务。