wordpress - Pagenavi 通过多字段搜索 wordpress
问题描述
我正在使用 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
你计算循环应该移动多少贡献。
所以你可以调整$args[]
你的$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'
.
. /* 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;}
推荐阅读
- c# - Azure 持久函数错误“当前未注册任何活动函数!”
- c++ - 如何在 OpenGL 窗口中选择对象?
- ios - Xcode General 选项卡中的“Embedded Binaries”和 Build Phases 选项卡中的“Embeded Frameworks”有什么区别?
- html - CSS flexbox 两列
- rendering - GitHub 页面存储库链接到自定义域,但内容未呈现
- ios - UIContextualAction 的标题未显示完整的文本
- google-chrome - 使用浏览器提供的语音 BotFramework 时如何更改默认语言
- python - Python:在 3d 矩阵中沿一个轴查找最大值,使非最大值为零
- r - 用于数据帧的 R SQLDF PIVOT
- node.js - 为什么我可以在我的 NodeJS 代码中添加第二个中间件而不添加 next() 方法