【问题标题】:Wordpress Custom Query with Custom Taxonomies - Pagination Bug带有自定义分类法的 Wordpress 自定义查询 - 分页错误
【发布时间】:2021-07-25 08:22:47
【问题描述】:

我创建了一个包含多个分类法的自定义查询,最重要的是我使用paginate_links 有分页到位。使用onchange="this.form.submit()" 的下拉选择表单正在选择分类法,以便能够过滤帖子,这只是一个临时解决方案,但目前可以正常工作,并且在这种情况下值得注意。

分页工作正常,选择分类术语时帖子可以正确显示,但是当我离开第一页并假设我转到第 2 页并在下拉选择器中选择不同的分类术语时,URL保留当前页码,并将选择器 ID 添加到其中。而我想要实现的是,当我在选择器中单击不同的分类时,新选择的分类查询会创建一个新 URL,以从该特定分类的第一页开始。

让我举一个例子来更清楚我上面的意思:

  1. 我从品牌选择器中选择分类术语“brand1”以显示与该分类术语相关的所有帖子

此时的 URL 是 mydomainname.com/?brandselector=brand1,到目前为止一切正常。

  1. 我通过分页转到第 2 页,现在 URL 看起来像这样:
    mydomainname.com/page/2/?brandselector=brand1

  2. 问题本身从这里开始:我在任何下拉选择器中单击不同的分类术语,如下所示:

现在,如果分类术语没有足够的帖子到达多个分页页面,我会得到一个空白页面,或者我会直接从第 2 页或我之前使用的任何其他数字看到新的帖子列表选定的分类术语。

网址现在看起来像这样: mydomainname.com/page/2/?brandselector=brand2

因此页码不会在新选择的分类术语上重置。

我的代码:

    global $wpdb, $post, $page;
    
    echo "<div class='entry-content'>";
    
    echo '<div class="filter-box">';
    
    echo '<form name="selectbrand" method="GET" style="width:200px;">';
    echo '<select id="brandselector" name="brandselector" onchange="this.form.submit()">';
      echo '<option value="">Select brand:</option>';
        $brands = get_terms(array(
                        'taxonomy' => 'brand',
                        'hide_empty' => true,
                        'orderby' => 'name',
                    ) );
       
    foreach ( $brands as $brand ) { ?>
    <?php echo '<option value="' . $brand->slug . '">' . $brand->name . '</option>';
            };
            echo '</select>';
            echo '</form>';
    
    echo '<form name="selectdrive" method="GET" style="width:200px;">';
    echo '<select id="driveselector" name="driveselector" onchange="this.form.submit()">';
      echo '<option value="">Select drive:</option>';
        $drives = get_terms(array(
                        'taxonomy' => 'drive_cat',
                        'hide_empty' => true,
                        'orderby' => 'name',
                    ) );
       
    foreach ( $drives as $drive ) { ?>
    <?php echo '<option value="' . $drive->slug . '">' . $drive->name . '</option>';
            };
            echo '</select>';
            echo '</form>';
            
    echo '</div>'; //filter-box
    
    
    if ( !empty( $_GET['driveselector'])){
        $term_id = $_GET['driveselector'];
        }
    
    
    if ( !empty( $_GET['brandselector'])){
        $term_id = $_GET['brandselector'];
        }
     
     //<-----------------<<<<Main Query start>>>>---------------------
       
       $main_args = array(
                'post_type'=> 'things',
                'orderby' => 'date',
                'order'   => 'DESC',
                'posts_per_page' => 5,
                'paged' => $page,
    );
    
     //<-----------------<<<<Main Query + Custom Query>>>>---------------------
    
    $taxquery = array();
    
    if ( !empty($term_id) || isset($term_id) ) {
        array_push($taxquery,array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'brand',
                'field' => 'slug',
                'terms' => $term_id
                ),
            array(
                'taxonomy' => 'drive_cat',
                'field' => 'slug',
                'terms' => $term_id
                )
            ));
    }
    
    if(!empty($taxquery)){
        $main_args['tax_query'] = $taxquery;
    }
    
    global $main_query;
    $main_query = new WP_Query( $main_args );

'<div class="content-box">';

  if ( $main_query->have_posts() ) :
   while ( $main_query->have_posts() ) : $main_query->the_post();

  //content start here

还有分页:

//<!-- end blog posts -->

endwhile;

echo '<div class="pagination">';
$total_pages = $main_query->max_num_pages;
if ($total_pages > 1){
    $current_page = max(1, get_query_var('page'));
       echo paginate_links(array(
            'base' => preg_replace('/\?.*/', '/', get_pagenum_link(1)) . '%_%',
            'current' => $current_page,
            'total' => $total_pages,
            'prev_text'    => __('« prev'),
            'next_text'    => __('next »'),
        ));
}    
echo '</div>';

wp_reset_postdata();

endif;

点击不同的分类术语时,我缺少什么来重置 URL?任何建议都将受到高度赞赏,如果我错误地使用了某些技术术语,我很抱歉,我仍在学习。谢谢。

【问题讨论】:

  • 我会将 paginate_links 切换为使用查询字符串作为页码,然后在 JS 中重置会容易得多

标签: php wordpress url pagination taxonomy


【解决方案1】:

由于您没有为form 元素定义action 属性,因此默认操作是转到当前网址。因此,一旦您使用分页超链接,下次表单将向该链接发送请求。设置 action 属性可以解决这个问题。

echo '<form action="/" name="selectdrive" method="GET" style="width:200px;">';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2014-01-09
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多