首页 > 解决方案 > 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;}

标签: wordpresssearch

解决方案


要解决 WP_Query 中的分页计算不正确可能出现的问题,您需要三个附加参数posts_per_pagepagedoffset

$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;}

推荐阅读