我使用的是pagenavi插件和按分类法和acf自定义字段进行的多重搜索。但是,pagenavi无法用于查询搜索。
add_filter( 'pre_get_posts','nt_custom_search_filter');
function nt_custom_search_filter( $query ) {
if( $query->is_search && !is_admin() ) {
if( isset($_GET['s'] ) ) {
$query->set( 'post_type', array( 'product' ) );// box text search
}
if( $query->is_main_query() ) {
$args[] = array( 'relation' => 'AND' );
if( isset( $_GET[ 'product_cat' ] ) && $_GET[ 'product_cat' ] != 'all' ) {
$args[] =
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $_GET['product_cat']
);
}$query->set( 'tax_query', $args );
$meta_query = array( 'relation' => 'AND' );
if( isset( $_GET[ 'status' ] ) && $_GET[ 'status' ] != 'all' ) {
$meta_query[] = array(
'key' => 'status',
'value' => $_GET['status'],
'compare' => '='
);
}
$query->set( 'meta_query', $meta_query );
}
}
return $query;}
要解决WP_Query中分页计算不正确的可能问题,您需要三个额外的参数:posts_per_page
、paged
和offset
在$count
中,我们保存每页的帖子数量,或者只使用您在wordpress后台设置的默认值。
$paged
告诉我们用户当前所在的页面
使用$offset
,您可以计算循环应该移动多少贡献。
因此,您可以在$query
中调整$args[]
。代码可能看起来像:
$count = get_option('posts_per_page', 25); // get 25 posts
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$offset = ($paged - 1) * $count;
$args = array (
'posts_per_page' => $count,
'paged' => $paged,
'offset' => $offset,
'relation' => 'AND'
.
. /* other arguments */
:
);
编辑:
因此您的代码可以如下所示。请注意,该代码未经过测试。
add_filter( 'pre_get_posts','nt_custom_search_filter');
function nt_custom_search_filter( $query ) {
if( $query->is_search && !is_admin() ) {
if( isset($_GET['s'] ) ) {
$query->set( 'post_type', array( 'product' ) );// box text search
}
if( $query->is_main_query() ) {
$count = get_option('posts_per_page', 25); // get 25 posts
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$offset = ($paged - 1) * $count;
$args[] = array( 'posts_per_page' => $count, 'paged' => $paged, 'offset' => $offset, 'relation' => 'AND' );
if( isset( $_GET[ 'product_cat' ] ) && $_GET[ 'product_cat' ] != 'all' ) {
$args[] =
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $_GET['product_cat']
);
}$query->set( 'tax_query', $args );
$meta_query = array( 'relation' => 'AND' );
if( isset( $_GET[ 'status' ] ) && $_GET[ 'status' ] != 'all' ) {
$meta_query[] = array(
'key' => 'status',
'value' => $_GET['status'],
'compare' => '='
);
}
$query->set( 'meta_query', $meta_query );
}
}
return $query;}